You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/07/05 14:47:48 UTC
[07/51] [partial] Merge master2->master
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/CDVViewController.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVViewController.m b/lib/cordova-ios/CordovaLib/Classes/CDVViewController.m
deleted file mode 100644
index 94f4552..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/CDVViewController.m
+++ /dev/null
@@ -1,933 +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 <objc/message.h>
-#import "CDV.h"
-#import "CDVCommandDelegateImpl.h"
-#import "CDVConfigParser.h"
-#import "CDVUserAgentUtil.h"
-#import "CDVWebViewDelegate.h"
-
-#define degreesToRadian(x) (M_PI * (x) / 180.0)
-
-@interface CDVViewController () {
- NSInteger _userAgentLockToken;
- CDVWebViewDelegate* _webViewDelegate;
-}
-
-@property (nonatomic, readwrite, strong) NSXMLParser* configParser;
-@property (nonatomic, readwrite, strong) NSMutableDictionary* settings;
-@property (nonatomic, readwrite, strong) CDVWhitelist* whitelist;
-@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginObjects;
-@property (nonatomic, readwrite, strong) NSArray* startupPluginNames;
-@property (nonatomic, readwrite, strong) NSDictionary* pluginsMap;
-@property (nonatomic, readwrite, strong) NSArray* supportedOrientations;
-@property (nonatomic, readwrite, assign) BOOL loadFromString;
-
-@property (readwrite, assign) BOOL initialized;
-
-@property (atomic, strong) NSURL* openURL;
-
-@end
-
-@implementation CDVViewController
-
-@synthesize webView, supportedOrientations;
-@synthesize pluginObjects, pluginsMap, whitelist, startupPluginNames;
-@synthesize configParser, settings, loadFromString;
-@synthesize useSplashScreen;
-@synthesize wwwFolderName, startPage, initialized, openURL;
-@synthesize commandDelegate = _commandDelegate;
-@synthesize commandQueue = _commandQueue;
-
-- (void)__init
-{
- if ((self != nil) && !self.initialized) {
- _commandQueue = [[CDVCommandQueue alloc] initWithViewController:self];
- _commandDelegate = [[CDVCommandDelegateImpl alloc] initWithViewController:self];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillTerminate:)
- name:UIApplicationWillTerminateNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillResignActive:)
- name:UIApplicationWillResignActiveNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidBecomeActive:)
- name:UIApplicationDidBecomeActiveNotification object:nil];
-
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillEnterForeground:)
- name:UIApplicationWillEnterForegroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidEnterBackground:)
- name:UIApplicationDidEnterBackgroundNotification object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:CDVPluginHandleOpenURLNotification object:nil];
-
- // read from UISupportedInterfaceOrientations (or UISupportedInterfaceOrientations~iPad, if its iPad) from -Info.plist
- self.supportedOrientations = [self parseInterfaceOrientations:
- [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"]];
-
- [self printMultitaskingInfo];
- [self printDeprecationNotice];
- self.initialized = YES;
-
- // load config.xml settings
- [self loadSettings];
- useSplashScreen = YES;
- }
-}
-
-- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
-{
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- [self __init];
- return self;
-}
-
-- (id)init
-{
- self = [super init];
- [self __init];
- return self;
-}
-
-- (void)viewWillAppear:(BOOL)animated
-{
- [super viewWillAppear:animated];
-
- NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
- [nc addObserver:self
- selector:@selector(keyboardWillShowOrHide:)
- name:UIKeyboardWillShowNotification
- object:nil];
- [nc addObserver:self
- selector:@selector(keyboardWillShowOrHide:)
- name:UIKeyboardWillHideNotification
- object:nil];
-}
-
-- (void)viewWillDisappear:(BOOL)animated
-{
- [super viewWillDisappear:animated];
-
- NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
- [nc removeObserver:self name:UIKeyboardWillShowNotification object:nil];
- [nc removeObserver:self name:UIKeyboardWillHideNotification object:nil];
-}
-
-- (void)keyboardWillShowOrHide:(NSNotification*)notif
-{
- if (![@"true" isEqualToString : self.settings[@"KeyboardShrinksView"]]) {
- return;
- }
- BOOL showEvent = [notif.name isEqualToString:UIKeyboardWillShowNotification];
-
- CGRect keyboardFrame = [notif.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
- keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil];
-
- CGRect newFrame = self.view.bounds;
- if (showEvent) {
- newFrame.size.height -= keyboardFrame.size.height;
- }
- self.webView.frame = newFrame;
- self.webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, -keyboardFrame.size.height, 0);
-}
-
-- (void)printDeprecationNotice
-{
- if (!IsAtLeastiOSVersion(@"5.0")) {
- NSLog(@"CRITICAL: For Cordova 2.0, you will need to upgrade to at least iOS 5.0 or greater. Your current version of iOS is %@.",
- [[UIDevice currentDevice] systemVersion]
- );
- }
-}
-
-- (void)printMultitaskingInfo
-{
- UIDevice* device = [UIDevice currentDevice];
- BOOL backgroundSupported = NO;
-
- if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
- backgroundSupported = device.multitaskingSupported;
- }
-
- NSNumber* exitsOnSuspend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIApplicationExitsOnSuspend"];
- if (exitsOnSuspend == nil) { // if it's missing, it should be NO (i.e. multi-tasking on by default)
- exitsOnSuspend = [NSNumber numberWithBool:NO];
- }
-
- NSLog(@"Multi-tasking -> Device: %@, App: %@", (backgroundSupported ? @"YES" : @"NO"), (![exitsOnSuspend intValue]) ? @"YES" : @"NO");
-}
-
-- (BOOL)URLisAllowed:(NSURL*)url
-{
- if (self.whitelist == nil) {
- return YES;
- }
-
- return [self.whitelist URLIsAllowed:url];
-}
-
-- (void)loadSettings
-{
- CDVConfigParser* delegate = [[CDVConfigParser alloc] init];
-
- // read from config.xml in the app bundle
- NSString* path = [[NSBundle mainBundle] pathForResource:@"config" ofType:@"xml"];
-
- if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
- NSAssert(NO, @"ERROR: config.xml does not exist. Please run cordova-ios/bin/cordova_plist_to_config_xml path/to/project.");
- return;
- }
-
- NSURL* url = [NSURL fileURLWithPath:path];
-
- configParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
- if (configParser == nil) {
- NSLog(@"Failed to initialize XML parser.");
- return;
- }
- [configParser setDelegate:((id < NSXMLParserDelegate >)delegate)];
- [configParser parse];
-
- // Get the plugin dictionary, whitelist and settings from the delegate.
- self.pluginsMap = delegate.pluginsDict;
- self.startupPluginNames = delegate.startupPluginNames;
- self.whitelist = [[CDVWhitelist alloc] initWithArray:delegate.whitelistHosts];
- self.settings = delegate.settings;
-
- // And the start folder/page.
- self.wwwFolderName = @"www";
- self.startPage = delegate.startPage;
- if (self.startPage == nil) {
- self.startPage = @"index.html";
- }
-
- // Initialize the plugin objects dict.
- self.pluginObjects = [[NSMutableDictionary alloc] initWithCapacity:20];
-}
-
-// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
-- (void)viewDidLoad
-{
- [super viewDidLoad];
-
- NSURL* appURL = nil;
- NSString* loadErr = nil;
-
- if ([self.startPage rangeOfString:@"://"].location != NSNotFound) {
- appURL = [NSURL URLWithString:self.startPage];
- } else if ([self.wwwFolderName rangeOfString:@"://"].location != NSNotFound) {
- appURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", self.wwwFolderName, self.startPage]];
- } else {
- NSString* startFilePath = [self.commandDelegate pathForResource:self.startPage];
- if (startFilePath == nil) {
- loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage];
- NSLog(@"%@", loadErr);
- self.loadFromString = YES;
- appURL = nil;
- } else {
- appURL = [NSURL fileURLWithPath:startFilePath];
- }
- }
-
- // // Fix the iOS 5.1 SECURITY_ERR bug (CB-347), this must be before the webView is instantiated ////
-
- NSString* backupWebStorageType = @"cloud"; // default value
-
- id backupWebStorage = self.settings[@"BackupWebStorage"];
- if ([backupWebStorage isKindOfClass:[NSString class]]) {
- backupWebStorageType = backupWebStorage;
- }
- self.settings[@"BackupWebStorage"] = backupWebStorageType;
-
- if (IsAtLeastiOSVersion(@"5.1")) {
- [CDVLocalStorage __fixupDatabaseLocationsWithBackupType:backupWebStorageType];
- }
-
- // // Instantiate the WebView ///////////////
-
- [self createGapView];
-
- // /////////////////
-
- NSNumber* enableLocation = [self.settings objectForKey:@"EnableLocation"];
- NSString* enableViewportScale = [self.settings objectForKey:@"EnableViewportScale"];
- NSNumber* allowInlineMediaPlayback = [self.settings objectForKey:@"AllowInlineMediaPlayback"];
- BOOL mediaPlaybackRequiresUserAction = YES; // default value
- if ([self.settings objectForKey:@"MediaPlaybackRequiresUserAction"]) {
- mediaPlaybackRequiresUserAction = [(NSNumber*)[settings objectForKey:@"MediaPlaybackRequiresUserAction"] boolValue];
- }
- BOOL hideKeyboardFormAccessoryBar = NO; // default value
- if ([self.settings objectForKey:@"HideKeyboardFormAccessoryBar"]) {
- hideKeyboardFormAccessoryBar = [(NSNumber*)[settings objectForKey:@"HideKeyboardFormAccessoryBar"] boolValue];
- }
-
- self.webView.scalesPageToFit = [enableViewportScale boolValue];
-
- /*
- * Fire up the GPS Service right away as it takes a moment for data to come back.
- */
-
- if ([enableLocation boolValue]) {
- NSLog(@"Deprecated: The 'EnableLocation' boolean property is deprecated in 2.5.0, and will be removed in 3.0.0. Use the 'onload' boolean attribute (of the CDVLocation plugin.");
- [[self.commandDelegate getCommandInstance:@"Geolocation"] getLocation:[CDVInvokedUrlCommand new]];
- }
-
- if (hideKeyboardFormAccessoryBar) {
- __weak CDVViewController* weakSelf = self;
- [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification
- object:nil
- queue:[NSOperationQueue mainQueue]
- usingBlock:^(NSNotification* notification) {
- // we can't hide it here because the accessory bar hasn't been created yet, so we delay on the queue
- [weakSelf performSelector:@selector(hideKeyboardFormAccessoryBar) withObject:nil afterDelay:0];
- }];
- }
-
- /*
- * Fire up CDVLocalStorage to work-around WebKit storage limitations: on all iOS 5.1+ versions for local-only backups, but only needed on iOS 5.1 for cloud backup.
- */
- if (IsAtLeastiOSVersion(@"5.1") && (([backupWebStorageType isEqualToString:@"local"]) ||
- ([backupWebStorageType isEqualToString:@"cloud"] && !IsAtLeastiOSVersion(@"6.0")))) {
- [self registerPlugin:[[CDVLocalStorage alloc] initWithWebView:self.webView] withClassName:NSStringFromClass([CDVLocalStorage class])];
- }
-
- /*
- * This is for iOS 4.x, where you can allow inline <video> and <audio>, and also autoplay them
- */
- if ([allowInlineMediaPlayback boolValue] && [self.webView respondsToSelector:@selector(allowsInlineMediaPlayback)]) {
- self.webView.allowsInlineMediaPlayback = YES;
- }
- if ((mediaPlaybackRequiresUserAction == NO) && [self.webView respondsToSelector:@selector(mediaPlaybackRequiresUserAction)]) {
- self.webView.mediaPlaybackRequiresUserAction = NO;
- }
-
- // By default, overscroll bouncing is allowed.
- // UIWebViewBounce has been renamed to DisallowOverscroll, but both are checked.
- BOOL bounceAllowed = YES;
- NSNumber* disallowOverscroll = [self.settings objectForKey:@"DisallowOverscroll"];
- if (disallowOverscroll == nil) {
- NSNumber* bouncePreference = [self.settings objectForKey:@"UIWebViewBounce"];
- bounceAllowed = (bouncePreference == nil || [bouncePreference boolValue]);
- } else {
- bounceAllowed = ![disallowOverscroll boolValue];
- }
-
- // prevent webView from bouncing
- // based on the DisallowOverscroll/UIWebViewBounce key in config.xml
- if (!bounceAllowed) {
- if ([self.webView respondsToSelector:@selector(scrollView)]) {
- ((UIScrollView*)[self.webView scrollView]).bounces = NO;
- } else {
- for (id subview in self.webView.subviews) {
- if ([[subview class] isSubclassOfClass:[UIScrollView class]]) {
- ((UIScrollView*)subview).bounces = NO;
- }
- }
- }
- }
-
- /*
- * iOS 6.0 UIWebView properties
- */
- if (IsAtLeastiOSVersion(@"6.0")) {
- BOOL keyboardDisplayRequiresUserAction = YES; // KeyboardDisplayRequiresUserAction - defaults to YES
- if ([self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"] != nil) {
- if ([self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"]) {
- keyboardDisplayRequiresUserAction = [(NSNumber*)[self.settings objectForKey:@"KeyboardDisplayRequiresUserAction"] boolValue];
- }
- }
-
- // property check for compiling under iOS < 6
- if ([self.webView respondsToSelector:@selector(setKeyboardDisplayRequiresUserAction:)]) {
- [self.webView setValue:[NSNumber numberWithBool:keyboardDisplayRequiresUserAction] forKey:@"keyboardDisplayRequiresUserAction"];
- }
-
- BOOL suppressesIncrementalRendering = NO; // SuppressesIncrementalRendering - defaults to NO
- if ([self.settings objectForKey:@"SuppressesIncrementalRendering"] != nil) {
- if ([self.settings objectForKey:@"SuppressesIncrementalRendering"]) {
- suppressesIncrementalRendering = [(NSNumber*)[self.settings objectForKey:@"SuppressesIncrementalRendering"] boolValue];
- }
- }
-
- // property check for compiling under iOS < 6
- if ([self.webView respondsToSelector:@selector(setSuppressesIncrementalRendering:)]) {
- [self.webView setValue:[NSNumber numberWithBool:suppressesIncrementalRendering] forKey:@"suppressesIncrementalRendering"];
- }
- }
-
- if ([self.startupPluginNames count] > 0) {
- [CDVTimer start:@"TotalPluginStartup"];
-
- for (NSString* pluginName in self.startupPluginNames) {
- [CDVTimer start:pluginName];
- [self getCommandInstance:pluginName];
- [CDVTimer stop:pluginName];
- }
-
- [CDVTimer stop:@"TotalPluginStartup"];
- }
-
- // TODO: Remove this explicit instantiation once we move to cordova-CLI.
- if (useSplashScreen) {
- [self getCommandInstance:@"splashscreen"];
- }
-
- // /////////////////
- [CDVUserAgentUtil acquireLock:^(NSInteger lockToken) {
- _userAgentLockToken = lockToken;
- [CDVUserAgentUtil setUserAgent:self.userAgent lockToken:lockToken];
- if (!loadErr) {
- NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
- [self.webView loadRequest:appReq];
- } else {
- NSString* html = [NSString stringWithFormat:@"<html><body> %@ </body></html>", loadErr];
- [self.webView loadHTMLString:html baseURL:nil];
- }
- }];
-}
-
-- (void)hideKeyboardFormAccessoryBar
-{
- NSArray* windows = [[UIApplication sharedApplication] windows];
-
- for (UIWindow* window in windows) {
- for (UIView* view in window.subviews) {
- if ([[view description] hasPrefix:@"<UIPeripheralHostView"]) {
- for (UIView* peripheralView in view.subviews) {
- // hides the accessory bar
- if ([[peripheralView description] hasPrefix:@"<UIWebFormAccessory"]) {
- // remove the extra scroll space for the form accessory bar
- CGRect newFrame = self.webView.scrollView.frame;
- newFrame.size.height += peripheralView.frame.size.height;
- self.webView.scrollView.frame = newFrame;
-
- // remove the form accessory bar
- [peripheralView removeFromSuperview];
- }
- // hides the thin grey line used to adorn the bar (iOS 6)
- if ([[peripheralView description] hasPrefix:@"<UIImageView"]) {
- [[peripheralView layer] setOpacity:0.0];
- }
- }
- }
- }
- }
-}
-
-- (NSArray*)parseInterfaceOrientations:(NSArray*)orientations
-{
- NSMutableArray* result = [[NSMutableArray alloc] init];
-
- if (orientations != nil) {
- NSEnumerator* enumerator = [orientations objectEnumerator];
- NSString* orientationString;
-
- while (orientationString = [enumerator nextObject]) {
- if ([orientationString isEqualToString:@"UIInterfaceOrientationPortrait"]) {
- [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]];
- } else if ([orientationString isEqualToString:@"UIInterfaceOrientationPortraitUpsideDown"]) {
- [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown]];
- } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeLeft"]) {
- [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]];
- } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeRight"]) {
- [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]];
- }
- }
- }
-
- // default
- if ([result count] == 0) {
- [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]];
- }
-
- return result;
-}
-
-- (NSInteger)mapIosOrientationToJsOrientation:(UIInterfaceOrientation)orientation
-{
- switch (orientation) {
- case UIInterfaceOrientationPortraitUpsideDown:
- return 180;
-
- case UIInterfaceOrientationLandscapeLeft:
- return -90;
-
- case UIInterfaceOrientationLandscapeRight:
- return 90;
-
- case UIInterfaceOrientationPortrait:
- return 0;
-
- default:
- return 0;
- }
-}
-
-- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
-{
- // First, ask the webview via JS if it supports the new orientation
- NSString* jsCall = [NSString stringWithFormat:
- @"window.shouldRotateToOrientation && window.shouldRotateToOrientation(%d);"
- , [self mapIosOrientationToJsOrientation:interfaceOrientation]];
- NSString* res = [webView stringByEvaluatingJavaScriptFromString:jsCall];
-
- if ([res length] > 0) {
- return [res boolValue];
- }
-
- // if js did not handle the new orientation (no return value), use values from the plist (via supportedOrientations)
- return [self supportsOrientation:interfaceOrientation];
-}
-
-- (BOOL)shouldAutorotate
-{
- return YES;
-}
-
-- (NSUInteger)supportedInterfaceOrientations
-{
- NSUInteger ret = 0;
-
- if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortrait]) {
- ret = ret | (1 << UIInterfaceOrientationPortrait);
- }
- if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortraitUpsideDown]) {
- ret = ret | (1 << UIInterfaceOrientationPortraitUpsideDown);
- }
- if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight]) {
- ret = ret | (1 << UIInterfaceOrientationLandscapeRight);
- }
- if ([self shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft]) {
- ret = ret | (1 << UIInterfaceOrientationLandscapeLeft);
- }
-
- return ret;
-}
-
-- (BOOL)supportsOrientation:(UIInterfaceOrientation)orientation
-{
- return [self.supportedOrientations containsObject:[NSNumber numberWithInt:orientation]];
-}
-
-- (UIWebView*)newCordovaViewWithFrame:(CGRect)bounds
-{
- return [[UIWebView alloc] initWithFrame:bounds];
-}
-
-- (NSString*)userAgent
-{
- if (_userAgent == nil) {
- NSString* originalUserAgent = [CDVUserAgentUtil originalUserAgent];
- // Use our address as a unique number to append to the User-Agent.
- _userAgent = [NSString stringWithFormat:@"%@ (%lld)", originalUserAgent, (long long)self];
- }
- return _userAgent;
-}
-
-- (void)createGapView
-{
- CGRect webViewBounds = self.view.bounds;
-
- webViewBounds.origin = self.view.bounds.origin;
-
- if (!self.webView) {
- self.webView = [self newCordovaViewWithFrame:webViewBounds];
- self.webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
-
- [self.view addSubview:self.webView];
- [self.view sendSubviewToBack:self.webView];
-
- _webViewDelegate = [[CDVWebViewDelegate alloc] initWithDelegate:self];
- self.webView.delegate = _webViewDelegate;
-
- // register this viewcontroller with the NSURLProtocol, only after the User-Agent is set
- [CDVURLProtocol registerViewController:self];
- }
-}
-
-- (void)didReceiveMemoryWarning
-{
- // iterate through all the plugin objects, and call hasPendingOperation
- // if at least one has a pending operation, we don't call [super didReceiveMemoryWarning]
-
- NSEnumerator* enumerator = [self.pluginObjects objectEnumerator];
- CDVPlugin* plugin;
-
- BOOL doPurge = YES;
-
- while ((plugin = [enumerator nextObject])) {
- if (plugin.hasPendingOperation) {
- NSLog(@"Plugin '%@' has a pending operation, memory purge is delayed for didReceiveMemoryWarning.", NSStringFromClass([plugin class]));
- doPurge = NO;
- }
- }
-
- if (doPurge) {
- // Releases the view if it doesn't have a superview.
- [super didReceiveMemoryWarning];
- }
-
- // Release any cached data, images, etc. that aren't in use.
-}
-
-- (void)viewDidUnload
-{
- // Release any retained subviews of the main view.
- // e.g. self.myOutlet = nil;
-
- self.webView.delegate = nil;
- self.webView = nil;
- [CDVUserAgentUtil releaseLock:&_userAgentLockToken];
-}
-
-#pragma mark UIWebViewDelegate
-
-/**
- When web application loads Add stuff to the DOM, mainly the user-defined settings from the Settings.plist file, and
- the device's data such as device ID, platform version, etc.
- */
-- (void)webViewDidStartLoad:(UIWebView*)theWebView
-{
- NSLog(@"Resetting plugins due to page load.");
- [_commandQueue resetRequestId];
- [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginResetNotification object:self.webView]];
-}
-
-/**
- Called when the webview finishes loading. This stops the activity view.
- */
-- (void)webViewDidFinishLoad:(UIWebView*)theWebView
-{
- NSLog(@"Finished load of: %@", theWebView.request.URL);
- // It's safe to release the lock even if this is just a sub-frame that's finished loading.
- [CDVUserAgentUtil releaseLock:&_userAgentLockToken];
-
- /*
- * Hide the Top Activity THROBBER in the Battery Bar
- */
- [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
-
- [self processOpenUrl];
-
- [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPageDidLoadNotification object:self.webView]];
-}
-
-- (void)webView:(UIWebView*)theWebView didFailLoadWithError:(NSError*)error
-{
- [CDVUserAgentUtil releaseLock:&_userAgentLockToken];
-
- NSLog(@"Failed to load webpage with error: %@", [error localizedDescription]);
-}
-
-- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
-{
- NSURL* url = [request URL];
-
- /*
- * Execute any commands queued with cordova.exec() on the JS side.
- * The part of the URL after gap:// is irrelevant.
- */
- if ([[url scheme] isEqualToString:@"gap"]) {
- [_commandQueue fetchCommandsFromJs];
- return NO;
- }
-
- /*
- * If a URL is being loaded that's a file/http/https URL, just load it internally
- */
- else if ([url isFileURL]) {
- return YES;
- }
-
- /*
- * If we loaded the HTML from a string, we let the app handle it
- */
- else if (self.loadFromString == YES) {
- self.loadFromString = NO;
- return YES;
- }
-
- /*
- * all tel: scheme urls we let the UIWebview handle it using the default behavior
- */
- else if ([[url scheme] isEqualToString:@"tel"]) {
- return YES;
- }
-
- /*
- * all about: scheme urls are not handled
- */
- else if ([[url scheme] isEqualToString:@"about"]) {
- return NO;
- }
-
- /*
- * all data: scheme urls are handled
- */
- else if ([[url scheme] isEqualToString:@"data"]) {
- return YES;
- }
-
- /*
- * Handle all other types of urls (tel:, sms:), and requests to load a url in the main webview.
- */
- else {
- if ([self.whitelist schemeIsAllowed:[url scheme]]) {
- return [self.whitelist URLIsAllowed:url];
- } else {
- if ([[UIApplication sharedApplication] canOpenURL:url]) {
- [[UIApplication sharedApplication] openURL:url];
- } else { // handle any custom schemes to plugins
- [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]];
- }
- }
-
- return NO;
- }
-
- return YES;
-}
-
-#pragma mark GapHelpers
-
-- (void)javascriptAlert:(NSString*)text
-{
- NSString* jsString = [NSString stringWithFormat:@"alert('%@');", text];
-
- [self.commandDelegate evalJs:jsString];
-}
-
-+ (NSString*)resolveImageResource:(NSString*)resource
-{
- NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
- BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending);
-
- // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path
- if (isLessThaniOS4) {
- if (CDV_IsIPad()) {
- return [NSString stringWithFormat:@"%@~ipad.png", resource];
- } else {
- return [NSString stringWithFormat:@"%@.png", resource];
- }
- }
-
- return resource;
-}
-
-+ (NSString*)applicationDocumentsDirectory
-{
- NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString* basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
-
- return basePath;
-}
-
-#pragma mark CordovaCommands
-
-- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className
-{
- if ([plugin respondsToSelector:@selector(setViewController:)]) {
- [plugin setViewController:self];
- }
-
- if ([plugin respondsToSelector:@selector(setCommandDelegate:)]) {
- [plugin setCommandDelegate:_commandDelegate];
- }
-
- [self.pluginObjects setObject:plugin forKey:className];
- [plugin pluginInitialize];
-}
-
-- (void)registerPlugin:(CDVPlugin*)plugin withPluginName:(NSString*)pluginName
-{
- if ([plugin respondsToSelector:@selector(setViewController:)]) {
- [plugin setViewController:self];
- }
-
- if ([plugin respondsToSelector:@selector(setCommandDelegate:)]) {
- [plugin setCommandDelegate:_commandDelegate];
- }
-
- NSString* className = NSStringFromClass([plugin class]);
- [self.pluginObjects setObject:plugin forKey:className];
- [self.pluginsMap setValue:className forKey:[pluginName lowercaseString]];
- [plugin pluginInitialize];
-}
-
-/**
- Returns an instance of a CordovaCommand object, based on its name. If one exists already, it is returned.
- */
-- (id)getCommandInstance:(NSString*)pluginName
-{
- // first, we try to find the pluginName in the pluginsMap
- // (acts as a whitelist as well) if it does not exist, we return nil
- // NOTE: plugin names are matched as lowercase to avoid problems - however, a
- // possible issue is there can be duplicates possible if you had:
- // "org.apache.cordova.Foo" and "org.apache.cordova.foo" - only the lower-cased entry will match
- NSString* className = [self.pluginsMap objectForKey:[pluginName lowercaseString]];
-
- if (className == nil) {
- return nil;
- }
-
- id obj = [self.pluginObjects objectForKey:className];
- if (!obj) {
- obj = [[NSClassFromString(className)alloc] initWithWebView:webView];
-
- if (obj != nil) {
- [self registerPlugin:obj withClassName:className];
- } else {
- NSLog(@"CDVPlugin class %@ (pluginName: %@) does not exist.", className, pluginName);
- }
- }
- return obj;
-}
-
-#pragma mark -
-
-- (NSString*)appURLScheme
-{
- NSString* URLScheme = nil;
-
- NSArray* URLTypes = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"];
-
- if (URLTypes != nil) {
- NSDictionary* dict = [URLTypes objectAtIndex:0];
- if (dict != nil) {
- NSArray* URLSchemes = [dict objectForKey:@"CFBundleURLSchemes"];
- if (URLSchemes != nil) {
- URLScheme = [URLSchemes objectAtIndex:0];
- }
- }
- }
-
- return URLScheme;
-}
-
-/**
- Returns the contents of the named plist bundle, loaded as a dictionary object
- */
-+ (NSDictionary*)getBundlePlist:(NSString*)plistName
-{
- NSString* errorDesc = nil;
- NSPropertyListFormat format;
- NSString* plistPath = [[NSBundle mainBundle] pathForResource:plistName ofType:@"plist"];
- NSData* plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
- NSDictionary* temp = (NSDictionary*)[NSPropertyListSerialization
- propertyListFromData:plistXML
- mutabilityOption:NSPropertyListMutableContainersAndLeaves
- format:&format errorDescription:&errorDesc];
-
- return temp;
-}
-
-#pragma mark -
-#pragma mark UIApplicationDelegate impl
-
-/*
- This method lets your application know that it is about to be terminated and purged from memory entirely
- */
-- (void)onAppWillTerminate:(NSNotification*)notification
-{
- // empty the tmp directory
- NSFileManager* fileMgr = [[NSFileManager alloc] init];
- NSError* __autoreleasing err = nil;
-
- // clear contents of NSTemporaryDirectory
- NSString* tempDirectoryPath = NSTemporaryDirectory();
- NSDirectoryEnumerator* directoryEnumerator = [fileMgr enumeratorAtPath:tempDirectoryPath];
- NSString* fileName = nil;
- BOOL result;
-
- while ((fileName = [directoryEnumerator nextObject])) {
- NSString* filePath = [tempDirectoryPath stringByAppendingPathComponent:fileName];
- result = [fileMgr removeItemAtPath:filePath error:&err];
- if (!result && err) {
- NSLog(@"Failed to delete: %@ (error: %@)", filePath, err);
- }
- }
-}
-
-/*
- This method is called to let your application know that it is about to move from the active to inactive state.
- You should use this method to pause ongoing tasks, disable timer, ...
- */
-- (void)onAppWillResignActive:(NSNotification*)notification
-{
- // NSLog(@"%@",@"applicationWillResignActive");
- [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('resign');" scheduledOnRunLoop:NO];
-}
-
-/*
- In iOS 4.0 and later, this method is called as part of the transition from the background to the inactive state.
- You can use this method to undo many of the changes you made to your application upon entering the background.
- invariably followed by applicationDidBecomeActive
- */
-- (void)onAppWillEnterForeground:(NSNotification*)notification
-{
- // NSLog(@"%@",@"applicationWillEnterForeground");
- [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('resume');"];
-}
-
-// This method is called to let your application know that it moved from the inactive to active state.
-- (void)onAppDidBecomeActive:(NSNotification*)notification
-{
- // NSLog(@"%@",@"applicationDidBecomeActive");
- [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('active');"];
-}
-
-/*
- In iOS 4.0 and later, this method is called instead of the applicationWillTerminate: method
- when the user quits an application that supports background execution.
- */
-- (void)onAppDidEnterBackground:(NSNotification*)notification
-{
- // NSLog(@"%@",@"applicationDidEnterBackground");
- [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('pause', null, true);" scheduledOnRunLoop:NO];
-}
-
-// ///////////////////////
-
-- (void)handleOpenURL:(NSNotification*)notification
-{
- self.openURL = notification.object;
-}
-
-- (void)processOpenUrl
-{
- if (self.openURL) {
- // calls into javascript global function 'handleOpenURL'
- NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", [self.openURL description]];
- [self.webView stringByEvaluatingJavaScriptFromString:jsString];
- self.openURL = nil;
- }
-}
-
-// ///////////////////////
-
-- (void)dealloc
-{
- [CDVURLProtocol unregisterViewController:self];
- [[NSNotificationCenter defaultCenter] removeObserver:self];
-
- self.webView.delegate = nil;
- self.webView = nil;
- [CDVUserAgentUtil releaseLock:&_userAgentLockToken];
- [_commandQueue dispose];
- [[self.pluginObjects allValues] makeObjectsPerformSelector:@selector(dispose)];
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.h b/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.h
deleted file mode 100644
index a4d78bd..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.h
+++ /dev/null
@@ -1,38 +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 <UIKit/UIKit.h>
-
-/**
- * Distinguishes top-level navigations from sub-frame navigations.
- * shouldStartLoadWithRequest is called for every request, but didStartLoad
- * and didFinishLoad is called only for top-level navigations.
- * Relevant bug: CB-2389
- */
-@interface CDVWebViewDelegate : NSObject <UIWebViewDelegate>{
- __weak NSObject <UIWebViewDelegate>* _delegate;
- NSInteger _loadCount;
- NSInteger _state;
- NSInteger _curLoadToken;
- NSInteger _loadStartPollCount;
-}
-
-- (id)initWithDelegate:(NSObject <UIWebViewDelegate>*)delegate;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m b/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
deleted file mode 100644
index fd9c032..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
+++ /dev/null
@@ -1,334 +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.
- */
-
-//
-// Testing shows:
-//
-// In all cases, webView.request.URL is the previous page's URL (or empty) during the didStartLoad callback.
-// When loading a page with a redirect:
-// 1. shouldStartLoading (requestURL is target page)
-// 2. didStartLoading
-// 3. shouldStartLoading (requestURL is redirect target)
-// 4. didFinishLoad (request.URL is redirect target)
-//
-// Note the lack of a second didStartLoading **
-//
-// When loading a page with iframes:
-// 1. shouldStartLoading (requestURL is main page)
-// 2. didStartLoading
-// 3. shouldStartLoading (requestURL is one of the iframes)
-// 4. didStartLoading
-// 5. didFinishLoad
-// 6. didFinishLoad
-//
-// Note there is no way to distinguish which didFinishLoad maps to which didStartLoad **
-//
-// Loading a page by calling window.history.go(-1):
-// 1. didStartLoading
-// 2. didFinishLoad
-//
-// Note the lack of a shouldStartLoading call **
-// Actually - this is fixed on iOS6. iOS6 has a shouldStart. **
-//
-// Loading a page by calling location.reload()
-// 1. shouldStartLoading
-// 2. didStartLoading
-// 3. didFinishLoad
-//
-// Loading a page with an iframe that fails to load:
-// 1. shouldStart (main page)
-// 2. didStart
-// 3. shouldStart (iframe)
-// 4. didStart
-// 5. didFailWithError
-// 6. didFinish
-//
-// Loading a page with an iframe that fails to load due to an invalid URL:
-// 1. shouldStart (main page)
-// 2. didStart
-// 3. shouldStart (iframe)
-// 5. didFailWithError
-// 6. didFinish
-//
-// This case breaks our logic since there is a missing didStart. To prevent this,
-// we check URLs in shouldStart and return NO if they are invalid.
-//
-// Loading a page with an invalid URL
-// 1. shouldStart (main page)
-// 2. didFailWithError
-//
-// TODO: Record order when page is re-navigated before the first navigation finishes.
-//
-
-#import "CDVWebViewDelegate.h"
-#import "CDVAvailability.h"
-
-// #define VerboseLog NSLog
-#define VerboseLog(...) do {} while (0)
-
-typedef enum {
- STATE_IDLE,
- STATE_WAITING_FOR_LOAD_START,
- STATE_WAITING_FOR_LOAD_FINISH,
- STATE_IOS5_POLLING_FOR_LOAD_START,
- STATE_IOS5_POLLING_FOR_LOAD_FINISH
-} State;
-
-@implementation CDVWebViewDelegate
-
-- (id)initWithDelegate:(NSObject <UIWebViewDelegate>*)delegate
-{
- self = [super init];
- if (self != nil) {
- _delegate = delegate;
- _loadCount = -1;
- _state = STATE_IDLE;
- }
- return self;
-}
-
-- (BOOL)isPageLoaded:(UIWebView*)webView
-{
- NSString* readyState = [webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];
-
- return [readyState isEqualToString:@"loaded"] || [readyState isEqualToString:@"complete"];
-}
-
-- (BOOL)isJsLoadTokenSet:(UIWebView*)webView
-{
- NSString* loadToken = [webView stringByEvaluatingJavaScriptFromString:@"window.__cordovaLoadToken"];
-
- return [[NSString stringWithFormat:@"%d", _curLoadToken] isEqualToString:loadToken];
-}
-
-- (void)setLoadToken:(UIWebView*)webView
-{
- _curLoadToken += 1;
- [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.__cordovaLoadToken=%d", _curLoadToken]];
-}
-
-- (void)pollForPageLoadStart:(UIWebView*)webView
-{
- if (_state != STATE_IOS5_POLLING_FOR_LOAD_START) {
- return;
- }
- if (![self isJsLoadTokenSet:webView]) {
- VerboseLog(@"Polled for page load start. result = YES!");
- _state = STATE_IOS5_POLLING_FOR_LOAD_FINISH;
- [self setLoadToken:webView];
- if ([_delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
- [_delegate webViewDidStartLoad:webView];
- }
- [self pollForPageLoadFinish:webView];
- } else {
- VerboseLog(@"Polled for page load start. result = NO");
- // Poll only for 1 second, and then fall back on checking only when delegate methods are called.
- ++_loadStartPollCount;
- if (_loadStartPollCount < (1000 * .05)) {
- [self performSelector:@selector(pollForPageLoadStart:) withObject:webView afterDelay:.05];
- }
- }
-}
-
-- (void)pollForPageLoadFinish:(UIWebView*)webView
-{
- if (_state != STATE_IOS5_POLLING_FOR_LOAD_FINISH) {
- return;
- }
- if ([self isPageLoaded:webView]) {
- VerboseLog(@"Polled for page load finish. result = YES!");
- _state = STATE_IDLE;
- if ([_delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
- [_delegate webViewDidFinishLoad:webView];
- }
- } else {
- VerboseLog(@"Polled for page load finish. result = NO");
- [self performSelector:@selector(pollForPageLoadFinish:) withObject:webView afterDelay:.05];
- }
-}
-
-- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
-{
- BOOL shouldLoad = YES;
-
- if ([_delegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
- shouldLoad = [_delegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
- }
-
- VerboseLog(@"webView shouldLoad=%d (before) state=%d loadCount=%d URL=%@", shouldLoad, _state, _loadCount, request.URL);
-
- if (shouldLoad) {
- BOOL isTopLevelNavigation = [request.URL isEqual:[request mainDocumentURL]];
- if (isTopLevelNavigation) {
- switch (_state) {
- case STATE_WAITING_FOR_LOAD_FINISH:
- // Redirect case.
- // We expect loadCount == 1.
- if (_loadCount != 1) {
- NSLog(@"CDVWebViewDelegate: Detected redirect when loadCount=%d", _loadCount);
- }
- break;
-
- case STATE_IDLE:
- case STATE_IOS5_POLLING_FOR_LOAD_START:
- // Page navigation start.
- _loadCount = 0;
- _state = STATE_WAITING_FOR_LOAD_START;
- break;
-
- default:
- NSLog(@"CDVWebViewDelegate: Navigation started when state=%d", _state);
- _loadCount = 0;
- _state = STATE_WAITING_FOR_LOAD_START;
- if ([_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
- [_delegate webView:webView didFailLoadWithError:nil];
- }
- }
- } else {
- // Deny invalid URLs so that we don't get the case where we go straight from
- // webViewShouldLoad -> webViewDidFailLoad (messes up _loadCount).
- shouldLoad = shouldLoad && [NSURLConnection canHandleRequest:request];
- }
- VerboseLog(@"webView shouldLoad=%d (after) isTopLevelNavigation=%d state=%d loadCount=%d", shouldLoad, isTopLevelNavigation, _state, _loadCount);
- }
- return shouldLoad;
-}
-
-- (void)webViewDidStartLoad:(UIWebView*)webView
-{
- VerboseLog(@"webView didStartLoad (before). state=%d loadCount=%d", _state, _loadCount);
- BOOL fireCallback = NO;
- switch (_state) {
- case STATE_IDLE:
- if (IsAtLeastiOSVersion(@"6.0")) {
- break;
- }
- // If history.go(-1) is used pre-iOS6, the shouldStartLoadWithRequest function is not called.
- // Without shouldLoad, we can't distinguish an iframe from a top-level navigation.
- // We could try to distinguish using [UIWebView canGoForward], but that's too much complexity,
- // and would work only on the first time it was used.
-
- // Our work-around is to set a JS variable and poll until it disappears (from a naviagtion).
- _state = STATE_IOS5_POLLING_FOR_LOAD_START;
- _loadStartPollCount = 0;
- [self setLoadToken:webView];
- [self pollForPageLoadStart:webView];
- break;
-
- case STATE_WAITING_FOR_LOAD_START:
- if (_loadCount != 0) {
- NSLog(@"CDVWebViewDelegate: Unexpected loadCount in didStart. count=%d", _loadCount);
- }
- fireCallback = YES;
- _state = STATE_WAITING_FOR_LOAD_FINISH;
- _loadCount = 1;
- break;
-
- case STATE_WAITING_FOR_LOAD_FINISH:
- _loadCount += 1;
- break;
-
- case STATE_IOS5_POLLING_FOR_LOAD_START:
- [self pollForPageLoadStart:webView];
- break;
-
- case STATE_IOS5_POLLING_FOR_LOAD_FINISH:
- [self pollForPageLoadFinish:webView];
- break;
-
- default:
- NSLog(@"CDVWebViewDelegate: Unexpected didStart with state=%d loadCount=%d", _state, _loadCount);
- }
- VerboseLog(@"webView didStartLoad (after). state=%d loadCount=%d fireCallback=%d", _state, _loadCount, fireCallback);
- if (fireCallback && [_delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
- [_delegate webViewDidStartLoad:webView];
- }
-}
-
-- (void)webViewDidFinishLoad:(UIWebView*)webView
-{
- VerboseLog(@"webView didFinishLoad (before). state=%d loadCount=%d", _state, _loadCount);
- BOOL fireCallback = NO;
- switch (_state) {
- case STATE_IDLE:
- break;
-
- case STATE_WAITING_FOR_LOAD_START:
- NSLog(@"CDVWebViewDelegate: Unexpected didFinish while waiting for load start.");
- break;
-
- case STATE_WAITING_FOR_LOAD_FINISH:
- if (_loadCount == 1) {
- fireCallback = YES;
- _state = STATE_IDLE;
- }
- _loadCount -= 1;
- break;
-
- case STATE_IOS5_POLLING_FOR_LOAD_START:
- [self pollForPageLoadStart:webView];
- break;
-
- case STATE_IOS5_POLLING_FOR_LOAD_FINISH:
- [self pollForPageLoadFinish:webView];
- break;
- }
- VerboseLog(@"webView didFinishLoad (after). state=%d loadCount=%d fireCallback=%d", _state, _loadCount, fireCallback);
- if (fireCallback && [_delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
- [_delegate webViewDidFinishLoad:webView];
- }
-}
-
-- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error
-{
- VerboseLog(@"webView didFailLoad (before). state=%d loadCount=%d", _state, _loadCount);
- BOOL fireCallback = NO;
-
- switch (_state) {
- case STATE_IDLE:
- break;
-
- case STATE_WAITING_FOR_LOAD_START:
- _state = STATE_IDLE;
- fireCallback = YES;
- break;
-
- case STATE_WAITING_FOR_LOAD_FINISH:
- if (_loadCount == 1) {
- _state = STATE_IDLE;
- fireCallback = YES;
- }
- _loadCount = -1;
- break;
-
- case STATE_IOS5_POLLING_FOR_LOAD_START:
- [self pollForPageLoadStart:webView];
- break;
-
- case STATE_IOS5_POLLING_FOR_LOAD_FINISH:
- [self pollForPageLoadFinish:webView];
- break;
- }
- VerboseLog(@"webView didFailLoad (after). state=%d loadCount=%d, fireCallback=%d", _state, _loadCount, fireCallback);
- if (fireCallback && [_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
- [_delegate webView:webView didFailLoadWithError:error];
- }
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.h b/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.h
deleted file mode 100644
index e339dd0..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.h
+++ /dev/null
@@ -1,33 +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 <Foundation/Foundation.h>
-
-extern NSString* const kCDVDefaultWhitelistRejectionString;
-
-@interface CDVWhitelist : NSObject
-
-@property (nonatomic, copy) NSString* whitelistRejectionFormatString;
-
-- (id)initWithArray:(NSArray*)array;
-- (BOOL)schemeIsAllowed:(NSString*)scheme;
-- (BOOL)URLIsAllowed:(NSURL*)url;
-- (NSString*)errorStringForURL:(NSURL*)url;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.m b/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.m
deleted file mode 100644
index db7aa32..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/CDVWhitelist.m
+++ /dev/null
@@ -1,223 +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 "CDVWhitelist.h"
-
-NSString* const kCDVDefaultWhitelistRejectionString = @"ERROR whitelist rejection: url='%@'";
-NSString* const kCDVDefaultSchemeName = @"cdv-default-scheme";
-
-@interface CDVWhitelist ()
-
-@property (nonatomic, readwrite, strong) NSArray* whitelist;
-@property (nonatomic, readwrite, strong) NSDictionary* expandedWhitelists;
-
-- (void)processWhitelist;
-
-@end
-
-@implementation CDVWhitelist
-
-@synthesize whitelist, expandedWhitelists, whitelistRejectionFormatString;
-
-- (id)initWithArray:(NSArray*)array
-{
- self = [super init];
- if (self) {
- self.whitelist = array;
- self.expandedWhitelists = nil;
- self.whitelistRejectionFormatString = kCDVDefaultWhitelistRejectionString;
- [self processWhitelist];
- }
-
- return self;
-}
-
-- (BOOL)isIPv4Address:(NSString*)externalHost
-{
- // an IPv4 address has 4 octets b.b.b.b where b is a number between 0 and 255.
- // for our purposes, b can also be the wildcard character '*'
-
- // we could use a regex to solve this problem but then I would have two problems
- // anyways, this is much clearer and maintainable
- NSArray* octets = [externalHost componentsSeparatedByString:@"."];
- NSUInteger num_octets = [octets count];
-
- // quick check
- if (num_octets != 4) {
- return NO;
- }
-
- // restrict number parsing to 0-255
- NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
- [numberFormatter setMinimum:[NSNumber numberWithUnsignedInteger:0]];
- [numberFormatter setMaximum:[NSNumber numberWithUnsignedInteger:255]];
-
- // iterate through each octet, and test for a number between 0-255 or if it equals '*'
- for (NSUInteger i = 0; i < num_octets; ++i) {
- NSString* octet = [octets objectAtIndex:i];
-
- if ([octet isEqualToString:@"*"]) { // passes - check next octet
- continue;
- } else if ([numberFormatter numberFromString:octet] == nil) { // fails - not a number and not within our range, return
- return NO;
- }
- }
-
- return YES;
-}
-
-- (NSString*)extractHostFromUrlString:(NSString*)url
-{
- NSURL* aUrl = [NSURL URLWithString:url];
-
- if ((aUrl != nil) && ([aUrl scheme] != nil)) { // found scheme
- return [aUrl host];
- } else {
- return url;
- }
-}
-
-- (NSString*)extractSchemeFromUrlString:(NSString*)url
-{
- NSURL* aUrl = [NSURL URLWithString:url];
-
- if ((aUrl != nil) && ([aUrl scheme] != nil)) { // found scheme
- return [aUrl scheme];
- } else {
- return kCDVDefaultSchemeName;
- }
-}
-
-- (void)processWhitelist
-{
- if (self.whitelist == nil) {
- NSLog(@"ERROR: CDVWhitelist was not initialized properly, all urls will be disallowed.");
- return;
- }
-
- NSMutableDictionary* _expandedWhitelists = [@{kCDVDefaultSchemeName: [NSMutableArray array]} mutableCopy];
-
- // only allow known TLDs (since Aug 23rd 2011), and two character country codes
- // does not match internationalized domain names with non-ASCII characters
- NSString* tld_match = @"(aero|asia|arpa|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|xxx|[a-z][a-z])";
-
- // iterate through settings ExternalHosts, check for equality
- for (NSString* externalHost in self.whitelist) {
- NSString* host = [self extractHostFromUrlString:externalHost];
- NSString* scheme = [self extractSchemeFromUrlString:externalHost];
-
- // check for single wildcard '*', if found set allowAll to YES
- if ([host isEqualToString:@"*"]) {
- [_expandedWhitelists setObject:[NSArray arrayWithObject:host] forKey:scheme];
- continue;
- }
-
- // if this is the first value for this scheme, create a new entry
- if ([_expandedWhitelists objectForKey:scheme] == nil) {
- [_expandedWhitelists setObject:[NSMutableArray array] forKey:scheme];
- }
-
- // starts with wildcard match - we make the first '.' optional (so '*.org.apache.cordova' will match 'org.apache.cordova')
- NSString* prefix = @"*.";
- if ([host hasPrefix:prefix]) {
- // replace the first two characters '*.' with our regex
- host = [host stringByReplacingCharactersInRange:NSMakeRange(0, [prefix length]) withString:@"(\\s{0}|*.)"]; // the '*' and '.' will be substituted later
- }
-
- // ends with wildcard match for TLD
- if (![self isIPv4Address:host] && [host hasSuffix:@".*"]) {
- // replace * with tld_match
- host = [host stringByReplacingCharactersInRange:NSMakeRange([host length] - 1, 1) withString:tld_match];
- }
- // escape periods - since '.' means any character in regex
- host = [host stringByReplacingOccurrencesOfString:@"." withString:@"\\."];
- // wildcard is match 1 or more characters (to make it simple, since we are not doing verification whether the hostname is valid)
- host = [host stringByReplacingOccurrencesOfString:@"*" withString:@".*"];
-
- [[_expandedWhitelists objectForKey:scheme] addObject:host];
- }
-
- self.expandedWhitelists = _expandedWhitelists;
-}
-
-- (BOOL)schemeIsAllowed:(NSString*)scheme
-{
- if ([scheme isEqualToString:@"http"] ||
- [scheme isEqualToString:@"https"] ||
- [scheme isEqualToString:@"ftp"] ||
- [scheme isEqualToString:@"ftps"]) {
- return YES;
- }
-
- return (self.expandedWhitelists != nil) && ([self.expandedWhitelists objectForKey:scheme] != nil);
-}
-
-- (BOOL)URLIsAllowed:(NSURL*)url
-{
- NSString* scheme = [url scheme];
-
- // http[s] and ftp[s] should also validate against the common set in the kCDVDefaultSchemeName list
- if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"] || [scheme isEqualToString:@"ftp"] || [scheme isEqualToString:@"ftps"]) {
- NSURL* newUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@", kCDVDefaultSchemeName, [url host]]];
- // If it is allowed, we are done. If not, continue to check for the actual scheme-specific list
- if ([self URLIsAllowed:newUrl]) {
- return YES;
- }
- }
-
- // Check that the scheme is supported
- if (![self schemeIsAllowed:scheme]) {
- return NO;
- }
-
- NSArray* expandedWhitelist = [self.expandedWhitelists objectForKey:scheme];
-
- // Are we allowing everything for this scheme?
- // TODO: consider just having a static sentinel value for the "allow all" list, so we can use object equality
- if (([expandedWhitelist count] == 1) && [[expandedWhitelist objectAtIndex:0] isEqualToString:@"*"]) {
- return YES;
- }
-
- // iterate through settings ExternalHosts, check for equality
- NSEnumerator* enumerator = [expandedWhitelist objectEnumerator];
- id regex = nil;
- NSString* urlHost = [url host];
-
- // if the url host IS found in the whitelist, load it in the app (however UIWebViewNavigationTypeOther kicks it out to Safari)
- // if the url host IS NOT found in the whitelist, we do nothing
- while (regex = [enumerator nextObject]) {
- NSPredicate* regex_test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
-
- if ([regex_test evaluateWithObject:urlHost] == YES) {
- // if it matches at least one rule, return
- return YES;
- }
- }
-
- NSLog(@"%@", [self errorStringForURL:url]);
- // if we got here, the url host is not in the white-list, do nothing
- return NO;
-}
-
-- (NSString*)errorStringForURL:(NSURL*)url
-{
- return [NSString stringWithFormat:self.whitelistRejectionFormatString, [url absoluteString]];
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.h b/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.h
deleted file mode 100644
index cd02b71..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.h
+++ /dev/null
@@ -1,26 +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 <Foundation/Foundation.h>
-
-@interface NSArray (Comparisons)
-
-- (id)objectAtIndex:(NSUInteger)index withDefault:(id)aDefault;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.m b/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.m
deleted file mode 100644
index 485e3c8..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSArray+Comparisons.m
+++ /dev/null
@@ -1,41 +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 "NSArray+Comparisons.h"
-
-@implementation NSArray (Comparisons)
-
-- (id)objectAtIndex:(NSUInteger)index withDefault:(id)aDefault
-{
- id obj = nil;
-
- @try {
- obj = [self objectAtIndex:index];
- if ((obj == [NSNull null]) || (obj == nil)) {
- return aDefault;
- }
- }
- @catch(NSException* exception) {
- NSLog(@"Exception - Name: %@ Reason: %@", [exception name], [exception reason]);
- }
-
- return obj;
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.h b/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.h
deleted file mode 100644
index ffe9c83..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.h
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// NSData+Base64.h
-// base64
-//
-// Created by Matt Gallagher on 2009/06/03.
-// Copyright 2009 Matt Gallagher. All rights reserved.
-//
-// Permission is given to use this source code file, free of charge, in any
-// project, commercial or otherwise, entirely at your risk, with the condition
-// that any redistribution (in part or whole) of source code must retain
-// this copyright and permission notice. Attribution in compiled projects is
-// appreciated but not required.
-//
-
-#import <Foundation/Foundation.h>
-
-void *CDVNewBase64Decode(
- const char* inputBuffer,
- size_t length,
- size_t * outputLength);
-
-char *CDVNewBase64Encode(
- const void* inputBuffer,
- size_t length,
- bool separateLines,
- size_t * outputLength);
-
-@interface NSData (CDVBase64)
-
-+ (NSData*)dataFromBase64String:(NSString*)aString;
-- (NSString*)base64EncodedString;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.m b/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.m
deleted file mode 100644
index d0f2189..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSData+Base64.m
+++ /dev/null
@@ -1,281 +0,0 @@
-//
-// NSData+Base64.m
-// base64
-//
-// Created by Matt Gallagher on 2009/06/03.
-// Copyright 2009 Matt Gallagher. All rights reserved.
-//
-// Permission is given to use this source code file, free of charge, in any
-// project, commercial or otherwise, entirely at your risk, with the condition
-// that any redistribution (in part or whole) of source code must retain
-// this copyright and permission notice. Attribution in compiled projects is
-// appreciated but not required.
-//
-
-#import "NSData+Base64.h"
-
-//
-// Mapping from 6 bit pattern to ASCII character.
-//
-static unsigned char cdvbase64EncodeLookup[65] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-//
-// Definition for "masked-out" areas of the base64DecodeLookup mapping
-//
-#define xx 65
-
-//
-// Mapping from ASCII character to 6 bit pattern.
-//
-static unsigned char cdvbase64DecodeLookup[256] =
-{
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx,
- xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx,
- xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
- xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
-};
-
-//
-// Fundamental sizes of the binary and base64 encode/decode units in bytes
-//
-#define CDV_BINARY_UNIT_SIZE 3
-#define CDV_BASE64_UNIT_SIZE 4
-
-//
-// NewBase64Decode
-//
-// Decodes the base64 ASCII string in the inputBuffer to a newly malloced
-// output buffer.
-//
-// inputBuffer - the source ASCII string for the decode
-// length - the length of the string or -1 (to specify strlen should be used)
-// outputLength - if not-NULL, on output will contain the decoded length
-//
-// returns the decoded buffer. Must be freed by caller. Length is given by
-// outputLength.
-//
-void *CDVNewBase64Decode(
- const char* inputBuffer,
- size_t length,
- size_t * outputLength)
-{
- if (length == -1) {
- length = strlen(inputBuffer);
- }
-
- size_t outputBufferSize = (length / CDV_BASE64_UNIT_SIZE) * CDV_BINARY_UNIT_SIZE;
- unsigned char* outputBuffer = (unsigned char*)malloc(outputBufferSize);
-
- size_t i = 0;
- size_t j = 0;
-
- while (i < length) {
- //
- // Accumulate 4 valid characters (ignore everything else)
- //
- unsigned char accumulated[CDV_BASE64_UNIT_SIZE];
- bzero(accumulated, sizeof(unsigned char) * CDV_BASE64_UNIT_SIZE);
- size_t accumulateIndex = 0;
-
- while (i < length) {
- unsigned char decode = cdvbase64DecodeLookup[inputBuffer[i++]];
- if (decode != xx) {
- accumulated[accumulateIndex] = decode;
- accumulateIndex++;
-
- if (accumulateIndex == CDV_BASE64_UNIT_SIZE) {
- break;
- }
- }
- }
-
- //
- // Store the 6 bits from each of the 4 characters as 3 bytes
- //
- outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4);
- outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2);
- outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3];
- j += accumulateIndex - 1;
- }
-
- if (outputLength) {
- *outputLength = j;
- }
- return outputBuffer;
-}
-
-//
-// NewBase64Decode
-//
-// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced
-// output buffer.
-//
-// inputBuffer - the source data for the encode
-// length - the length of the input in bytes
-// separateLines - if zero, no CR/LF characters will be added. Otherwise
-// a CR/LF pair will be added every 64 encoded chars.
-// outputLength - if not-NULL, on output will contain the encoded length
-// (not including terminating 0 char)
-//
-// returns the encoded buffer. Must be freed by caller. Length is given by
-// outputLength.
-//
-char *CDVNewBase64Encode(
- const void* buffer,
- size_t length,
- bool separateLines,
- size_t * outputLength)
-{
- const unsigned char* inputBuffer = (const unsigned char*)buffer;
-
-#define MAX_NUM_PADDING_CHARS 2
-#define OUTPUT_LINE_LENGTH 64
-#define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / CDV_BASE64_UNIT_SIZE) * CDV_BINARY_UNIT_SIZE)
-#define CR_LF_SIZE 0
-
- //
- // Byte accurate calculation of final buffer size
- //
- size_t outputBufferSize =
- ((length / CDV_BINARY_UNIT_SIZE)
- + ((length % CDV_BINARY_UNIT_SIZE) ? 1 : 0))
- * CDV_BASE64_UNIT_SIZE;
- if (separateLines) {
- outputBufferSize +=
- (outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE;
- }
-
- //
- // Include space for a terminating zero
- //
- outputBufferSize += 1;
-
- //
- // Allocate the output buffer
- //
- char* outputBuffer = (char*)malloc(outputBufferSize);
- if (!outputBuffer) {
- return NULL;
- }
-
- size_t i = 0;
- size_t j = 0;
- const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length;
- size_t lineEnd = lineLength;
-
- while (true) {
- if (lineEnd > length) {
- lineEnd = length;
- }
-
- for (; i + CDV_BINARY_UNIT_SIZE - 1 < lineEnd; i += CDV_BINARY_UNIT_SIZE) {
- //
- // Inner loop: turn 48 bytes into 64 base64 characters
- //
- outputBuffer[j++] = cdvbase64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
- outputBuffer[j++] = cdvbase64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
- | ((inputBuffer[i + 1] & 0xF0) >> 4)];
- outputBuffer[j++] = cdvbase64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2)
- | ((inputBuffer[i + 2] & 0xC0) >> 6)];
- outputBuffer[j++] = cdvbase64EncodeLookup[inputBuffer[i + 2] & 0x3F];
- }
-
- if (lineEnd == length) {
- break;
- }
-
- //
- // Add the newline
- //
- // outputBuffer[j++] = '\r';
- // outputBuffer[j++] = '\n';
- lineEnd += lineLength;
- }
-
- if (i + 1 < length) {
- //
- // Handle the single '=' case
- //
- outputBuffer[j++] = cdvbase64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
- outputBuffer[j++] = cdvbase64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
- | ((inputBuffer[i + 1] & 0xF0) >> 4)];
- outputBuffer[j++] = cdvbase64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2];
- outputBuffer[j++] = '=';
- } else if (i < length) {
- //
- // Handle the double '=' case
- //
- outputBuffer[j++] = cdvbase64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
- outputBuffer[j++] = cdvbase64EncodeLookup[(inputBuffer[i] & 0x03) << 4];
- outputBuffer[j++] = '=';
- outputBuffer[j++] = '=';
- }
- outputBuffer[j] = 0;
-
- //
- // Set the output length and return the buffer
- //
- if (outputLength) {
- *outputLength = j;
- }
- return outputBuffer;
-}
-
-@implementation NSData (CDVBase64)
-
-//
-// dataFromBase64String:
-//
-// Creates an NSData object containing the base64 decoded representation of
-// the base64 string 'aString'
-//
-// Parameters:
-// aString - the base64 string to decode
-//
-// returns the autoreleased NSData representation of the base64 string
-//
-+ (NSData*)dataFromBase64String:(NSString*)aString
-{
- size_t outputLength = 0;
- void* outputBuffer = CDVNewBase64Decode([aString UTF8String], [aString length], &outputLength);
-
- return [NSData dataWithBytesNoCopy:outputBuffer length:outputLength freeWhenDone:YES];
-}
-
-//
-// base64EncodedString
-//
-// Creates an NSString object that contains the base 64 encoding of the
-// receiver's data. Lines are broken at 64 characters long.
-//
-// returns an autoreleased NSString being the base 64 representation of the
-// receiver.
-//
-- (NSString*)base64EncodedString
-{
- size_t outputLength = 0;
- char* outputBuffer =
- CDVNewBase64Encode([self bytes], [self length], true, &outputLength);
-
- NSString* result = [[NSString alloc] initWithBytesNoCopy:outputBuffer
- length:outputLength
- encoding:NSASCIIStringEncoding
- freeWhenDone:YES];
-
- return result;
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.h b/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.h
deleted file mode 100644
index d38a6fc..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.h
+++ /dev/null
@@ -1,35 +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 <Foundation/Foundation.h>
-
-@interface NSDictionary (org_apache_cordova_NSDictionary_Extension)
-
-- (bool)existsValue:(NSString*)expectedValue forKey:(NSString*)key;
-- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue withRange:(NSRange)range;
-- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue;
-- (BOOL)typeValueForKey:(NSString*)key isArray:(BOOL*)bArray isNull:(BOOL*)bNull isNumber:(BOOL*)bNumber isString:(BOOL*)bString;
-- (BOOL)valueForKeyIsArray:(NSString*)key;
-- (BOOL)valueForKeyIsNull:(NSString*)key;
-- (BOOL)valueForKeyIsString:(NSString*)key;
-- (BOOL)valueForKeyIsNumber:(NSString*)key;
-
-- (NSDictionary*)dictionaryWithLowercaseKeys;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.m b/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.m
deleted file mode 100644
index 0361ff9..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSDictionary+Extensions.m
+++ /dev/null
@@ -1,159 +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 "NSDictionary+Extensions.h"
-#import <math.h>
-
-@implementation NSDictionary (org_apache_cordova_NSDictionary_Extension)
-
-- (bool)existsValue:(NSString*)expectedValue forKey:(NSString*)key
-{
- id val = [self valueForKey:key];
- bool exists = false;
-
- if (val != nil) {
- exists = [(NSString*)val compare : expectedValue options : NSCaseInsensitiveSearch] == 0;
- }
-
- return exists;
-}
-
-- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue withRange:(NSRange)range
-{
- NSInteger value = defaultValue;
-
- NSNumber* val = [self valueForKey:key]; // value is an NSNumber
-
- if (val != nil) {
- value = [val integerValue];
- }
-
- // min, max checks
- value = MAX(range.location, value);
- value = MIN(range.length, value);
-
- return value;
-}
-
-- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue
-{
- NSInteger value = defaultValue;
-
- NSNumber* val = [self valueForKey:key]; // value is an NSNumber
-
- if (val != nil) {
- value = [val integerValue];
- }
- return value;
-}
-
-/*
- * Determine the type of object stored in a dictionary
- * IN:
- * (BOOL*) bString - if exists will be set to YES if object is an NSString, NO if not
- * (BOOL*) bNull - if exists will be set to YES if object is an NSNull, NO if not
- * (BOOL*) bArray - if exists will be set to YES if object is an NSArray, NO if not
- * (BOOL*) bNumber - if exists will be set to YES if object is an NSNumber, NO if not
- *
- * OUT:
- * YES if key exists
- * NO if key does not exist. Input parameters remain untouched
- *
- */
-
-- (BOOL)typeValueForKey:(NSString*)key isArray:(BOOL*)bArray isNull:(BOOL*)bNull isNumber:(BOOL*)bNumber isString:(BOOL*)bString
-{
- BOOL bExists = YES;
- NSObject* value = [self objectForKey:key];
-
- if (value) {
- bExists = YES;
- if (bString) {
- *bString = [value isKindOfClass:[NSString class]];
- }
- if (bNull) {
- *bNull = [value isKindOfClass:[NSNull class]];
- }
- if (bArray) {
- *bArray = [value isKindOfClass:[NSArray class]];
- }
- if (bNumber) {
- *bNumber = [value isKindOfClass:[NSNumber class]];
- }
- }
- return bExists;
-}
-
-- (BOOL)valueForKeyIsArray:(NSString*)key
-{
- BOOL bArray = NO;
- NSObject* value = [self objectForKey:key];
-
- if (value) {
- bArray = [value isKindOfClass:[NSArray class]];
- }
- return bArray;
-}
-
-- (BOOL)valueForKeyIsNull:(NSString*)key
-{
- BOOL bNull = NO;
- NSObject* value = [self objectForKey:key];
-
- if (value) {
- bNull = [value isKindOfClass:[NSNull class]];
- }
- return bNull;
-}
-
-- (BOOL)valueForKeyIsString:(NSString*)key
-{
- BOOL bString = NO;
- NSObject* value = [self objectForKey:key];
-
- if (value) {
- bString = [value isKindOfClass:[NSString class]];
- }
- return bString;
-}
-
-- (BOOL)valueForKeyIsNumber:(NSString*)key
-{
- BOOL bNumber = NO;
- NSObject* value = [self objectForKey:key];
-
- if (value) {
- bNumber = [value isKindOfClass:[NSNumber class]];
- }
- return bNumber;
-}
-
-- (NSDictionary*)dictionaryWithLowercaseKeys
-{
- NSMutableDictionary* result = [NSMutableDictionary dictionaryWithCapacity:self.count];
- NSString* key;
-
- for (key in self) {
- [result setObject:[self objectForKey:key] forKey:[key lowercaseString]];
- }
-
- return result;
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.h b/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.h
deleted file mode 100644
index 3194094..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.h
+++ /dev/null
@@ -1,29 +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 <Foundation/Foundation.h>
-
-@interface NSMutableArray (QueueAdditions)
-
-- (id)pop;
-- (id)queueHead;
-- (id)dequeue;
-- (void)enqueue:(id)obj;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.m b/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.m
deleted file mode 100644
index 9e67ede..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/NSMutableArray+QueueAdditions.m
+++ /dev/null
@@ -1,58 +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 "NSMutableArray+QueueAdditions.h"
-
-@implementation NSMutableArray (QueueAdditions)
-
-- (id)queueHead
-{
- if ([self count] == 0) {
- return nil;
- }
-
- return [self objectAtIndex:0];
-}
-
-- (__autoreleasing id)dequeue
-{
- if ([self count] == 0) {
- return nil;
- }
-
- id head = [self objectAtIndex:0];
- if (head != nil) {
- // [[head retain] autorelease]; ARC - the __autoreleasing on the return value should so the same thing
- [self removeObjectAtIndex:0];
- }
-
- return head;
-}
-
-- (id)pop
-{
- return [self dequeue];
-}
-
-- (void)enqueue:(id)object
-{
- [self addObject:object];
-}
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.h b/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.h
deleted file mode 100644
index dab73e6..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.h
+++ /dev/null
@@ -1,31 +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 <Foundation/Foundation.h>
-
-@interface UIDevice (org_apache_cordova_UIDevice_Extension)
-
-/*
- Get the unique identifier from the app bundle's folder, which is already a GUID
- Upgrading and/or deleting the app and re-installing will get you a new GUID, so
- this is only unique per install per device.
- */
-- (NSString*)uniqueAppInstanceIdentifier;
-
-@end
http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/ac0c95be/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.m b/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.m
deleted file mode 100644
index c0c91af..0000000
--- a/lib/cordova-ios/CordovaLib/Classes/UIDevice+Extensions.m
+++ /dev/null
@@ -1,47 +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 <UIKit/UIKit.h>
-#import "UIDevice+Extensions.h"
-
-@implementation UIDevice (org_apache_cordova_UIDevice_Extension)
-
-- (NSString*)uniqueAppInstanceIdentifier
-{
- NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
- static NSString* UUID_KEY = @"CDVUUID";
-
- NSString* app_uuid = [userDefaults stringForKey:UUID_KEY];
-
- if (app_uuid == nil) {
- CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
- CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
-
- app_uuid = [NSString stringWithString:(__bridge NSString*)uuidString];
- [userDefaults setObject:app_uuid forKey:UUID_KEY];
- [userDefaults synchronize];
-
- CFRelease(uuidString);
- CFRelease(uuidRef);
- }
-
- return app_uuid;
-}
-
-@end