diff --git a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m index 8c97c7084..e7e4f0586 100644 --- a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m +++ b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m @@ -108,6 +108,32 @@ - (WKWebViewConfiguration*) createConfigurationFromSettings:(NSDictionary*)setti } configuration.allowsAirPlayForMediaPlayback = allowsAirPlayForMediaPlayback; + /* + * Sets Custom User Agents + * - (Default) "userAgent" is set the the clean user agent. + * E.g. + * UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" + * + * - If "OverrideUserAgent" is set, it will overwrite the entire "userAgent" value. The "AppendUserAgent" will be iggnored if set. + * Notice: The override logic is handled in the "pluginInitialize" method. + * E.g. + * OverrideUserAgent = "foobar" + * UserAgent = "foobar" + * + * - If "AppendUserAgent" is set and "OverrideUserAgent" is not set, the user defined "AppendUserAgent" will be appended to the "userAgent" + * E.g. + * AppendUserAgent = "foobar" + * UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 foobar" + */ + NSString *userAgent = configuration.applicationNameForUserAgent; + if ( + [settings cordovaSettingForKey:@"OverrideUserAgent"] == nil && + [settings cordovaSettingForKey:@"AppendUserAgent"] != nil + ) { + userAgent = [NSString stringWithFormat:@"%@ %@", userAgent, [settings cordovaSettingForKey:@"AppendUserAgent"]]; + } + configuration.applicationNameForUserAgent = userAgent; + return configuration; } @@ -149,9 +175,16 @@ - (void)pluginInitialize // re-create WKWebView, since we need to update configuration WKWebView* wkWebView = [[WKWebView alloc] initWithFrame:self.engineWebView.frame configuration:configuration]; wkWebView.UIDelegate = self.uiDelegate; - self.engineWebView = wkWebView; - wkWebView.customUserAgent = vc.userAgent; + /* + * This is where the "OverrideUserAgent" is handled. This will replace the entire UserAgent + * with the user defined custom UserAgent. + */ + if ([settings cordovaSettingForKey:@"OverrideUserAgent"] != nil) { + wkWebView.customUserAgent = [settings cordovaSettingForKey:@"OverrideUserAgent"]; + } + + self.engineWebView = wkWebView; if ([self.viewController conformsToProtocol:@protocol(WKUIDelegate)]) { wkWebView.UIDelegate = (id )self.viewController; @@ -425,9 +458,6 @@ - (void)webView:(WKWebView*)webView didStartProvisionalNavigation:(WKNavigation* - (void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation { - CDVViewController* vc = (CDVViewController*)self.viewController; - [CDVUserAgentUtil releaseLock:vc.userAgentLockToken]; - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPageDidLoadNotification object:webView]]; } @@ -439,7 +469,6 @@ - (void)webView:(WKWebView*)theWebView didFailProvisionalNavigation:(WKNavigatio - (void)webView:(WKWebView*)theWebView didFailNavigation:(WKNavigation*)navigation withError:(NSError*)error { CDVViewController* vc = (CDVViewController*)self.viewController; - [CDVUserAgentUtil releaseLock:vc.userAgentLockToken]; NSString* message = [NSString stringWithFormat:@"Failed to load webpage with error: %@", [error localizedDescription]]; NSLog(@"%@", message); diff --git a/CordovaLib/Classes/Public/CDV.h b/CordovaLib/Classes/Public/CDV.h index 3f22df16a..8706ef4aa 100644 --- a/CordovaLib/Classes/Public/CDV.h +++ b/CordovaLib/Classes/Public/CDV.h @@ -28,4 +28,3 @@ #import "CDVWhitelist.h" #import "CDVScreenOrientationDelegate.h" #import "CDVTimer.h" -#import "CDVUserAgentUtil.h" diff --git a/CordovaLib/Classes/Public/CDVCommandDelegate.h b/CordovaLib/Classes/Public/CDVCommandDelegate.h index c0ece71ad..ac82727a9 100644 --- a/CordovaLib/Classes/Public/CDVCommandDelegate.h +++ b/CordovaLib/Classes/Public/CDVCommandDelegate.h @@ -45,7 +45,5 @@ typedef NSURL* (^ UrlTransformerBlock)(NSURL*); - (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop; // Runs the given block on a background thread using a shared thread-pool. - (void)runInBackground:(void (^)(void))block; -// Returns the User-Agent of the associated WKWebView. -- (NSString*)userAgent; @end diff --git a/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m b/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m index d315072ca..649d30dbb 100644 --- a/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m +++ b/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m @@ -173,11 +173,6 @@ - (void)runInBackground:(void (^)(void))block dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block); } -- (NSString*)userAgent -{ - return [_viewController userAgent]; -} - - (NSDictionary*)settings { return _viewController.settings; diff --git a/CordovaLib/Classes/Public/CDVUserAgentUtil.h b/CordovaLib/Classes/Public/CDVUserAgentUtil.h deleted file mode 100644 index 4de382f0b..000000000 --- a/CordovaLib/Classes/Public/CDVUserAgentUtil.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import - -@interface CDVUserAgentUtil : NSObject -+ (NSString*)originalUserAgent; -+ (void)acquireLock:(void (^)(NSInteger lockToken))block; -+ (void)releaseLock:(NSInteger*)lockToken; -+ (void)setUserAgent:(NSString*)value lockToken:(NSInteger)lockToken; -@end diff --git a/CordovaLib/Classes/Public/CDVUserAgentUtil.m b/CordovaLib/Classes/Public/CDVUserAgentUtil.m deleted file mode 100644 index 1968a214f..000000000 --- a/CordovaLib/Classes/Public/CDVUserAgentUtil.m +++ /dev/null @@ -1,156 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -#import "CDVUserAgentUtil.h" - -#import - -// #define VerboseLog NSLog -#define VerboseLog(...) do {} while (0) - -static NSString* const kCdvUserAgentKey = @"Cordova-User-Agent"; -static NSString* const kCdvUserAgentVersionKey = @"Cordova-User-Agent-Version"; - -static NSString* gOriginalUserAgent = nil; -static NSInteger gNextLockToken = 0; -static NSInteger gCurrentLockToken = 0; -static NSMutableArray* gPendingSetUserAgentBlocks = nil; - -#import - -@interface WKWebView(SynchronousEvaluateJavaScript) -- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script; -@end - -@implementation WKWebView(SynchronousEvaluateJavaScript) - -- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script -{ - __block NSString *resultString = nil; - __block BOOL finished = NO; - - [self evaluateJavaScript:script completionHandler:^(id result, NSError *error) { - if (error == nil) { - if (result != nil) { - resultString = [NSString stringWithFormat:@"%@", result]; - } - } else { - NSLog(@"evaluateJavaScript error : %@", error.localizedDescription); - } - finished = YES; - }]; - - while (!finished) { - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - } - - return resultString; -} -@end - -@implementation CDVUserAgentUtil - -+ (NSString*)originalUserAgent -{ - if (gOriginalUserAgent == nil) { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppLocaleDidChange:) - name:NSCurrentLocaleDidChangeNotification object:nil]; - - NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; - NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; - NSString* localeStr = [[NSLocale currentLocale] localeIdentifier]; - // Record the model since simulator can change it without re-install (CB-5420). - NSString* model = [UIDevice currentDevice].model; - // Record the version of the app so that we can bust the cache when it changes (CB-10078) - NSString* appVersion = [[NSBundle mainBundle] infoDictionary][@"CFBundleVersion"]; - NSString* systemAndLocale = [NSString stringWithFormat:@"%@ %@ %@ %@", appVersion, model, systemVersion, localeStr]; - - NSString* cordovaUserAgentVersion = [userDefaults stringForKey:kCdvUserAgentVersionKey]; - gOriginalUserAgent = [userDefaults stringForKey:kCdvUserAgentKey]; - BOOL cachedValueIsOld = ![systemAndLocale isEqualToString:cordovaUserAgentVersion]; - - if ((gOriginalUserAgent == nil) || cachedValueIsOld) { - WKWebView* sampleWebView = [[WKWebView alloc] initWithFrame:CGRectZero]; - gOriginalUserAgent = [sampleWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; - - [userDefaults setObject:gOriginalUserAgent forKey:kCdvUserAgentKey]; - [userDefaults setObject:systemAndLocale forKey:kCdvUserAgentVersionKey]; - - [userDefaults synchronize]; - } - } - return gOriginalUserAgent; -} - -+ (void)onAppLocaleDidChange:(NSNotification*)notification -{ - // TODO: We should figure out how to update the user-agent of existing WKWebViews when this happens. - // Maybe use the PDF bug (noted in setUserAgent:). - gOriginalUserAgent = nil; -} - -+ (void)acquireLock:(void (^)(NSInteger lockToken))block -{ - if (gCurrentLockToken == 0) { - gCurrentLockToken = ++gNextLockToken; - VerboseLog(@"Gave lock %d", gCurrentLockToken); - block(gCurrentLockToken); - } else { - if (gPendingSetUserAgentBlocks == nil) { - gPendingSetUserAgentBlocks = [[NSMutableArray alloc] initWithCapacity:4]; - } - VerboseLog(@"Waiting for lock"); - [gPendingSetUserAgentBlocks addObject:block]; - } -} - -+ (void)releaseLock:(NSInteger*)lockToken -{ - if (lockToken == nil || *lockToken == 0) { - return; - } - NSAssert(gCurrentLockToken == *lockToken, @"Got token %ld, expected %ld", (long)*lockToken, (long)gCurrentLockToken); - - VerboseLog(@"Released lock %d", *lockToken); - if ([gPendingSetUserAgentBlocks count] > 0) { - void (^block)(NSInteger lockToken) = [gPendingSetUserAgentBlocks objectAtIndex:0]; - [gPendingSetUserAgentBlocks removeObjectAtIndex:0]; - gCurrentLockToken = ++gNextLockToken; - NSLog(@"Gave lock %ld", (long)gCurrentLockToken); - block(gCurrentLockToken); - } else { - gCurrentLockToken = 0; - } - *lockToken = 0; -} - -+ (void)setUserAgent:(NSString*)value lockToken:(NSInteger)lockToken -{ - NSAssert(gCurrentLockToken == lockToken, @"Got token %ld, expected %ld", (long)lockToken, (long)gCurrentLockToken); - VerboseLog(@"User-Agent set to: %@", value); - - // Setting the UserAgent must occur before a WKWebView is instantiated. - // It is read per instantiation, so it does not affect previously created views. - // Except! When a PDF is loaded, all currently active WKWebViews reload their - // User-Agent from the NSUserDefaults some time after the DidFinishLoad of the PDF bah! - NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:value, @"UserAgent", nil]; - [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; -} - -@end diff --git a/CordovaLib/Classes/Public/CDVViewController.h b/CordovaLib/Classes/Public/CDVViewController.h index 079fe907d..8586386be 100644 --- a/CordovaLib/Classes/Public/CDVViewController.h +++ b/CordovaLib/Classes/Public/CDVViewController.h @@ -34,7 +34,6 @@ id _commandDelegate; @protected CDVCommandQueue* _commandQueue; - NSString* _userAgent; } @property (nonatomic, readonly, weak) IBOutlet UIView* webView; @@ -52,29 +51,12 @@ @property (nonatomic, readonly, strong) id webViewEngine; @property (nonatomic, readonly, strong) id commandDelegate; -/** - The complete user agent that Cordova will use when sending web requests. - */ -@property (nonatomic, readonly) NSString* userAgent; - -/** - The base user agent data that Cordova will use to build its user agent. If this - property isn't set, Cordova will use the standard web view user agent as its - base. - */ -@property (nonatomic, readwrite, copy) NSString* baseUserAgent; - /** Takes/Gives an array of UIInterfaceOrientation (int) objects ex. UIInterfaceOrientationPortrait */ @property (nonatomic, readwrite, strong) NSArray* supportedOrientations; -/** - The address of the lock token used for controlling access to setting the user-agent - */ -@property (nonatomic, readonly) NSInteger* userAgentLockToken; - - (UIView*)newCordovaViewWithFrame:(CGRect)bounds; - (NSString*)appURLScheme; diff --git a/CordovaLib/Classes/Public/CDVViewController.m b/CordovaLib/Classes/Public/CDVViewController.m index 152ffdc7b..1b1f274a3 100644 --- a/CordovaLib/Classes/Public/CDVViewController.m +++ b/CordovaLib/Classes/Public/CDVViewController.m @@ -22,15 +22,12 @@ Licensed to the Apache Software Foundation (ASF) under one #import "CDVPlugin+Private.h" #import "CDVWebViewUIDelegate.h" #import "CDVConfigParser.h" -#import "CDVUserAgentUtil.h" #import #import "NSDictionary+CordovaPreferences.h" #import "CDVCommandDelegateImpl.h" #import -@interface CDVViewController () { - NSInteger _userAgentLockToken; -} +@interface CDVViewController () { } @property (nonatomic, readwrite, strong) NSXMLParser* configParser; @property (nonatomic, readwrite, strong) NSMutableDictionary* settings; @@ -50,7 +47,7 @@ @implementation CDVViewController @synthesize supportedOrientations; @synthesize pluginObjects, pluginsMap, startupPluginNames; @synthesize configParser, settings; -@synthesize wwwFolderName, startPage, initialized, openURL, baseUserAgent; +@synthesize wwwFolderName, startPage, initialized, openURL; @synthesize commandDelegate = _commandDelegate; @synthesize commandQueue = _commandQueue; @synthesize webViewEngine = _webViewEngine; @@ -306,30 +303,24 @@ - (void)viewDidLoad // ///////////////// NSURL* appURL = [self appUrl]; - __weak __typeof__(self) weakSelf = self; - - [CDVUserAgentUtil acquireLock:^(NSInteger lockToken) { - // Fix the memory leak caused by the strong reference. - [weakSelf setLockToken:lockToken]; - if (appURL) { - NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; - [self.webViewEngine loadRequest:appReq]; + + if (appURL) { + NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; + [self.webViewEngine loadRequest:appReq]; + } else { + NSString* loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage]; + NSLog(@"%@", loadErr); + + NSURL* errorUrl = [self errorURL]; + if (errorUrl) { + errorUrl = [NSURL URLWithString:[NSString stringWithFormat:@"?error=%@", [loadErr stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet]] relativeToURL:errorUrl]; + NSLog(@"%@", [errorUrl absoluteString]); + [self.webViewEngine loadRequest:[NSURLRequest requestWithURL:errorUrl]]; } else { - NSString* loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage]; - NSLog(@"%@", loadErr); - - NSURL* errorUrl = [self errorURL]; - if (errorUrl) { - errorUrl = [NSURL URLWithString:[NSString stringWithFormat:@"?error=%@", [loadErr stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet]] relativeToURL:errorUrl]; - NSLog(@"%@", [errorUrl absoluteString]); - [self.webViewEngine loadRequest:[NSURLRequest requestWithURL:errorUrl]]; - } else { - NSString* html = [NSString stringWithFormat:@" %@ ", loadErr]; - [self.webViewEngine loadHTMLString:html baseURL:nil]; - } + NSString* html = [NSString stringWithFormat:@" %@ ", loadErr]; + [self.webViewEngine loadHTMLString:html baseURL:nil]; } - }]; - + } // ///////////////// NSString* bgColorString = [self.settings cordovaSettingForKey:@"BackgroundColor"]; @@ -337,12 +328,6 @@ - (void)viewDidLoad [self.webView setBackgroundColor:bgColor]; } -- (void)setLockToken:(NSInteger)lockToken -{ - _userAgentLockToken = lockToken; - [CDVUserAgentUtil setUserAgent:self.userAgent lockToken:lockToken]; -} - -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -525,30 +510,6 @@ - (UIView*)newCordovaViewWithFrame:(CGRect)bounds return self.webViewEngine.engineWebView; } -- (NSString*)userAgent -{ - if (_userAgent != nil) { - return _userAgent; - } - - NSString* localBaseUserAgent; - if (self.baseUserAgent != nil) { - localBaseUserAgent = self.baseUserAgent; - } else if ([self.settings cordovaSettingForKey:@"OverrideUserAgent"] != nil) { - localBaseUserAgent = [self.settings cordovaSettingForKey:@"OverrideUserAgent"]; - } else { - localBaseUserAgent = [CDVUserAgentUtil originalUserAgent]; - } - NSString* appendUserAgent = [self.settings cordovaSettingForKey:@"AppendUserAgent"]; - if (appendUserAgent) { - _userAgent = [NSString stringWithFormat:@"%@ %@", localBaseUserAgent, appendUserAgent]; - } else { - // Use our address as a unique number to append to the User-Agent. - _userAgent = localBaseUserAgent; - } - return _userAgent; -} - - (void)createGapView { CGRect webViewBounds = self.view.bounds; @@ -779,7 +740,6 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; - [CDVUserAgentUtil releaseLock:&_userAgentLockToken]; [_commandQueue dispose]; [[self.pluginObjects allValues] makeObjectsPerformSelector:@selector(dispose)]; @@ -789,9 +749,4 @@ - (void)dealloc self.webViewEngine = nil; } -- (NSInteger*)userAgentLockToken -{ - return &_userAgentLockToken; -} - @end diff --git a/CordovaLib/Cordova/Cordova.h b/CordovaLib/Cordova/Cordova.h index ecec02b4a..62675ac7c 100644 --- a/CordovaLib/Cordova/Cordova.h +++ b/CordovaLib/Cordova/Cordova.h @@ -47,4 +47,3 @@ FOUNDATION_EXPORT const unsigned char CordovaVersionString[]; #import #import #import -#import diff --git a/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/CordovaLib/CordovaLib.xcodeproj/project.pbxproj index 7176b0935..f19717e0a 100644 --- a/CordovaLib/CordovaLib.xcodeproj/project.pbxproj +++ b/CordovaLib/CordovaLib.xcodeproj/project.pbxproj @@ -49,8 +49,6 @@ 7ED95D491AB9029B008C4574 /* CDVScreenOrientationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D4A1AB9029B008C4574 /* CDVTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D241AB9029B008C4574 /* CDVTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D4B1AB9029B008C4574 /* CDVTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D251AB9029B008C4574 /* CDVTimer.m */; }; - 7ED95D4E1AB9029B008C4574 /* CDVUserAgentUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D281AB9029B008C4574 /* CDVUserAgentUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7ED95D4F1AB9029B008C4574 /* CDVUserAgentUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D291AB9029B008C4574 /* CDVUserAgentUtil.m */; }; 7ED95D501AB9029B008C4574 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7ED95D511AB9029B008C4574 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */; }; 7ED95D521AB9029B008C4574 /* CDVWebViewEngineProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -69,7 +67,6 @@ 9052DE772150D040008E83D4 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D201AB9029B008C4574 /* CDVPlugin.m */; }; 9052DE782150D040008E83D4 /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */; }; 9052DE792150D040008E83D4 /* CDVTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D251AB9029B008C4574 /* CDVTimer.m */; }; - 9052DE7B2150D040008E83D4 /* CDVUserAgentUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D291AB9029B008C4574 /* CDVUserAgentUtil.m */; }; 9052DE7C2150D040008E83D4 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */; }; 9052DE7D2150D040008E83D4 /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */; }; 9052DE7E2150D040008E83D4 /* NSDictionary+CordovaPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */; }; @@ -103,7 +100,6 @@ C0C01EC61E39131A0056E6CB /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D211AB9029B008C4574 /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01EC71E39131A0056E6CB /* CDVScreenOrientationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01EC81E39131A0056E6CB /* CDVTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D241AB9029B008C4574 /* CDVTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C0C01ECA1E39131A0056E6CB /* CDVUserAgentUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D281AB9029B008C4574 /* CDVUserAgentUtil.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECB1E39131A0056E6CB /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECC1E39131A0056E6CB /* CDVWebViewEngineProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; C0C01ECD1E39131A0056E6CB /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -154,8 +150,6 @@ 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVScreenOrientationDelegate.h; sourceTree = ""; }; 7ED95D241AB9029B008C4574 /* CDVTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVTimer.h; sourceTree = ""; }; 7ED95D251AB9029B008C4574 /* CDVTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVTimer.m; sourceTree = ""; }; - 7ED95D281AB9029B008C4574 /* CDVUserAgentUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVUserAgentUtil.h; sourceTree = ""; }; - 7ED95D291AB9029B008C4574 /* CDVUserAgentUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVUserAgentUtil.m; sourceTree = ""; }; 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVViewController.h; sourceTree = ""; }; 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVViewController.m; sourceTree = ""; }; 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWebViewEngineProtocol.h; sourceTree = ""; }; @@ -302,8 +296,6 @@ 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */, 7ED95D241AB9029B008C4574 /* CDVTimer.h */, 7ED95D251AB9029B008C4574 /* CDVTimer.m */, - 7ED95D281AB9029B008C4574 /* CDVUserAgentUtil.h */, - 7ED95D291AB9029B008C4574 /* CDVUserAgentUtil.m */, 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */, 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */, 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */, @@ -360,7 +352,6 @@ C0C01EC61E39131A0056E6CB /* CDVPluginResult.h in Headers */, C0C01EC71E39131A0056E6CB /* CDVScreenOrientationDelegate.h in Headers */, C0C01EC81E39131A0056E6CB /* CDVTimer.h in Headers */, - C0C01ECA1E39131A0056E6CB /* CDVUserAgentUtil.h in Headers */, C0C01ECB1E39131A0056E6CB /* CDVViewController.h in Headers */, C0C01ECC1E39131A0056E6CB /* CDVWebViewEngineProtocol.h in Headers */, C0C01ECD1E39131A0056E6CB /* CDVWhitelist.h in Headers */, @@ -398,7 +389,6 @@ 7ED95D491AB9029B008C4574 /* CDVScreenOrientationDelegate.h in Headers */, 4E23F8FC23E16E96006CD852 /* CDVWebViewUIDelegate.h in Headers */, 7ED95D4A1AB9029B008C4574 /* CDVTimer.h in Headers */, - 7ED95D4E1AB9029B008C4574 /* CDVUserAgentUtil.h in Headers */, 7ED95D501AB9029B008C4574 /* CDVViewController.h in Headers */, 7ED95D521AB9029B008C4574 /* CDVWebViewEngineProtocol.h in Headers */, 4E23F90023E16E96006CD852 /* CDVWebViewEngine.h in Headers */, @@ -502,7 +492,6 @@ 9052DE772150D040008E83D4 /* CDVPlugin.m in Sources */, 9052DE782150D040008E83D4 /* CDVPluginResult.m in Sources */, 9052DE792150D040008E83D4 /* CDVTimer.m in Sources */, - 9052DE7B2150D040008E83D4 /* CDVUserAgentUtil.m in Sources */, 9052DE7C2150D040008E83D4 /* CDVViewController.m in Sources */, 9052DE7D2150D040008E83D4 /* CDVWhitelist.m in Sources */, 9052DE7E2150D040008E83D4 /* NSDictionary+CordovaPreferences.m in Sources */, @@ -531,7 +520,6 @@ 7ED95D4B1AB9029B008C4574 /* CDVTimer.m in Sources */, 4E23F8FE23E16E96006CD852 /* CDVWebViewEngine.m in Sources */, 4E23F8FB23E16E96006CD852 /* CDVWebViewProcessPoolFactory.m in Sources */, - 7ED95D4F1AB9029B008C4574 /* CDVUserAgentUtil.m in Sources */, 7ED95D511AB9029B008C4574 /* CDVViewController.m in Sources */, 7ED95D541AB9029B008C4574 /* CDVWhitelist.m in Sources */, 7ED95D581AB9029B008C4574 /* NSDictionary+CordovaPreferences.m in Sources */,