1 /* Cydia - iPhone UIKit Front-End for Debian APT
 
   2  * Copyright (C) 2008-2015  Jay Freeman (saurik)
 
   5 /* GNU General Public License, Version 3 {{{ */
 
   7  * Cydia is free software: you can redistribute it and/or modify
 
   8  * it under the terms of the GNU General Public License as published
 
   9  * by the Free Software Foundation, either version 3 of the License,
 
  10  * or (at your option) any later version.
 
  12  * Cydia is distributed in the hope that it will be useful, but
 
  13  * WITHOUT ANY WARRANTY; without even the implied warranty of
 
  14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  15  * GNU General Public License for more details.
 
  17  * You should have received a copy of the GNU General Public License
 
  18  * along with Cydia.  If not, see <http://www.gnu.org/licenses/>.
 
  22 #include "CyteKit/UCPlatform.h"
 
  24 #include "CyteKit/dispatchEvent.h"
 
  25 #include "CyteKit/WebThreadLocked.hpp"
 
  27 #include "Substrate.hpp"
 
  29 @implementation UIWebDocumentView (CyteDispatchEvent)
 
  31 - (void) dispatchEvent:(NSString *)event {
 
  34     NSString *script([NSString stringWithFormat:@
 
  36             "var event = this.document.createEvent('Events');"
 
  37             "event.initEvent('%@', false, false);"
 
  38             "this.document.dispatchEvent(event);"
 
  42     NSMutableArray *frames([NSMutableArray arrayWithObjects:
 
  43         [[self webView] mainFrame]
 
  46     while (WebFrame *frame = [frames lastObject]) {
 
  47         WebScriptObject *object([frame windowObject]);
 
  48         [object evaluateWebScript:script];
 
  49         [frames removeLastObject];
 
  50         [frames addObjectsFromArray:[frame childFrames]];
 
  56 MSHook(void, UIWebBrowserView$_webTouchEventsRecognized$, UIWebBrowserView *self, SEL _cmd, UIWebTouchEventsGestureRecognizer *recognizer) {
 
  57     _UIWebBrowserView$_webTouchEventsRecognized$(self, _cmd, recognizer);
 
  59     switch ([recognizer type]) {
 
  60         case WebEventTouchEnd:
 
  61             [self dispatchEvent:@"CydiaTouchEnd"];
 
  64         case WebEventTouchCancel:
 
  65             [self dispatchEvent:@"CydiaTouchCancel"];
 
  70 __attribute__((__constructor__)) static void $() {
 
  71     if (Class $UIWebBrowserView = objc_getClass("UIWebBrowserView")) {
 
  72         if (Method method = class_getInstanceMethod($UIWebBrowserView, @selector(_webTouchEventsRecognized:))) {
 
  73             _UIWebBrowserView$_webTouchEventsRecognized$ = reinterpret_cast<void (*)(UIWebBrowserView *, SEL, UIWebTouchEventsGestureRecognizer *)>(method_getImplementation(method));
 
  74             method_setImplementation(method, reinterpret_cast<IMP>(&$UIWebBrowserView$_webTouchEventsRecognized$));