Skip to content

Commit a9f4fa0

Browse files
committed
Change JavaScriptInterface bridge to be called on a background thread
1 parent b690ccf commit a9f4fa0

1 file changed

Lines changed: 83 additions & 79 deletions

File tree

Sources/WKJavaScriptController/WKJavaScriptController.swift

Lines changed: 83 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -486,87 +486,91 @@ extension WKJavaScriptController: WKScriptMessageHandler {
486486
}
487487

488488
let imp = method_getImplementation(method)
489-
var result: Result!
490-
switch bridge.argumentCount {
491-
case 0:
492-
if bridge.isReturnRequired {
493-
result = unsafeBitCast(imp, to: XInvocation0.self)(target, bridge.nativeSelector)
494-
} else {
495-
unsafeBitCast(imp, to: Invocation0.self)(target, bridge.nativeSelector)
496-
}
497-
case 1:
498-
if bridge.isReturnRequired {
499-
result = unsafeBitCast(imp, to: XInvocation1.self)(target, bridge.nativeSelector, cast(args[0]))
500-
} else {
501-
unsafeBitCast(imp, to: Invocation1.self)(target, bridge.nativeSelector, cast(args[0]))
502-
}
503-
case 2:
504-
if bridge.isReturnRequired {
505-
result = unsafeBitCast(imp, to: XInvocation2.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]))
506-
} else {
507-
unsafeBitCast(imp, to: Invocation2.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]))
508-
}
509-
case 3:
510-
if bridge.isReturnRequired {
511-
result = unsafeBitCast(imp, to: XInvocation3.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]))
512-
} else {
513-
unsafeBitCast(imp, to: Invocation3.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]))
514-
}
515-
case 4:
516-
if bridge.isReturnRequired {
517-
result = unsafeBitCast(imp, to: XInvocation4.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]))
518-
} else {
519-
unsafeBitCast(imp, to: Invocation4.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]))
520-
}
521-
case 5:
522-
if bridge.isReturnRequired {
523-
result = unsafeBitCast(imp, to: XInvocation5.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]))
524-
} else {
525-
unsafeBitCast(imp, to: Invocation5.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]))
526-
}
527-
case 6:
528-
if bridge.isReturnRequired {
529-
result = unsafeBitCast(imp, to: XInvocation6.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]))
530-
} else {
531-
unsafeBitCast(imp, to: Invocation6.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]))
532-
}
533-
case 7:
534-
if bridge.isReturnRequired {
535-
result = unsafeBitCast(imp, to: XInvocation7.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]))
536-
} else {
537-
unsafeBitCast(imp, to: Invocation7.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]))
538-
}
539-
case 8:
540-
if bridge.isReturnRequired {
541-
result = unsafeBitCast(imp, to: XInvocation8.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]))
542-
} else {
543-
unsafeBitCast(imp, to: Invocation8.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]))
544-
}
545-
case 9:
546-
if bridge.isReturnRequired {
547-
result = unsafeBitCast(imp, to: XInvocation9.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]))
548-
} else {
549-
unsafeBitCast(imp, to: Invocation9.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]))
489+
DispatchQueue.global().async {
490+
var result: Result!
491+
switch bridge.argumentCount {
492+
case 0:
493+
if bridge.isReturnRequired {
494+
result = unsafeBitCast(imp, to: XInvocation0.self)(target, bridge.nativeSelector)
495+
} else {
496+
unsafeBitCast(imp, to: Invocation0.self)(target, bridge.nativeSelector)
497+
}
498+
case 1:
499+
if bridge.isReturnRequired {
500+
result = unsafeBitCast(imp, to: XInvocation1.self)(target, bridge.nativeSelector, self.cast(args[0]))
501+
} else {
502+
unsafeBitCast(imp, to: Invocation1.self)(target, bridge.nativeSelector, self.cast(args[0]))
503+
}
504+
case 2:
505+
if bridge.isReturnRequired {
506+
result = unsafeBitCast(imp, to: XInvocation2.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]))
507+
} else {
508+
unsafeBitCast(imp, to: Invocation2.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]))
509+
}
510+
case 3:
511+
if bridge.isReturnRequired {
512+
result = unsafeBitCast(imp, to: XInvocation3.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]))
513+
} else {
514+
unsafeBitCast(imp, to: Invocation3.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]))
515+
}
516+
case 4:
517+
if bridge.isReturnRequired {
518+
result = unsafeBitCast(imp, to: XInvocation4.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]))
519+
} else {
520+
unsafeBitCast(imp, to: Invocation4.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]))
521+
}
522+
case 5:
523+
if bridge.isReturnRequired {
524+
result = unsafeBitCast(imp, to: XInvocation5.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]))
525+
} else {
526+
unsafeBitCast(imp, to: Invocation5.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]))
527+
}
528+
case 6:
529+
if bridge.isReturnRequired {
530+
result = unsafeBitCast(imp, to: XInvocation6.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]))
531+
} else {
532+
unsafeBitCast(imp, to: Invocation6.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]))
533+
}
534+
case 7:
535+
if bridge.isReturnRequired {
536+
result = unsafeBitCast(imp, to: XInvocation7.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]))
537+
} else {
538+
unsafeBitCast(imp, to: Invocation7.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]))
539+
}
540+
case 8:
541+
if bridge.isReturnRequired {
542+
result = unsafeBitCast(imp, to: XInvocation8.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]))
543+
} else {
544+
unsafeBitCast(imp, to: Invocation8.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]))
545+
}
546+
case 9:
547+
if bridge.isReturnRequired {
548+
result = unsafeBitCast(imp, to: XInvocation9.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]))
549+
} else {
550+
unsafeBitCast(imp, to: Invocation9.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]))
551+
}
552+
case argumentCountLimit:
553+
if bridge.isReturnRequired {
554+
result = unsafeBitCast(imp, to: XInvocation10.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]), self.cast(args[9]))
555+
} else {
556+
unsafeBitCast(imp, to: Invocation10.self)(target, bridge.nativeSelector, self.cast(args[0]), self.cast(args[1]), self.cast(args[2]), self.cast(args[3]), self.cast(args[4]), self.cast(args[5]), self.cast(args[6]), self.cast(args[7]), self.cast(args[8]), self.cast(args[9]))
557+
}
558+
default:
559+
// Not called.
560+
break
550561
}
551-
case argumentCountLimit:
552-
if bridge.isReturnRequired {
553-
result = unsafeBitCast(imp, to: XInvocation10.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]), cast(args[9]))
554-
} else {
555-
unsafeBitCast(imp, to: Invocation10.self)(target, bridge.nativeSelector, cast(args[0]), cast(args[1]), cast(args[2]), cast(args[3]), cast(args[4]), cast(args[5]), cast(args[6]), cast(args[7]), cast(args[8]), cast(args[9]))
562+
563+
DispatchQueue.main.async {
564+
let script = """
565+
(() => {
566+
const callback = \(self.name).\(ReserveKeyword.callbackList)['\(callbackId)'];
567+
callback.end = new Date();
568+
callback.resolve(\(bridge.isReturnRequired ? self.stringFrom(result) : ""));
569+
clearTimeout(callback.timer);
570+
})();
571+
"""
572+
self.webView?.evaluateJavaScript(script, completionHandler: nil)
556573
}
557-
default:
558-
// Not called.
559-
break
560574
}
561-
562-
let script = """
563-
(() => {
564-
const callback = \(name).\(ReserveKeyword.callbackList)['\(callbackId)'];
565-
callback.end = new Date();
566-
callback.resolve(\(bridge.isReturnRequired ? stringFrom(result) : ""));
567-
clearTimeout(callback.timer);
568-
})();
569-
"""
570-
webView?.evaluateJavaScript(script, completionHandler: nil)
571575
}
572576
}

0 commit comments

Comments
 (0)