diff options
author | Jay Freeman (saurik) <saurik@saurik.com> | 2017-02-16 01:30:53 -0800 |
---|---|---|
committer | Jay Freeman (saurik) <saurik@saurik.com> | 2017-02-16 01:30:53 -0800 |
commit | a3d01a768f0e7f9d5a36b4bcea04458634818863 (patch) | |
tree | a3e62c81f8cf286cabe0bdf382c95caaf0722d0d /CyteKit | |
parent | 68df8c0b7bacec286d4798408b5a110bdac88986 (diff) |
Move a bunch of clearly shared logic into CyteKit.
Diffstat (limited to 'CyteKit')
-rw-r--r-- | CyteKit/Application.mm | 7 | ||||
-rw-r--r-- | CyteKit/CyteKit.h | 38 | ||||
-rw-r--r-- | CyteKit/WebView.mm | 26 | ||||
-rw-r--r-- | CyteKit/WebViewController.mm | 28 | ||||
-rw-r--r-- | CyteKit/countByEnumeratingWithState.h (renamed from CyteKit/WebScriptObject-Cyte.h) | 12 | ||||
-rw-r--r-- | CyteKit/countByEnumeratingWithState.mm (renamed from CyteKit/WebScriptObject-Cyte.mm) | 21 | ||||
-rw-r--r-- | CyteKit/webScriptObjectInContext.h | 31 | ||||
-rw-r--r-- | CyteKit/webScriptObjectInContext.mm | 56 |
8 files changed, 215 insertions, 4 deletions
diff --git a/CyteKit/Application.mm b/CyteKit/Application.mm index 9bd42ff..77b1260 100644 --- a/CyteKit/Application.mm +++ b/CyteKit/Application.mm @@ -25,6 +25,7 @@ #include <UIKit/UIKit.h> #include "CyteKit/Application.h" +#include "CyteKit/URLCache.h" #include "iPhonePrivate.h" #include <Menes/ObjectHandle.h> @@ -57,6 +58,12 @@ if ([self respondsToSelector:@selector(setApplicationSupportsShakeToEdit:)]) [self setApplicationSupportsShakeToEdit:NO]; + + [NSURLCache setSharedURLCache:[[[CyteURLCache alloc] + initWithMemoryCapacity:524288 + diskCapacity:10485760 + diskPath:[NSString stringWithFormat:@"%@/%@/%@", NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject, NSBundle.mainBundle.bundleIdentifier, @"SDURLCache"] + ] autorelease]]; } @end diff --git a/CyteKit/CyteKit.h b/CyteKit/CyteKit.h new file mode 100644 index 0000000..3edcc88 --- /dev/null +++ b/CyteKit/CyteKit.h @@ -0,0 +1,38 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see <http://www.gnu.org/licenses/>. +**/ +/* }}} */ + +#ifndef CyteKit_CyteKit_H +#define CyteKit_CyteKit_H + +#include "CyteKit/Application.h" +#include "CyteKit/NavigationController.h" +#include "CyteKit/RegEx.hpp" +#include "CyteKit/TableViewCell.h" +#include "CyteKit/TabBarController.h" +#include "CyteKit/URLCache.h" +#include "CyteKit/WebViewController.h" +#include "CyteKit/WebViewTableViewCell.h" + +#include "CyteKit/countByEnumeratingWithState.h" +#include "CyteKit/stringWithUTF8Bytes.h" +#include "CyteKit/webScriptObjectInContext.h" + +#endif//CyteKit_CyteKit_H diff --git a/CyteKit/WebView.mm b/CyteKit/WebView.mm index 3711587..9e0cbea 100644 --- a/CyteKit/WebView.mm +++ b/CyteKit/WebView.mm @@ -417,3 +417,29 @@ __attribute__((__constructor__)) static void $() { class_addMethod($UIWebViewWebViewDelegate, @selector(_clearUIWebView), (IMP) &$UIWebViewWebViewDelegate$_clearUIWebView, "v8@0:4"); } } + +@implementation UIWebDocumentView (Cydia) + +- (void) _setScrollerOffset:(CGPoint)offset { + UIScroller *scroller([self _scroller]); + + CGSize size([scroller contentSize]); + CGSize bounds([scroller bounds].size); + + CGPoint max; + max.x = size.width - bounds.width; + max.y = size.height - bounds.height; + + // wtf Apple?! + if (max.x < 0) + max.x = 0; + if (max.y < 0) + max.y = 0; + + offset.x = offset.x < 0 ? 0 : offset.x > max.x ? max.x : offset.x; + offset.y = offset.y < 0 ? 0 : offset.y > max.y ? max.y : offset.y; + + [scroller setOffset:offset]; +} + +@end diff --git a/CyteKit/WebViewController.mm b/CyteKit/WebViewController.mm index 20838bf..40b1200 100644 --- a/CyteKit/WebViewController.mm +++ b/CyteKit/WebViewController.mm @@ -19,6 +19,8 @@ extern NSString * const kCAFilterNearest; #include <dlfcn.h> #include <objc/runtime.h> +#include "Substrate.hpp" + #define ForSaurik 0 #define DefaultTimeout_ 120.0 @@ -1297,3 +1299,29 @@ float CYScrollViewDecelerationRateNormal; } @end + +MSClassHook(WAKWindow) + +static CGSize $WAKWindow$screenSize(WAKWindow *self, SEL _cmd) { + CGSize size([[UIScreen mainScreen] bounds].size); + /*if ([$WAKWindow respondsToSelector:@selector(hasLandscapeOrientation)]) + if ([$WAKWindow hasLandscapeOrientation]) + std::swap(size.width, size.height);*/ + return size; +} + +static struct WAKWindow$screenSize { WAKWindow$screenSize() { + if ($WAKWindow != NULL) + if (Method method = class_getInstanceMethod($WAKWindow, @selector(screenSize))) + method_setImplementation(method, (IMP) &$WAKWindow$screenSize); +} } WAKWindow$screenSize;; + +MSClassHook(NSUserDefaults) + +MSHook(id, NSUserDefaults$objectForKey$, NSUserDefaults *self, SEL _cmd, NSString *key) { + if ([key respondsToSelector:@selector(isEqualToString:)] && [key isEqualToString:@"WebKitLocalStorageDatabasePathPreferenceKey"]) + return [NSString stringWithFormat:@"%@/%@/%@", NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject, NSBundle.mainBundle.bundleIdentifier, @"LocalStorage"]; + return _NSUserDefaults$objectForKey$(self, _cmd, key); +} + +CYHook(NSUserDefaults, objectForKey$, objectForKey:) diff --git a/CyteKit/WebScriptObject-Cyte.h b/CyteKit/countByEnumeratingWithState.h index 6a394bc..32106fa 100644 --- a/CyteKit/WebScriptObject-Cyte.h +++ b/CyteKit/countByEnumeratingWithState.h @@ -19,15 +19,21 @@ **/ /* }}} */ -#ifndef CyteKit_WebScriptObject_Cyte_H -#define CyteKit_WebScriptObject_Cyte_H +#ifndef CyteKit_countByEnumeratingWithState_H +#define CyteKit_countByEnumeratingWithState_H #include "iPhonePrivate.h" +@interface DOMNodeList (Cyte) +// XXX? - (NSUInteger) count; +- (NSUInteger) countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)objects count:(NSUInteger)count; +// XXX? - (id) objectAtIndex:(unsigned)index; +@end + @interface WebScriptObject (Cyte) - (NSUInteger) count; - (NSUInteger) countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)objects count:(NSUInteger)count; - (id) objectAtIndex:(unsigned)index; @end -#endif//CyteKit_WebScriptObject_Cyte_H +#endif//CyteKit_countByEnumeratingWithState_H diff --git a/CyteKit/WebScriptObject-Cyte.mm b/CyteKit/countByEnumeratingWithState.mm index 7fa851d..ca5e577 100644 --- a/CyteKit/WebScriptObject-Cyte.mm +++ b/CyteKit/countByEnumeratingWithState.mm @@ -21,10 +21,29 @@ #include "CyteKit/UCPlatform.h" -#include "CyteKit/WebScriptObject-Cyte.h" +#include "CyteKit/countByEnumeratingWithState.h" + +#include <objc/runtime.h> #include "iPhonePrivate.h" +static NSUInteger DOMNodeList$countByEnumeratingWithState$objects$count$(DOMNodeList *self, SEL sel, NSFastEnumerationState *state, id *objects, NSUInteger count) { + size_t length([self length] - state->state); + if (length <= 0) + return 0; + else if (length > count) + length = count; + for (size_t i(0); i != length; ++i) + objects[i] = [self item:state->state++]; + state->itemsPtr = objects; + state->mutationsPtr = (unsigned long *) self; + return length; +} + +static struct DOMNodeList$countByEnumeratingWithState { DOMNodeList$countByEnumeratingWithState() { + class_addMethod(objc_getClass("DOMNodeList"), @selector(countByEnumeratingWithState:objects:count:), (IMP) &DOMNodeList$countByEnumeratingWithState$objects$count$, "I20@0:4^{NSFastEnumerationState}8^@12I16"); +} } DOMNodeList$countByEnumeratingWithState; + @implementation WebScriptObject (Cyte) - (NSUInteger) count { diff --git a/CyteKit/webScriptObjectInContext.h b/CyteKit/webScriptObjectInContext.h new file mode 100644 index 0000000..a73c8ce --- /dev/null +++ b/CyteKit/webScriptObjectInContext.h @@ -0,0 +1,31 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see <http://www.gnu.org/licenses/>. +**/ +/* }}} */ + +#ifndef CyteKit_webScriptObjectInContext_H +#define CyteKit_webScriptObjectInContext_H + +#include "iPhonePrivate.h" + +@interface NSObject (CydiaScript) +- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context; +@end + +#endif//CyteKit_webScriptObjectInContext_H diff --git a/CyteKit/webScriptObjectInContext.mm b/CyteKit/webScriptObjectInContext.mm new file mode 100644 index 0000000..6f05336 --- /dev/null +++ b/CyteKit/webScriptObjectInContext.mm @@ -0,0 +1,56 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see <http://www.gnu.org/licenses/>. +**/ +/* }}} */ + +#include "CyteKit/UCPlatform.h" + +#include "CyteKit/webScriptObjectInContext.h" + +#include "iPhonePrivate.h" + +@implementation NSObject (CydiaScript) + +- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context { + return self; +} + +@end + +@implementation NSArray (CydiaScript) + +- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context { + WebScriptObject *object([context evaluateWebScript:@"[]"]); + for (size_t i(0), e([self count]); i != e; ++i) + [object setWebScriptValueAtIndex:i value:[[self objectAtIndex:i] Cydia$webScriptObjectInContext:context]]; + return object; +} + +@end + +@implementation NSDictionary (CydiaScript) + +- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context { + WebScriptObject *object([context evaluateWebScript:@"({})"]); + for (id i in self) + [object setValue:[[self objectForKey:i] Cydia$webScriptObjectInContext:context] forKey:i]; + return object; +} + +@end |