diff options
-rw-r--r-- | CyteKit/CyteWebView.h | 1 | ||||
-rw-r--r-- | CyteKit/CyteWebView.mm | 24 | ||||
-rw-r--r-- | CyteKit/CyteWebViewController.mm | 34 | ||||
-rw-r--r-- | CyteKit/WebThreadLocked.hpp | 56 |
4 files changed, 83 insertions, 32 deletions
diff --git a/CyteKit/CyteWebView.h b/CyteKit/CyteWebView.h index 12e47fc..7db1e11 100644 --- a/CyteKit/CyteWebView.h +++ b/CyteKit/CyteWebView.h @@ -72,6 +72,7 @@ } - (id<CYWebViewDelegate>) delegate; +- (void) dispatchEvent:(NSString *)event; @end diff --git a/CyteKit/CyteWebView.mm b/CyteKit/CyteWebView.mm index 720bb72..5c07039 100644 --- a/CyteKit/CyteWebView.mm +++ b/CyteKit/CyteWebView.mm @@ -38,6 +38,7 @@ /* }}} */ #include "CyteKit/CyteWebView.h" +#include "CyteKit/WebThreadLocked.hpp" #include <CydiaSubstrate/CydiaSubstrate.h> @@ -326,6 +327,29 @@ static void $UIWebViewWebViewDelegate$webViewClose$(UIWebViewWebViewDelegate *se [delegate webViewUpdateViewSettings:self]; } +- (void) dispatchEvent:(NSString *)event { + WebThreadLocked lock; + + NSString *script([NSString stringWithFormat:@ + "(function() {" + "var event = this.document.createEvent('Events');" + "event.initEvent('%@', false, false);" + "this.document.dispatchEvent(event);" + "})();" + , event]); + + NSMutableArray *frames([NSMutableArray arrayWithObjects: + [[[self _documentView] webView] mainFrame] + , nil]); + + while (WebFrame *frame = [frames lastObject]) { + WebScriptObject *object([frame windowObject]); + [object evaluateWebScript:script]; + [frames removeLastObject]; + [frames addObjectsFromArray:[frame childFrames]]; + } +} + + (void) initialize { if (Class $UIWebViewWebViewDelegate = objc_getClass("UIWebViewWebViewDelegate")) { class_addMethod($UIWebViewWebViewDelegate, @selector(webView:addMessageToConsole:), (IMP) &$UIWebViewWebViewDelegate$webView$addMessageToConsole$, "v16@0:4@8@12"); diff --git a/CyteKit/CyteWebViewController.mm b/CyteKit/CyteWebViewController.mm index 9db2c8a..5c7ceaf 100644 --- a/CyteKit/CyteWebViewController.mm +++ b/CyteKit/CyteWebViewController.mm @@ -6,6 +6,7 @@ #include "CyteKit/CyteLocalize.h" #include "CyteKit/CyteWebViewController.h" #include "CyteKit/PerlCompatibleRegEx.hpp" +#include "CyteKit/WebThreadLocked.hpp" //#include <QuartzCore/CALayer.h> // XXX: fix the minimum requirement @@ -30,18 +31,6 @@ extern NSString * const kCAFilterNearest; #define lprintf(args...) fprintf(stderr, args) -// WebThreadLocked {{{ -struct WebThreadLocked { - _finline WebThreadLocked() { - WebThreadLock(); - } - - _finline ~WebThreadLocked() { - WebThreadUnlock(); - } -}; -// }}} - template <typename Type_> static inline void CYRelease(Type_ &value) { if (value != nil) { @@ -890,26 +879,7 @@ float CYScrollViewDecelerationRateNormal; } - (void) dispatchEvent:(NSString *)event { - WebThreadLocked lock; - - NSString *script([NSString stringWithFormat:@ - "(function() {" - "var event = this.document.createEvent('Events');" - "event.initEvent('%@', false, false);" - "this.document.dispatchEvent(event);" - "})();" - , event]); - - NSMutableArray *frames([NSMutableArray arrayWithObjects: - [[[webview_ _documentView] webView] mainFrame] - , nil]); - - while (WebFrame *frame = [frames lastObject]) { - WebScriptObject *object([frame windowObject]); - [object evaluateWebScript:script]; - [frames removeLastObject]; - [frames addObjectsFromArray:[frame childFrames]]; - } + [webview_ dispatchEvent:event]; } - (bool) hidesNavigationBar { diff --git a/CyteKit/WebThreadLocked.hpp b/CyteKit/WebThreadLocked.hpp new file mode 100644 index 0000000..9614cee --- /dev/null +++ b/CyteKit/WebThreadLocked.hpp @@ -0,0 +1,56 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2011 Jay Freeman (saurik) +*/ + +/* Modified BSD License {{{ */ +/* + * Redistribution and use in source and binary + * forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the + * above copyright notice, this list of conditions + * and the following disclaimer. + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions + * and the following disclaimer in the documentation + * and/or other materials provided with the + * distribution. + * 3. The name of the author may not be used to endorse + * or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* }}} */ + +#ifndef CyteKit_WebThreadLocked_HPP +#define CyteKit_WebThreadLocked_HPP + +#include "CyteKit/UCPlatform.h" +#include "WebCore/WebCoreThread.h" + +struct WebThreadLocked { + _finline WebThreadLocked() { + WebThreadLock(); + } + + _finline ~WebThreadLocked() { + WebThreadUnlock(); + } +}; + +#endif//CyteKit_WebThreadLocked_HPP |