added return value for JavaScriptHandlerCallback, added flutterInAppBrowserPlatformReady event for javascript, breaking change: javaScriptHandlersMap contains only one callback
This commit is contained in:
parent
f3f0876f28
commit
a480ebf6a1
|
@ -15,48 +15,29 @@
|
|||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="9b41f7a2-a71e-4923-91fb-249d7815b3e7" name="Default" comment="">
|
||||
<change afterPath="$PROJECT_DIR$/example/assets/page-1.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/example/assets/page-2.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/example/assets/page-3.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/assets/page-1.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/assets/page-2.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/assets/page-3.html" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/JsonSerializer.swift" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/ios/Classes/JsonSerializer.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/CHANGELOG.md" beforeDir="false" afterPath="$PROJECT_DIR$/CHANGELOG.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/FlutterWebView.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/FlutterWebView.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserActivity.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserActivity.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserFlutterPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserFlutterPlugin.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/android/build.gradle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebView.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebView.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebViewClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebViewClient.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/JavaScriptBridgeInterface.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/JavaScriptBridgeInterface.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/assets/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/example/assets/index.html" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/CHANGELOG.md" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/CHANGELOG.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/FlutterWebView.java" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/FlutterWebView.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserActivity.java" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserActivity.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserFlutterPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserFlutterPlugin.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/build.gradle" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebView.java" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebView.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebViewClient.java" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppWebView/InAppWebViewClient.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/JavaScriptBridgeInterface.java" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/JavaScriptBridgeInterface.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/assets/index.html" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/assets/index.html" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/ios/Runner.xcodeproj/project.pbxproj" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/ios/Runner.xcodeproj/project.pbxproj" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/chrome_safari_example.screen.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/chrome_safari_example.screen.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/inline_example.screen.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/inline_example.screen.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/main.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/main.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/webview_example.screen.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/lib/webview_example.screen.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/pubspec.yaml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/flutter_inappbrowser.iml" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/flutter_inappbrowser.iml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/FlutterWebViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/FlutterWebViewController.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/InAppBrowserWebViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/InAppBrowserWebViewController.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/InAppWebView.swift" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/InAppWebView.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/SwiftFlutterPlugin.swift" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/ios/Classes/SwiftFlutterPlugin.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/Runner.xcodeproj/project.pbxproj" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/Runner.xcodeproj/project.pbxproj" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/lib/chrome_safari_example.screen.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/chrome_safari_example.screen.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/lib/flutter_inappbrowser.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/lib/flutter_inappbrowser.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/pubspec.yaml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/lib/inline_example.screen.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/inline_example.screen.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/lib/main.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/main.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/lib/webview_example.screen.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/webview_example.screen.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/example/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/example/pubspec.yaml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/flutter_inappbrowser.iml" beforeDir="false" afterPath="$PROJECT_DIR$/flutter_inappbrowser.iml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ios/Classes/FlutterWebViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/ios/Classes/FlutterWebViewController.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ios/Classes/InAppBrowserWebViewController.swift" beforeDir="false" afterPath="$PROJECT_DIR$/ios/Classes/InAppBrowserWebViewController.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ios/Classes/InAppWebView.swift" beforeDir="false" afterPath="$PROJECT_DIR$/ios/Classes/InAppWebView.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ios/Classes/SwiftFlutterPlugin.swift" beforeDir="false" afterPath="$PROJECT_DIR$/ios/Classes/SwiftFlutterPlugin.swift" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/pubspec.yaml" afterDir="false" />
|
||||
</list>
|
||||
<ignored path="$PROJECT_DIR$/.dart_tool/" />
|
||||
|
@ -75,8 +56,41 @@
|
|||
<session id="-1166585903">
|
||||
<usages-collector id="statistics.lifecycle.project">
|
||||
<counts>
|
||||
<entry key="project.closed" value="2" />
|
||||
<entry key="project.open.time.10" value="1" />
|
||||
<entry key="project.open.time.11" value="1" />
|
||||
<entry key="project.opened" value="1" />
|
||||
<entry key="project.open.time.14" value="1" />
|
||||
<entry key="project.opened" value="3" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.extensions.edit">
|
||||
<counts>
|
||||
<entry key="dart" value="296" />
|
||||
<entry key="html" value="229" />
|
||||
<entry key="md" value="7" />
|
||||
<entry key="yaml" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.types.edit">
|
||||
<counts>
|
||||
<entry key="Dart" value="296" />
|
||||
<entry key="HTML" value="229" />
|
||||
<entry key="Markdown" value="7" />
|
||||
<entry key="YAML" value="2" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.extensions.open">
|
||||
<counts>
|
||||
<entry key="dart" value="6" />
|
||||
<entry key="gradle" value="1" />
|
||||
<entry key="html" value="5" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
<usages-collector id="statistics.file.types.open">
|
||||
<counts>
|
||||
<entry key="Dart" value="6" />
|
||||
<entry key="Groovy" value="1" />
|
||||
<entry key="HTML" value="5" />
|
||||
</counts>
|
||||
</usages-collector>
|
||||
</session>
|
||||
|
@ -86,17 +100,38 @@
|
|||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="45">
|
||||
<caret line="3" column="24" selection-start-line="3" selection-start-column="24" selection-end-line="3" selection-end-column="24" />
|
||||
<state relative-caret-position="30">
|
||||
<caret line="2" column="14" selection-start-line="2" selection-start-column="14" selection-end-line="2" selection-end-column="14" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="224">
|
||||
<caret line="47" column="36" selection-start-line="47" selection-start-column="14" selection-end-line="47" selection-end-column="36" />
|
||||
<folding>
|
||||
<element signature="e#0#20#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/inline_example.screen.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="45">
|
||||
<caret line="3" column="19" lean-forward="true" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
|
||||
<state relative-caret-position="279">
|
||||
<caret line="87" column="33" lean-forward="true" selection-start-line="87" selection-start-column="33" selection-end-line="87" selection-end-column="33" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/index.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="184">
|
||||
<caret line="27" column="10" lean-forward="true" selection-start-line="27" selection-start-column="10" selection-end-line="27" selection-end-column="10" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
@ -112,16 +147,12 @@
|
|||
</component>
|
||||
<component name="FindInProjectRecents">
|
||||
<findStrings>
|
||||
<find>onBrowserCreated</find>
|
||||
<find>getUrl</find>
|
||||
<find>onScrollChanged</find>
|
||||
<find>initialData</find>
|
||||
<find>openData</find>
|
||||
<find>optionsType</find>
|
||||
<find>InAppWebView</find>
|
||||
<find>fromInAppBrowser</find>
|
||||
<find>InAppWebViewController</find>
|
||||
<find>_handleMethod</find>
|
||||
<find>InAppBrowser</find>
|
||||
<find>handlerTest</find>
|
||||
<find>onLoadStart</find>
|
||||
|
@ -142,6 +173,10 @@
|
|||
<find>openFile</find>
|
||||
<find>File</find>
|
||||
<find>onExit</find>
|
||||
<find>_handleMethod</find>
|
||||
<find>javaScriptHandlersMap</find>
|
||||
<find>JavaScriptHandlerCallback</find>
|
||||
<find>onConsoleM</find>
|
||||
</findStrings>
|
||||
<replaceStrings>
|
||||
<replace>activity.getPreferences(0)</replace>
|
||||
|
@ -181,25 +216,25 @@
|
|||
<option value="$PROJECT_DIR$/example/assets/css/style.css" />
|
||||
<option value="$PROJECT_DIR$/example/ios/Flutter/Generated.xcconfig" />
|
||||
<option value="$PROJECT_DIR$/example/ios/Runner/Info.plist" />
|
||||
<option value="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" />
|
||||
<option value="$PROJECT_DIR$/android/gradle/wrapper/gradle-wrapper.properties" />
|
||||
<option value="$PROJECT_DIR$/README.md" />
|
||||
<option value="$PROJECT_DIR$/example/android/app/build.gradle" />
|
||||
<option value="$PROJECT_DIR$/example/android/gradle.properties" />
|
||||
<option value="$PROJECT_DIR$/android/build.gradle" />
|
||||
<option value="$PROJECT_DIR$/example/android/build.gradle" />
|
||||
<option value="$PROJECT_DIR$/example/pubspec.yaml" />
|
||||
<option value="$PROJECT_DIR$/example/assets/index.html" />
|
||||
<option value="$PROJECT_DIR$/example/assets/page-1.html" />
|
||||
<option value="$PROJECT_DIR$/example/assets/page-2.html" />
|
||||
<option value="$PROJECT_DIR$/example/assets/page-3.html" />
|
||||
<option value="$PROJECT_DIR$/example/lib/main.dart" />
|
||||
<option value="$PROJECT_DIR$/example/lib/chrome_safari_example.screen.dart" />
|
||||
<option value="$PROJECT_DIR$/example/lib/test.dart" />
|
||||
<option value="$PROJECT_DIR$/example/lib/webview_example.screen.dart" />
|
||||
<option value="$PROJECT_DIR$/example/lib/inline_example.screen.dart" />
|
||||
<option value="$PROJECT_DIR$/pubspec.yaml" />
|
||||
<option value="$PROJECT_DIR$/README.md" />
|
||||
<option value="$PROJECT_DIR$/CHANGELOG.md" />
|
||||
<option value="$PROJECT_DIR$/example/lib/main.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" />
|
||||
<option value="$PROJECT_DIR$/example/lib/webview_example.screen.dart" />
|
||||
<option value="$PROJECT_DIR$/pubspec.yaml" />
|
||||
<option value="$PROJECT_DIR$/example/assets/index.html" />
|
||||
<option value="$PROJECT_DIR$/example/lib/inline_example.screen.dart" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
|
@ -214,17 +249,6 @@
|
|||
<foldersAlwaysOnTop value="true" />
|
||||
</navigator>
|
||||
<panes>
|
||||
<pane id="Scope">
|
||||
<subPane subId="Project Files">
|
||||
<expand>
|
||||
<path>
|
||||
<item name="Root" type="cbb8eebc:String" user="Root" />
|
||||
<item name="flutter_inappbrowser" type="cbb8eebc:String" user="flutter_inappbrowser" />
|
||||
</path>
|
||||
</expand>
|
||||
<select />
|
||||
</subPane>
|
||||
</pane>
|
||||
<pane id="AndroidView">
|
||||
<subPane>
|
||||
<expand>
|
||||
|
@ -254,7 +278,6 @@
|
|||
<select />
|
||||
</subPane>
|
||||
</pane>
|
||||
<pane id="PackagesPane" />
|
||||
<pane id="ProjectPane">
|
||||
<subPane>
|
||||
<expand>
|
||||
|
@ -272,6 +295,18 @@
|
|||
</subPane>
|
||||
<option name="show-excluded-files" value="false" />
|
||||
</pane>
|
||||
<pane id="PackagesPane" />
|
||||
<pane id="Scope">
|
||||
<subPane subId="Project Files">
|
||||
<expand>
|
||||
<path>
|
||||
<item name="Root" type="cbb8eebc:String" user="Root" />
|
||||
<item name="flutter_inappbrowser" type="cbb8eebc:String" user="flutter_inappbrowser" />
|
||||
</path>
|
||||
</expand>
|
||||
<select />
|
||||
</subPane>
|
||||
</pane>
|
||||
</panes>
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
|
@ -411,18 +446,17 @@
|
|||
<frame x="0" y="23" width="1920" height="1057" extended-state="0" />
|
||||
<editor active="true" />
|
||||
<layout>
|
||||
<window_info active="true" content_ui="combo" id="Project" order="0" sideWeight="0.6496815" visible="true" weight="0.18210863" />
|
||||
<window_info id="Structure" order="1" sideWeight="0.35031846" side_tool="true" visible="true" weight="0.18210863" />
|
||||
<window_info content_ui="combo" id="Project" order="0" sideWeight="0.64341086" visible="true" weight="0.18210863" />
|
||||
<window_info id="Structure" order="1" sideWeight="0.35658914" side_tool="true" visible="true" weight="0.18210863" />
|
||||
<window_info id="Designer" order="2" />
|
||||
<window_info id="Build Variants" order="3" side_tool="true" />
|
||||
<window_info id="Captures" order="4" side_tool="true" weight="0.32936507" />
|
||||
<window_info id="Favorites" order="5" side_tool="true" />
|
||||
<window_info id="Capture Tool" order="6" />
|
||||
<window_info id="Image Layers" order="7" />
|
||||
<window_info anchor="bottom" id="Flutter Performance" side_tool="true" />
|
||||
<window_info anchor="bottom" id="Message" order="0" />
|
||||
<window_info anchor="bottom" id="Find" order="1" weight="0.32745314" />
|
||||
<window_info anchor="bottom" id="Run" order="2" sideWeight="0.49478307" weight="0.30522946" />
|
||||
<window_info anchor="bottom" id="Run" order="2" sideWeight="0.49478307" weight="0.42356688" />
|
||||
<window_info anchor="bottom" id="Debug" order="3" weight="0.34288865" />
|
||||
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
|
||||
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
|
||||
|
@ -430,11 +464,12 @@
|
|||
<window_info anchor="bottom" id="Android Profiler" order="7" show_stripe_button="false" />
|
||||
<window_info anchor="bottom" id="Event Log" order="8" sideWeight="0.5052169" side_tool="true" weight="0.34068358" />
|
||||
<window_info anchor="bottom" id="Version Control" order="9" />
|
||||
<window_info anchor="bottom" id="Terminal" order="10" sideWeight="0.49533224" weight="0.2113127" />
|
||||
<window_info active="true" anchor="bottom" id="Terminal" order="10" sideWeight="0.49533224" visible="true" weight="0.4522293" />
|
||||
<window_info anchor="bottom" id="Logcat" order="11" />
|
||||
<window_info anchor="bottom" id="Messages" order="12" weight="0.23585913" />
|
||||
<window_info anchor="bottom" id="Messages" order="12" weight="0.2356688" />
|
||||
<window_info anchor="bottom" id="Dependency Viewer" order="13" weight="0.32800853" />
|
||||
<window_info anchor="bottom" id="Dart Analysis" order="14" weight="0.32657418" />
|
||||
<window_info anchor="bottom" id="Flutter Performance" order="15" side_tool="true" />
|
||||
<window_info anchor="right" id="Commander" order="0" weight="0.4" />
|
||||
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
|
||||
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
|
||||
|
@ -454,11 +489,6 @@
|
|||
<option name="myLimit" value="2678400000" />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$PROJECT_DIR$/.idea/workspace.xml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-10645" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/string.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="173">
|
||||
|
@ -616,20 +646,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/README.md">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="15">
|
||||
<caret line="24" column="39" selection-start-line="24" selection-start-column="39" selection-end-line="24" selection-end-column="39" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/android/build.gradle">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state>
|
||||
<caret line="13" selection-start-line="13" selection-end-line="14" selection-end-column="22" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/ios/flutter_inappbrowser.podspec">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="330">
|
||||
|
@ -644,34 +660,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/page-2.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="30" selection-start-line="18" selection-start-column="30" selection-end-line="18" selection-end-column="30" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/page-3.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="30" selection-start-line="18" selection-start-column="30" selection-end-line="18" selection-end-column="30" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/page-1.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="30" selection-start-line="18" selection-start-column="30" selection-end-line="18" selection-end-column="30" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/index.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="28" selection-start-line="18" selection-start-column="28" selection-end-line="18" selection-end-column="28" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/css/style.css">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="75">
|
||||
|
@ -686,31 +674,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="205">
|
||||
<caret line="371" column="13" selection-start-line="371" selection-start-column="7" selection-end-line="371" selection-end-column="13" />
|
||||
<folding>
|
||||
<element signature="e#0#65617#0" expanded="true" />
|
||||
<element signature="e#814#831#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/webview_example.screen.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-217">
|
||||
<caret line="19" column="33" lean-forward="true" selection-start-line="19" selection-start-column="33" selection-end-line="19" selection-end-column="33" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/inline_example.screen.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="371">
|
||||
<caret line="67" column="37" lean-forward="true" selection-start-line="67" selection-start-column="37" selection-end-line="67" selection-end-column="37" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/test.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="184">
|
||||
|
@ -718,10 +681,73 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="120">
|
||||
<caret line="8" column="37" lean-forward="true" selection-start-line="8" selection-start-column="37" selection-end-line="8" selection-end-column="37" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/README.md">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="255">
|
||||
<caret line="17" selection-start-line="17" selection-end-line="17" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$USER_HOME$/flutter/bin/cache/pkg/sky_engine/lib/core/map.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2729">
|
||||
<caret line="317" column="37" selection-start-line="317" selection-start-column="27" selection-end-line="317" selection-end-column="37" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/page-1.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="30" selection-start-line="18" selection-start-column="30" selection-end-line="18" selection-end-column="30" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/page-2.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="30" selection-start-line="18" selection-start-column="30" selection-end-line="18" selection-end-column="30" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/page-3.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="270">
|
||||
<caret line="18" column="30" selection-start-line="18" selection-start-column="30" selection-end-line="18" selection-end-column="30" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="158">
|
||||
<caret line="610" column="50" selection-start-line="610" selection-start-column="40" selection-end-line="610" selection-end-column="50" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/webview_example.screen.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="240">
|
||||
<caret line="19" column="33" lean-forward="true" selection-start-line="19" selection-start-column="33" selection-end-line="19" selection-end-column="33" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/android/build.gradle">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-12">
|
||||
<caret line="28" column="18" selection-start-line="28" selection-start-column="18" selection-end-line="28" selection-end-column="18" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/main.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="210">
|
||||
<caret line="14" column="27" selection-start-line="14" selection-start-column="27" selection-end-line="14" selection-end-column="27" />
|
||||
<state relative-caret-position="224">
|
||||
<caret line="47" column="36" selection-start-line="47" selection-start-column="14" selection-end-line="47" selection-end-column="36" />
|
||||
<folding>
|
||||
<element signature="e#0#20#0" expanded="true" />
|
||||
</folding>
|
||||
|
@ -730,15 +756,22 @@
|
|||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="45">
|
||||
<caret line="3" column="24" selection-start-line="3" selection-start-column="24" selection-end-line="3" selection-end-column="24" />
|
||||
<state relative-caret-position="30">
|
||||
<caret line="2" column="14" selection-start-line="2" selection-start-column="14" selection-end-line="2" selection-end-column="14" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
|
||||
<entry file="file://$PROJECT_DIR$/example/assets/index.html">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="45">
|
||||
<caret line="3" column="19" lean-forward="true" selection-start-line="3" selection-start-column="19" selection-end-line="3" selection-end-column="19" />
|
||||
<state relative-caret-position="184">
|
||||
<caret line="27" column="10" lean-forward="true" selection-start-line="27" selection-start-column="10" selection-end-line="27" selection-end-column="10" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/example/lib/inline_example.screen.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="279">
|
||||
<caret line="87" column="33" lean-forward="true" selection-start-line="87" selection-start-column="33" selection-end-line="87" selection-end-column="33" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
|
|
@ -53,4 +53,5 @@ dependencies {
|
|||
implementation 'androidx.browser:browser:1.0.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.0.2'
|
||||
implementation 'com.squareup.okhttp3:mockwebserver:3.11.0'
|
||||
implementation 'com.google.code.gson:gson:2.8.5'
|
||||
}
|
||||
|
|
|
@ -76,6 +76,8 @@ public class InAppWebView extends WebView {
|
|||
" }" +
|
||||
"})();";
|
||||
|
||||
static final String platformReadyJS = "window.dispatchEvent(new Event('flutterInAppBrowserPlatformReady'));";
|
||||
|
||||
public InAppWebView(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import android.webkit.CookieManager;
|
|||
import android.webkit.CookieSyncManager;
|
||||
import android.webkit.HttpAuthHandler;
|
||||
import android.webkit.SslErrorHandler;
|
||||
import android.webkit.ValueCallback;
|
||||
import android.webkit.WebResourceRequest;
|
||||
import android.webkit.WebResourceResponse;
|
||||
import android.webkit.WebView;
|
||||
|
@ -195,7 +196,7 @@ public class InAppWebViewClient extends WebViewClient {
|
|||
}
|
||||
|
||||
|
||||
public void onPageFinished(WebView view, String url) {
|
||||
public void onPageFinished(final WebView view, String url) {
|
||||
super.onPageFinished(view, url);
|
||||
|
||||
((inAppBrowserActivity != null) ? inAppBrowserActivity.webView : flutterWebView.webView).isLoading = false;
|
||||
|
@ -213,11 +214,18 @@ public class InAppWebViewClient extends WebViewClient {
|
|||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
view.evaluateJavascript(InAppWebView.consoleLogJS, null);
|
||||
view.evaluateJavascript(JavaScriptBridgeInterface.flutterInAppBroserJSClass, null);
|
||||
view.evaluateJavascript(JavaScriptBridgeInterface.flutterInAppBroserJSClass, new ValueCallback<String>() {
|
||||
@Override
|
||||
public void onReceiveValue(String value) {
|
||||
view.evaluateJavascript(InAppWebView.platformReadyJS, null);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
else {
|
||||
view.loadUrl("javascript:"+InAppWebView.consoleLogJS);
|
||||
view.loadUrl("javascript:"+JavaScriptBridgeInterface.flutterInAppBroserJSClass);
|
||||
view.loadUrl("javascript:"+InAppWebView.platformReadyJS);
|
||||
}
|
||||
|
||||
Map<String, Object> obj = new HashMap<>();
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
package com.pichillilorenzo.flutter_inappbrowser;
|
||||
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
import android.webkit.JavascriptInterface;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.pichillilorenzo.flutter_inappbrowser.InAppWebView.InAppWebView;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -14,7 +19,11 @@ public class JavaScriptBridgeInterface {
|
|||
private InAppBrowserActivity inAppBrowserActivity;
|
||||
|
||||
public static final String flutterInAppBroserJSClass = "window." + name + ".callHandler = function(handlerName, ...args) {" +
|
||||
"window." + name + "._callHandler(handlerName, JSON.stringify(args));" +
|
||||
"var _callHandlerID = setTimeout(function(){});" +
|
||||
"window." + name + "._callHandler(handlerName, _callHandlerID, JSON.stringify(args));" +
|
||||
"return new Promise(function(resolve, reject) {" +
|
||||
" window." + name + "[_callHandlerID] = resolve;" +
|
||||
"});" +
|
||||
"}";
|
||||
|
||||
public JavaScriptBridgeInterface(Object obj) {
|
||||
|
@ -25,13 +34,35 @@ public class JavaScriptBridgeInterface {
|
|||
}
|
||||
|
||||
@JavascriptInterface
|
||||
public void _callHandler(String handlerName, String args) {
|
||||
public void _callHandler(String handlerName, final String _callHandlerID, String args) {
|
||||
Map<String, Object> obj = new HashMap<>();
|
||||
if (inAppBrowserActivity != null)
|
||||
obj.put("uuid", inAppBrowserActivity.uuid);
|
||||
obj.put("handlerName", handlerName);
|
||||
obj.put("args", args);
|
||||
getChannel().invokeMethod("onCallJsHandler", obj);
|
||||
|
||||
getChannel().invokeMethod("onCallJsHandler", obj, new MethodChannel.Result() {
|
||||
@Override
|
||||
public void success(Object o) {
|
||||
String json = new Gson().toJson(o);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
flutterWebView.webView.evaluateJavascript("window." + name + "[" + _callHandlerID + "](" + json + ");", null);
|
||||
}
|
||||
else {
|
||||
flutterWebView.webView.loadUrl("javascript:window." + name + "[" + _callHandlerID + "](" + json + ");");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(String s, String s1, Object o) {
|
||||
Log.d(LOG_TAG, "ERROR: " + s + " " + s1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notImplemented() {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private MethodChannel getChannel() {
|
||||
|
|
|
@ -27,7 +27,14 @@
|
|||
</div>
|
||||
</div>
|
||||
<script>
|
||||
console.log("hello");
|
||||
window.addEventListener("flutterInAppBrowserPlatformReady", function(event) {
|
||||
console.log("ready");
|
||||
|
||||
window.flutter_inappbrowser.callHandler('handlerTest', 1).then(function(result) {
|
||||
console.log(result, typeof result);
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -41,6 +41,7 @@ class _InlineExampleScreenState extends State<InlineExampleScreen> {
|
|||
BoxDecoration(border: Border.all(color: Colors.blueAccent)),
|
||||
child: InAppWebView(
|
||||
initialUrl: "https://flutter.dev/",
|
||||
//initialFile: "assets/index.html",
|
||||
initialHeaders: {},
|
||||
initialOptions: {
|
||||
"useShouldOverrideUrlLoading": true,
|
||||
|
@ -55,7 +56,7 @@ class _InlineExampleScreenState extends State<InlineExampleScreen> {
|
|||
this.url = url;
|
||||
});
|
||||
},
|
||||
onLoadStop: (InAppWebViewController controller, String url) {
|
||||
onLoadStop: (InAppWebViewController controller, String url) async {
|
||||
print("stopped $url");
|
||||
},
|
||||
onProgressChanged:
|
||||
|
@ -70,7 +71,10 @@ class _InlineExampleScreenState extends State<InlineExampleScreen> {
|
|||
},
|
||||
onLoadResource: (InAppWebViewController controller, WebResourceResponse response, WebResourceRequest request) {
|
||||
print("resource " + request.url);
|
||||
}
|
||||
},
|
||||
onConsoleMessage: (InAppWebViewController controller, ConsoleMessage consoleMessage) {
|
||||
print(consoleMessage.message);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -20,8 +20,6 @@
|
|||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/.dart_tool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/.pub" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/build" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/ios/Flutter/App.framework/flutter_assets/packages" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/.symlinks/plugins/flutter_inappbrowser/example/ios/Flutter/flutter_assets/packages" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/App.framework/flutter_assets/packages" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/example/ios/Flutter/flutter_assets/packages" />
|
||||
</content>
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
// Created by Lorenzo on 21/10/18.
|
||||
//
|
||||
|
||||
import Flutter
|
||||
import Foundation
|
||||
import WebKit
|
||||
|
||||
|
@ -71,10 +72,16 @@ let JAVASCRIPT_BRIDGE_NAME = "flutter_inappbrowser"
|
|||
let javaScriptBridgeJS = """
|
||||
window.\(JAVASCRIPT_BRIDGE_NAME) = {};
|
||||
window.\(JAVASCRIPT_BRIDGE_NAME).callHandler = function(handlerName, ...args) {
|
||||
window.webkit.messageHandlers['callHandler'].postMessage( {'handlerName': handlerName, 'args': JSON.stringify(args)} );
|
||||
var _callHandlerID = setTimeout(function(){});
|
||||
window.webkit.messageHandlers['callHandler'].postMessage( {'handlerName': handlerName, '_callHandlerID': _callHandlerID, 'args': JSON.stringify(args)} );
|
||||
return new Promise(function(resolve, reject) {
|
||||
window.\(JAVASCRIPT_BRIDGE_NAME)[_callHandlerID] = resolve;
|
||||
});
|
||||
}
|
||||
"""
|
||||
|
||||
let platformReadyJS = "window.dispatchEvent(new Event('flutterInAppBrowserPlatformReady'));";
|
||||
|
||||
public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler {
|
||||
|
||||
var IABController: InAppBrowserWebViewController?
|
||||
|
@ -235,11 +242,13 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate, WKNavi
|
|||
public func loadUrl(url: URL, headers: [String: String]?) {
|
||||
var request = URLRequest(url: url)
|
||||
currentURL = url
|
||||
if let mutableRequest = (request as NSURLRequest).mutableCopy() as? NSMutableURLRequest {
|
||||
for (key, value) in headers! {
|
||||
mutableRequest.setValue(value, forHTTPHeaderField: key)
|
||||
if headers != nil {
|
||||
if let mutableRequest = (request as NSURLRequest).mutableCopy() as? NSMutableURLRequest {
|
||||
for (key, value) in headers! {
|
||||
mutableRequest.setValue(value, forHTTPHeaderField: key)
|
||||
}
|
||||
request = mutableRequest as URLRequest
|
||||
}
|
||||
request = mutableRequest as URLRequest
|
||||
}
|
||||
load(request)
|
||||
}
|
||||
|
@ -581,6 +590,7 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate, WKNavi
|
|||
self.WKNavigationMap = [:]
|
||||
currentURL = url
|
||||
onLoadStop(url: (currentURL?.absoluteString)!)
|
||||
evaluateJavaScript(platformReadyJS, completionHandler: nil)
|
||||
|
||||
if IABController != nil {
|
||||
IABController!.updateUrlTextField(url: (currentURL?.absoluteString)!)
|
||||
|
@ -698,12 +708,28 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate, WKNavi
|
|||
getChannel().invokeMethod("onConsoleMessage", arguments: arguments)
|
||||
}
|
||||
|
||||
public func onCallJsHandler(handlerName: String, args: String) {
|
||||
public func onCallJsHandler(handlerName: String, _callHandlerID: Int64, args: String) {
|
||||
var arguments: [String: Any] = ["handlerName": handlerName, "args": args]
|
||||
if IABController != nil {
|
||||
arguments["uuid"] = IABController!.uuid
|
||||
}
|
||||
getChannel().invokeMethod("onCallJsHandler", arguments: arguments)
|
||||
|
||||
getChannel().invokeMethod("onCallJsHandler", arguments: arguments, result: {(result) -> Void in
|
||||
if result is FlutterError {
|
||||
print((result as! FlutterError).message)
|
||||
}
|
||||
else if (result as? NSObject) == FlutterMethodNotImplemented {}
|
||||
else {
|
||||
var json = "null"
|
||||
if let r = result {
|
||||
json = JSONSerializer.toJson(r)
|
||||
if json == "{}" {
|
||||
json = "\(r)"
|
||||
}
|
||||
}
|
||||
self.evaluateJavaScript("window.\(JAVASCRIPT_BRIDGE_NAME)[\(_callHandlerID)](\(json));", completionHandler: nil)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
|
||||
|
@ -765,8 +791,9 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate, WKNavi
|
|||
else if message.name == "callHandler" {
|
||||
let body = message.body as! [String: Any]
|
||||
let handlerName = body["handlerName"] as! String
|
||||
let _callHandlerID = body["_callHandlerID"] as! Int64
|
||||
let args = body["args"] as! String
|
||||
onCallJsHandler(handlerName: handlerName, args: args)
|
||||
onCallJsHandler(handlerName: handlerName, _callHandlerID: _callHandlerID, args: args)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,284 @@
|
|||
/*The MIT License (MIT)
|
||||
Copyright (c) 2015 Peter Helstrup Jensen
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.*/
|
||||
|
||||
import Foundation
|
||||
|
||||
/// Handles Convertion from instances of objects to JSON strings. Also helps with casting strings of JSON to Arrays or Dictionaries.
|
||||
open class JSONSerializer {
|
||||
|
||||
/**
|
||||
Errors that indicates failures of JSONSerialization
|
||||
- JsonIsNotDictionary: -
|
||||
- JsonIsNotArray: -
|
||||
- JsonIsNotValid: -
|
||||
*/
|
||||
public enum JSONSerializerError: Error {
|
||||
case jsonIsNotDictionary
|
||||
case jsonIsNotArray
|
||||
case jsonIsNotValid
|
||||
}
|
||||
|
||||
//http://stackoverflow.com/questions/30480672/how-to-convert-a-json-string-to-a-dictionary
|
||||
/**
|
||||
Tries to convert a JSON string to a NSDictionary. NSDictionary can be easier to work with, and supports string bracket referencing. E.g. personDictionary["name"].
|
||||
- parameter jsonString: JSON string to be converted to a NSDictionary.
|
||||
- throws: Throws error of type JSONSerializerError. Either JsonIsNotValid or JsonIsNotDictionary. JsonIsNotDictionary will typically be thrown if you try to parse an array of JSON objects.
|
||||
- returns: A NSDictionary representation of the JSON string.
|
||||
*/
|
||||
open static func toDictionary(_ jsonString: String) throws -> NSDictionary {
|
||||
if let dictionary = try jsonToAnyObject(jsonString) as? NSDictionary {
|
||||
return dictionary
|
||||
} else {
|
||||
throw JSONSerializerError.jsonIsNotDictionary
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Tries to convert a JSON string to a NSArray. NSArrays can be iterated and each item in the array can be converted to a NSDictionary.
|
||||
- parameter jsonString: The JSON string to be converted to an NSArray
|
||||
- throws: Throws error of type JSONSerializerError. Either JsonIsNotValid or JsonIsNotArray. JsonIsNotArray will typically be thrown if you try to parse a single JSON object.
|
||||
- returns: NSArray representation of the JSON objects.
|
||||
*/
|
||||
open static func toArray(_ jsonString: String) throws -> NSArray {
|
||||
if let array = try jsonToAnyObject(jsonString) as? NSArray {
|
||||
return array
|
||||
} else {
|
||||
throw JSONSerializerError.jsonIsNotArray
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Tries to convert a JSON string to AnyObject. AnyObject can then be casted to either NSDictionary or NSArray.
|
||||
- parameter jsonString: JSON string to be converted to AnyObject
|
||||
- throws: Throws error of type JSONSerializerError.
|
||||
- returns: Returns the JSON string as AnyObject
|
||||
*/
|
||||
fileprivate static func jsonToAnyObject(_ jsonString: String) throws -> Any? {
|
||||
var any: Any?
|
||||
|
||||
if let data = jsonString.data(using: String.Encoding.utf8) {
|
||||
do {
|
||||
any = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
|
||||
}
|
||||
catch let error as NSError {
|
||||
let sError = String(describing: error)
|
||||
NSLog(sError)
|
||||
throw JSONSerializerError.jsonIsNotValid
|
||||
}
|
||||
}
|
||||
return any
|
||||
}
|
||||
|
||||
/**
|
||||
Generates the JSON representation given any custom object of any custom class. Inherited properties will also be represented.
|
||||
- parameter object: The instantiation of any custom class to be represented as JSON.
|
||||
- returns: A string JSON representation of the object.
|
||||
*/
|
||||
open static func toJson(_ object: Any, prettify: Bool = false) -> String {
|
||||
var json = ""
|
||||
if (!(object is Array<Any>)) {
|
||||
json += "{"
|
||||
}
|
||||
let mirror = Mirror(reflecting: object)
|
||||
|
||||
var children = [(label: String?, value: Any)]()
|
||||
|
||||
if let mirrorChildrenCollection = AnyRandomAccessCollection(mirror.children) {
|
||||
children += mirrorChildrenCollection
|
||||
}
|
||||
else {
|
||||
let mirrorIndexCollection = AnyCollection(mirror.children)
|
||||
children += mirrorIndexCollection
|
||||
}
|
||||
|
||||
var currentMirror = mirror
|
||||
while let superclassChildren = currentMirror.superclassMirror?.children {
|
||||
let randomCollection = AnyRandomAccessCollection(superclassChildren)!
|
||||
children += randomCollection
|
||||
currentMirror = currentMirror.superclassMirror!
|
||||
}
|
||||
|
||||
var filteredChildren = [(label: String?, value: Any)]()
|
||||
|
||||
for (optionalPropertyName, value) in children {
|
||||
|
||||
if let optionalPropertyName = optionalPropertyName {
|
||||
|
||||
if !optionalPropertyName.contains("notMapped_") {
|
||||
filteredChildren.append((optionalPropertyName, value))
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
filteredChildren.append((nil, value))
|
||||
}
|
||||
}
|
||||
|
||||
var skip = false
|
||||
let size = filteredChildren.count
|
||||
var index = 0
|
||||
|
||||
var first = true
|
||||
|
||||
for (optionalPropertyName, value) in filteredChildren {
|
||||
skip = false
|
||||
|
||||
let propertyName = optionalPropertyName
|
||||
let property = Mirror(reflecting: value)
|
||||
|
||||
var handledValue = String()
|
||||
|
||||
if propertyName != nil && propertyName == "some" && property.displayStyle == Mirror.DisplayStyle.struct {
|
||||
handledValue = toJson(value)
|
||||
skip = true
|
||||
}
|
||||
else if (value is Int ||
|
||||
value is Int32 ||
|
||||
value is Int64 ||
|
||||
value is Double ||
|
||||
value is Float ||
|
||||
value is Bool) && property.displayStyle != Mirror.DisplayStyle.optional {
|
||||
handledValue = String(describing: value)
|
||||
}
|
||||
else if let array = value as? [Int?] {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
handledValue += value != nil ? String(value!) : "null"
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if let array = value as? [Double?] {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
handledValue += value != nil ? String(value!) : "null"
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if let array = value as? [Float?] {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
handledValue += value != nil ? String(value!) : "null"
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if let array = value as? [Bool?] {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
handledValue += value != nil ? String(value!) : "null"
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if let array = value as? [String?] {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
handledValue += value != nil ? "\"\(value!)\"" : "null"
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if let array = value as? [String] {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
handledValue += "\"\(value)\""
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if let array = value as? NSArray {
|
||||
handledValue += "["
|
||||
for (index, value) in array.enumerated() {
|
||||
if !(value is Int) &&
|
||||
!(value is Int32) &&
|
||||
!(value is Int64) &&
|
||||
!(value is Double) && !(value is Float) && !(value is Bool) && !(value is String) {
|
||||
handledValue += toJson(value)
|
||||
}
|
||||
else {
|
||||
handledValue += "\(value)"
|
||||
}
|
||||
handledValue += (index < array.count-1 ? ", " : "")
|
||||
}
|
||||
handledValue += "]"
|
||||
}
|
||||
else if property.displayStyle == Mirror.DisplayStyle.class ||
|
||||
property.displayStyle == Mirror.DisplayStyle.struct ||
|
||||
String(describing: value).contains("#") {
|
||||
handledValue = toJson(value)
|
||||
}
|
||||
else if property.displayStyle == Mirror.DisplayStyle.optional {
|
||||
let str = String(describing: value)
|
||||
if str != "nil" {
|
||||
// Some optional values cannot be unpacked if type is "Any"
|
||||
// We remove the "Optional(" and last ")" from the value by string manipulation
|
||||
var d = String(str).dropFirst(9)
|
||||
d = d.dropLast(1)
|
||||
handledValue = String(d)
|
||||
} else {
|
||||
handledValue = "null"
|
||||
}
|
||||
}
|
||||
else {
|
||||
handledValue = String(describing: value) != "nil" ? "\"\(value)\"" : "null"
|
||||
}
|
||||
|
||||
if !skip {
|
||||
|
||||
// if optional propertyName is populated we'll use it
|
||||
if let propertyName = propertyName {
|
||||
json += "\"\(propertyName)\": \(handledValue)" + (index < size-1 ? ", " : "")
|
||||
}
|
||||
// if not then we have a member an array
|
||||
else {
|
||||
// if it's the first member we need to prepend ]
|
||||
if first {
|
||||
json += "["
|
||||
first = false
|
||||
}
|
||||
// if it's not the last we need a comma. if it is the last we need to close ]
|
||||
json += "\(handledValue)" + (index < size-1 ? ", " : "]")
|
||||
}
|
||||
|
||||
} else {
|
||||
json = "\(handledValue)" + (index < size-1 ? ", " : "")
|
||||
}
|
||||
|
||||
index += 1
|
||||
}
|
||||
|
||||
if !skip {
|
||||
if (!(object is Array<Any>)) {
|
||||
json += "}"
|
||||
}
|
||||
}
|
||||
|
||||
if prettify {
|
||||
let jsonData = json.data(using: String.Encoding.utf8)!
|
||||
let jsonObject = try! JSONSerialization.jsonObject(with: jsonData, options: [])
|
||||
let prettyJsonData = try! JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted)
|
||||
json = NSString(data: prettyJsonData, encoding: String.Encoding.utf8.rawValue)! as String
|
||||
}
|
||||
|
||||
return json
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -34,7 +34,7 @@ import 'package:uuid/uuid.dart';
|
|||
import 'package:mime/mime.dart';
|
||||
|
||||
typedef Future<dynamic> ListenerCallback(MethodCall call);
|
||||
typedef Future<void> JavaScriptHandlerCallback(List<dynamic> arguments);
|
||||
typedef dynamic JavaScriptHandlerCallback(List<dynamic> arguments);
|
||||
|
||||
var _uuidGenerator = new Uuid();
|
||||
|
||||
|
@ -112,7 +112,7 @@ class _ChannelManager {
|
|||
class InAppBrowser {
|
||||
|
||||
String uuid;
|
||||
Map<String, List<JavaScriptHandlerCallback>> javaScriptHandlersMap = HashMap<String, List<JavaScriptHandlerCallback>>();
|
||||
Map<String, JavaScriptHandlerCallback> javaScriptHandlersMap = HashMap<String, JavaScriptHandlerCallback>();
|
||||
bool _isOpened = false;
|
||||
/// WebView Controller that can be used to access the [InAppWebView] API.
|
||||
InAppWebViewController webViewController;
|
||||
|
@ -735,7 +735,7 @@ class InAppWebViewController {
|
|||
|
||||
InAppWebView _widget;
|
||||
MethodChannel _channel;
|
||||
Map<String, List<JavaScriptHandlerCallback>> javaScriptHandlersMap = HashMap<String, List<JavaScriptHandlerCallback>>();
|
||||
Map<String, JavaScriptHandlerCallback> javaScriptHandlersMap = HashMap<String, JavaScriptHandlerCallback>();
|
||||
bool _isOpened = false;
|
||||
int _id;
|
||||
String _inAppBrowserUuid;
|
||||
|
@ -849,9 +849,7 @@ class InAppWebViewController {
|
|||
String handlerName = call.arguments["handlerName"];
|
||||
List<dynamic> args = jsonDecode(call.arguments["args"]);
|
||||
if (javaScriptHandlersMap.containsKey(handlerName)) {
|
||||
for (var handler in javaScriptHandlersMap[handlerName]) {
|
||||
handler(args);
|
||||
}
|
||||
return await javaScriptHandlersMap[handlerName](args);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -1140,31 +1138,22 @@ class InAppWebViewController {
|
|||
await _channel.invokeMethod('injectStyleFile', args);
|
||||
}
|
||||
|
||||
///Adds/Appends a JavaScript message handler [callback] ([JavaScriptHandlerCallback]) that listen to post messages sent from JavaScript by the handler with name [handlerName].
|
||||
///Returns the position `index` of the handler that can be used to remove it with the [removeJavaScriptHandler()] method.
|
||||
///Adds a JavaScript message handler [callback] ([JavaScriptHandlerCallback]) that listen to post messages sent from JavaScript by the handler with name [handlerName].
|
||||
///
|
||||
///The Android implementation uses [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String)).
|
||||
///The iOS implementation uses [addScriptMessageHandler](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-addscriptmessagehandler?language=objc)
|
||||
///
|
||||
///The JavaScript function that can be used to call the handler is `window.flutter_inappbrowser.callHandler(handlerName <String>, ...args);`, where `args` are [rest parameters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).
|
||||
///The `args` will be stringified automatically using `JSON.stringify(args)` method and then they will be decoded on the Dart side.
|
||||
int addJavaScriptHandler(String handlerName, JavaScriptHandlerCallback callback) {
|
||||
this.javaScriptHandlersMap.putIfAbsent(handlerName, () => List<JavaScriptHandlerCallback>());
|
||||
this.javaScriptHandlersMap[handlerName].add(callback);
|
||||
return this.javaScriptHandlersMap[handlerName].indexOf(callback);
|
||||
void addJavaScriptHandler(String handlerName, JavaScriptHandlerCallback callback) {
|
||||
this.javaScriptHandlersMap[handlerName] = (callback);
|
||||
}
|
||||
|
||||
///Removes a JavaScript message handler previously added with the [addJavaScriptHandler()] method in the [handlerName] list by its position [index].
|
||||
///Returns `true` if the callback is removed, otherwise `false`.
|
||||
bool removeJavaScriptHandler(String handlerName, int index) {
|
||||
try {
|
||||
this.javaScriptHandlersMap[handlerName].removeAt(index);
|
||||
return true;
|
||||
}
|
||||
on RangeError catch(e) {
|
||||
print(e);
|
||||
}
|
||||
return false;
|
||||
///Removes a JavaScript message handler previously added with the [addJavaScriptHandler()] associated to [handlerName] key.
|
||||
///Returns the value associated with [handlerName] before it was removed.
|
||||
///Returns `null` if [handlerName] was not found.
|
||||
JavaScriptHandlerCallback removeJavaScriptHandler(String handlerName) {
|
||||
return this.javaScriptHandlersMap.remove(handlerName);
|
||||
}
|
||||
|
||||
///Takes a screenshot (in PNG format) of the WebView's visible viewport and returns a `Uint8List`. Returns `null` if it wasn't be able to take it.
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
name: flutter_inappbrowser
|
||||
description: A Flutter plugin that allows you to add an inline webview or open an in-app browser window (inspired by the popular cordova-plugin-inappbrowser).
|
||||
version: 1.0.1
|
||||
version: 1.1.0
|
||||
author: Lorenzo Pichilli <pichillilorenzo@gmail.com>
|
||||
homepage: https://github.com/pichillilorenzo/flutter_inappbrowser
|
||||
|
||||
|
|
Loading…
Reference in New Issue