From a9bcbe1f869d9d71205e77267319cb09a711aa37 Mon Sep 17 00:00:00 2001 From: Joao Paulo Marquesini Date: Fri, 7 Dec 2018 17:52:24 -0200 Subject: [PATCH] fixing a problem in safari webview and adding tabs to examples --- .gitignore | 1 + example/lib/chrome_safari_example.screen.dart | 46 ++ example/lib/inline_example.screen.dart | 95 ++++ example/lib/main.dart | 462 +----------------- example/lib/webview_example.screen.dart | 88 ++++ ios/Classes/InAppWebView.swift | 2 +- lib/flutter_inappbrowser.dart | 1 + 7 files changed, 256 insertions(+), 439 deletions(-) create mode 100644 example/lib/chrome_safari_example.screen.dart create mode 100644 example/lib/inline_example.screen.dart create mode 100644 example/lib/webview_example.screen.dart diff --git a/.gitignore b/.gitignore index 7ecebb44..53943e06 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store .dart_tool/ +.vscode/ .packages .pub/ pubspec.lock diff --git a/example/lib/chrome_safari_example.screen.dart b/example/lib/chrome_safari_example.screen.dart new file mode 100644 index 00000000..93b21f94 --- /dev/null +++ b/example/lib/chrome_safari_example.screen.dart @@ -0,0 +1,46 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; + +class MyChromeSafariBrowser extends ChromeSafariBrowser { + MyChromeSafariBrowser(browserFallback) : super(browserFallback); + @override + void onOpened() { + print("ChromeSafari browser opened"); + } + + @override + void onLoaded() { + print("ChromeSafari browser loaded"); + } + + @override + void onClosed() { + print("ChromeSafari browser closed"); + } +} + +class ChromeSafariExampleScreen extends StatefulWidget { + final ChromeSafariBrowser browser = new MyChromeSafariBrowser(new InAppBrowser()); + @override + _ChromeSafariExampleScreenState createState() => new _ChromeSafariExampleScreenState(); +} + +class _ChromeSafariExampleScreenState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return new Center( + child: new RaisedButton( + onPressed: () async { + await widget.browser.open("https://flutter.io/"); + }, + child: Text("Open Chrome Safari Browser")), + ); + } +} diff --git a/example/lib/inline_example.screen.dart b/example/lib/inline_example.screen.dart new file mode 100644 index 00000000..d152ac84 --- /dev/null +++ b/example/lib/inline_example.screen.dart @@ -0,0 +1,95 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; + +class InlineExampleScreen extends StatefulWidget { + @override + _InlineExampleScreenState createState() => new _InlineExampleScreenState(); +} + +class _InlineExampleScreenState extends State { + InAppWebViewController webView; + String url = ""; + double progress = 0; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + child: Column(children: [ + Container( + padding: EdgeInsets.all(20.0), + child: Text( + "CURRENT URL\n${(url.length > 50) ? url.substring(0, 50) + "..." : url}"), + ), + Container( + padding: EdgeInsets.all(10.0), + child: progress < 1.0 ? LinearProgressIndicator(value: progress) : null + ), + Expanded( + child: Container( + margin: const EdgeInsets.all(10.0), + decoration: + BoxDecoration(border: Border.all(color: Colors.blueAccent)), + child: InAppWebView( + initialUrl: "https://flutter.io/", + initialHeaders: {}, + initialOptions: {}, + onWebViewCreated: (InAppWebViewController controller) { + webView = controller; + }, + onLoadStart: (InAppWebViewController controller, String url) { + print("started $url"); + setState(() { + this.url = url; + }); + }, + onProgressChanged: + (InAppWebViewController controller, int progress) { + setState(() { + this.progress = progress / 100; + }); + }, + ), + ), + ), + ButtonBar( + alignment: MainAxisAlignment.center, + children: [ + RaisedButton( + child: Icon(Icons.arrow_back), + onPressed: () { + if (webView != null) { + webView.goBack(); + } + }, + ), + RaisedButton( + child: Icon(Icons.arrow_forward), + onPressed: () { + if (webView != null) { + webView.goForward(); + } + }, + ), + RaisedButton( + child: Icon(Icons.refresh), + onPressed: () { + if (webView != null) { + webView.reload(); + } + }, + ), + ], + ), + ])); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart index 201221d6..29031249 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,352 +1,9 @@ -//import 'dart:async'; -//import 'dart:convert'; -//import 'package:flutter/material.dart'; -//import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; -// -//class MyInAppBrowser extends InAppBrowser { -// @override -// Future onBrowserCreated() async { -// print("\n\nBrowser Ready!\n\n"); -// } -// -// @override -// Future onLoadStart(String url) async { -// print("\n\nStarted $url\n\n"); -//// print("\n\n ${await this.isHidden()} \n\n"); -//// print(await this.webViewController.canGoBack()); -//// print(await this.webViewController.canGoForward()); -// } -// -// @override -// Future onLoadStop(String url) async { -// print("\n\nStopped $url\n\n"); -// -//// print(base64.encode(await this.webViewController.getFavicon())); -//// WebHistory history = await this.webViewController.getCopyBackForwardList(); -//// print(history.list.length); -//// print(history.currentIndex); -//// print(history.list[history.currentIndex].url); -//// for(WebHistoryItem item in history.list) { -//// print(item.title); -//// } -// -//// -//// print(await this.webViewController.canGoBackOrForward(1)); -//// if (await this.webViewController.canGoBackOrForward(-2)) { -//// this.webViewController.goTo(history.list[0]); -//// } -// -//// await this.webViewController.goBackOrForward(-1); -// -//// print(await this.webViewController.canGoBack()); -//// print(await this.webViewController.canGoForward()); -// -//// var screenshot = await this.webViewController.takeScreenshot(); -//// await this.webViewController.injectScriptCode(""" -//// document.body.innerHTML = ''; -//// """); -// -//// var options = await this.getOptions(); -//// if (options["javaScriptEnabled"]) { -//// await this.setOptions({ -//// //"progressBar": true, -//// //"useOnLoadResource": true, -//// //"hidden": true, -//// //"toolbarTopFixedTitle": "Fixed title A", -//// //"useShouldOverrideUrlLoading": true -//// //"hideUrlBar": true, -//// "javaScriptEnabled": false, -//// "toolbarTop": true, -//// "toolbarBottom": false -//// }); -//// } -//// else { -//// await this.setOptions({ -//// //"progressBar": false, -//// //"useOnLoadResource": false, -//// //"hidden": true, -//// //"toolbarTopFixedTitle": "Fixed title B", -//// //"useShouldOverrideUrlLoading": true -//// //"hideUrlBar": false, -//// "javaScriptEnabled": true, -//// "toolbarTop": false, -//// "toolbarBottom": true -//// }); -//// } -// -//// print("\n\n ${await this.isHidden()} \n\n"); -//// -//// await this.webViewController.injectScriptCode("window.flutter_inappbrowser.callHandler('handlerTest', 1, 5,'string', {'key': 5}, [4,6,8]);"); -//// await this.webViewController.injectScriptCode("window.flutter_inappbrowser.callHandler('handlerTest2', false, null, undefined);"); -//// await this.webViewController.injectScriptCode("setTimeout(function(){window.flutter_inappbrowser.callHandler('handlerTest', 'anotherString');}, 1000);"); -// -//// await this.webViewController.injectScriptCode("console.log({'testObject': 5});"); -//// await this.webViewController.injectScriptCode("console.warn('testWarn',null);"); -//// await this.webViewController.injectScriptCode("console.log('testObjectStringify', JSON.stringify({'asd': 5}));"); -//// await this.webViewController.injectScriptCode("console.info('testInfo', 6);"); -//// await this.webViewController.injectScriptCode("console.error('testError', false);"); -//// await this.webViewController.injectScriptCode("console.debug('testDebug', true);"); -//// -//// print(await this.webViewController.injectScriptCode("document.cookie")); -//// -//// print(""); -//// print(await CookieManager.getCookies(url)); -//// print(""); -//// print(await CookieManager.getCookie(url, "my_cookie2")); -//// print(""); -//// await CookieManager.deleteCookie(url, "my_cookie2"); -//// await CookieManager.deleteCookie(url, "_gid", domain: ".googleblog.com"); -//// print(""); -//// print(await CookieManager.getCookies(url)); -//// print(""); -//// await CookieManager.deleteCookies(url); -//// print(""); -//// print(await CookieManager.getCookies(url)); -//// print(""); -//// await CookieManager.deleteAllCookies(); -//// print(""); -//// print(await CookieManager.getCookies(url)); -//// print(""); -//// -//// print(await this.webViewController.injectScriptCode("null")); -//// print(await this.webViewController.injectScriptCode("undefined")); -//// print(await this.webViewController.injectScriptCode("3")); -//// print(await this.webViewController.injectScriptCode(""" -//// function asd (a,b) { -//// return a+b; -//// }; -//// asd(3,5); -//// """)); -//// print(await this.webViewController.injectScriptCode(""" -//// ["3",56,"sdf"]; -//// """)); -//// print(await this.webViewController.injectScriptCode(""" -//// var x = {"as":4, "dfdfg": 6}; -//// x; -//// """)); -//// -//// await this.webViewController.injectScriptFile("https://code.jquery.com/jquery-3.3.1.min.js"); -//// this.webViewController.injectScriptCode(""" -//// \$( "body" ).html( "Next Step..." ) -//// """); -//// -//// // add custom css -//// this.webViewController.injectStyleCode(""" -//// body { -//// background-color: #3c3c3c !important; -//// } -//// """); -//// this.webViewController.injectStyleFile("https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"); -// } -// -// @override -// Future onScrollChanged(int x, int y) async { -//// print(x.toString() + " " + y.toString()); -// } -// -// @override -// void onLoadError(String url, int code, String message) { -// print("\n\nCan't load $url.. Error: $message\n\n"); -// } -// -// @override -// void onProgressChanged(int progress) { -//// print("Progress: $progress"); -// } -// -// @override -// void onExit() { -// print("\n\nBrowser closed!\n\n"); -// } -// -// @override -// void shouldOverrideUrlLoading(String url) { -// print("\n\n override $url\n\n"); -// this.webViewController.loadUrl(url); -// -//// var postData = "username=my_username&password=my_password"; -//// inAppBrowserFallback.webViewController.postUrl("http://localhost:8080", utf8.encode(postData)); -// -//// var htmlData = """ -//// -//// -//// -//// -//// -//// -//// Document -//// -//// -//// -//// -//// -////
-////
-//// dart logo -////
-////
-//// One of three columns -////
-////
-//// One of three columns -////
-////
-//// One of three columns -////
-////
-////
-//// -////
-//// -//// -//// """; -//// inAppBrowserFallback.webViewController.loadData(htmlData); -// } -// -// @override -// void onLoadResource( -// WebResourceResponse response, WebResourceRequest request) { -// print("Started at: " + -// response.startTime.toString() + -// "ms ---> duration: " + -// response.duration.toString() + -// "ms " + -// response.url); -//// if (response.headers["content-length"] != null) -//// print(response.headers["content-length"] + " length"); -// } -// -// @override -// void onConsoleMessage(ConsoleMessage consoleMessage) { -// print(consoleMessage.message); -//// print(""" -//// console output: -//// sourceURL: ${consoleMessage.sourceURL} -//// lineNumber: ${consoleMessage.lineNumber} -//// message: ${consoleMessage.message} -//// messageLevel: ${consoleMessage.messageLevel} -//// """); -// } -//} -// -//MyInAppBrowser inAppBrowserFallback = new MyInAppBrowser(); -// -//class MyChromeSafariBrowser extends ChromeSafariBrowser { -// MyChromeSafariBrowser(browserFallback) : super(browserFallback); -// -// @override -// void onOpened() { -// print("ChromeSafari browser opened"); -// } -// -// @override -// void onLoaded() { -// print("ChromeSafari browser loaded"); -// } -// -// @override -// void onClosed() { -// print("ChromeSafari browser closed"); -// } -//} -// -//// adding a webview fallback -//MyChromeSafariBrowser chromeSafariBrowser = -// new MyChromeSafariBrowser(inAppBrowserFallback); -//InAppLocalhostServer localhostServer = new InAppLocalhostServer(); -// -//Future main() async { -//// await localhostServer.start(); -// runApp(new MyApp()); -//} -// -//class MyApp extends StatefulWidget { -// @override -// _MyAppState createState() => new _MyAppState(); -//} -// -//class _MyAppState extends State { -// @override -// void initState() { -// super.initState(); -//// int indexTest = inAppBrowserFallback.webViewController.addJavaScriptHandler("handlerTest", -//// (arguments) async { -//// print("handlerTest arguments"); -//// print(arguments); -//// }); -//// int indexTest2 = inAppBrowserFallback.webViewController.addJavaScriptHandler("test2", (arguments) async { -//// print("handlerTest2 arguments"); -//// print(arguments); -//// inAppBrowserFallback.webViewController.removeJavaScriptHandler("test", indexTest); -//// }); -// } -// -// @override -// Widget build(BuildContext context) { -// return new MaterialApp( -// home: new Scaffold( -// appBar: new AppBar( -// title: const Text('Flutter InAppBrowser Plugin example app'), -// ), -// body: new Center( -// child: new RaisedButton( -// onPressed: () async { -//// await chromeSafariBrowser.open("https://flutter.io/"); -//// -//// await InAppBrowser.openWithSystemBrowser("https://flutter.io/"); -//// -//// await inAppBrowserFallback.open(url: "http://localhost:8080/assets/index.html", options: { -//// "useOnLoadResource": true, -//// //"hidden": true, -//// //"toolbarTopFixedTitle": "Fixed title", -//// //"useShouldOverrideUrlLoading": true -//// //"hideUrlBar": true, -//// //"toolbarTop": false, -//// "toolbarBottom": false -//// }); -//// -//// await inAppBrowserFallback.openFile("assets/index.html", options: { -//// "useOnLoadResource": true, -//// //"hidden": true, -//// //"useShouldOverrideUrlLoading": true -//// //"hideUrlBar": true, -//// //"toolbarTop": false, -//// //"toolbarBottom": false -//// }); -//// -//// await CookieManager.setCookie("https://flutter.io/", "my_cookie2", "cookieValue2", domain: "flutter.io", expiresDate: 1540838864611); -//// await CookieManager.setCookie("https://flutter.io/", "my_cookie", "cookieValue", domain: "flutter.io", expiresDate: 1540838864611); -// -//// await inAppBrowserFallback.openData("Data example

This is a \"p\" tag

", options: {}); -// -// await inAppBrowserFallback.open(url: "https://flutter.io/", options: { -// //"useOnLoadResource": true, -// //"hidden": true, -// //"toolbarTopFixedTitle": "Fixed title", -// "useShouldOverrideUrlLoading": true, -// //"hideUrlBar": true, -// //"toolbarTop": false, -// //"toolbarBottom": false -// }); -// -// }, -// child: Text("Open InAppBrowser") -// ), -// ), -// ), -// ); -// } -//} - - -// Inline WebView Example - import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; +import 'package:flutter_inappbrowser_example/chrome_safari_example.screen.dart'; +import 'package:flutter_inappbrowser_example/inline_example.screen.dart'; +import 'package:flutter_inappbrowser_example/webview_example.screen.dart'; Future main() async { runApp(new MyApp()); @@ -358,7 +15,6 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - InAppWebViewController webView; String url = ""; double progress = 0; @@ -376,100 +32,30 @@ class _MyAppState extends State { @override Widget build(BuildContext context) { return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Inline WebView example app'), - ), - body: Container( - child: Column( - children: [ - Container( - padding: EdgeInsets.all(20.0), - child: Text("CURRENT URL\n${ (url.length > 50) ? url.substring(0, 50) + "..." : url }"), + home: DefaultTabController( + length: 3, + child: Scaffold( + appBar: AppBar( + title: Text('Tabs Demo'), ), - (progress != 1.0) ? LinearProgressIndicator(value: progress) : null, - Expanded( - child: Container( - margin: const EdgeInsets.all(10.0), - decoration: BoxDecoration( - border: Border.all(color: Colors.blueAccent) - ), - child: InAppWebView( - initialUrl: "https://flutter.io/", - //initialData: InAppWebViewInitialData("Data example

This is a \"p\" tag

"), - initialHeaders: { - - }, - initialOptions: { - - }, - onWebViewCreated: (InAppWebViewController controller) { - webView = controller; - }, - onLoadStart: (InAppWebViewController controller, String url) { - print("started $url"); - setState(() { - this.url = url; - }); - }, - onProgressChanged: (InAppWebViewController controller, int progress) { - setState(() { - this.progress = progress/100; - }); - }, - ), - ), - ), - ButtonBar( - alignment: MainAxisAlignment.center, - children: [ - RaisedButton( - child: Icon(Icons.arrow_back), - onPressed: () { - if (webView != null) { - webView.goBack(); - } - }, - ), - RaisedButton( - child: Icon(Icons.arrow_forward), - onPressed: () { - if (webView != null) { - webView.goForward(); - } - }, - ), - RaisedButton( - child: Icon(Icons.refresh), - onPressed: () { - if (webView != null) { - webView.reload(); - } - }, - ), + body: TabBarView( + children: [ + WebviewExampleScreen(), + ChromeSafariExampleScreen(), + InlineExampleScreen(), ], ), - ].where((Object o) => o != null).toList(), - ), - ), - bottomNavigationBar: BottomNavigationBar( - currentIndex: 0, - items: [ - BottomNavigationBarItem( - icon: Icon(Icons.home), - title: Text('Home'), - ), - BottomNavigationBarItem( - icon: Icon(Icons.mail), - title: Text('Item 2'), - ), - BottomNavigationBarItem( - icon: Icon(Icons.person), - title: Text('Item 3') - ) - ], - ), - ), + bottomNavigationBar: Container( + color: Theme.of(context).primaryColor, + child: TabBar( + indicatorColor: Colors.white, + tabs: [ + Tab(text: "Webview"), + Tab(text: "Chrome/Safari"), + Tab(text: "Inline",), + ], + ), + ))), ); } } diff --git a/example/lib/webview_example.screen.dart b/example/lib/webview_example.screen.dart new file mode 100644 index 00000000..407d5475 --- /dev/null +++ b/example/lib/webview_example.screen.dart @@ -0,0 +1,88 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappbrowser/flutter_inappbrowser.dart'; + +class MyInappBrowser extends InAppBrowser { + @override + Future onBrowserCreated() async { + print("\n\nBrowser Ready!\n\n"); + } + + @override + Future onLoadStart(String url) async { + print("\n\nStarted $url\n\n"); + } + + @override + Future onLoadStop(String url) async { + print("\n\nStopped $url\n\n"); + } + + @override + Future onScrollChanged(int x, int y) async { + print("Scrolled: x:$x y:$y"); + } + + @override + void onLoadError(String url, int code, String message) { + print("Can't load $url.. Error: $message"); + } + + @override + void onProgressChanged(int progress) { + print("Progress: $progress"); + } + + @override + void onExit() { + print("\n\nBrowser closed!\n\n"); + } + + @override + void shouldOverrideUrlLoading(String url) { + print("\n\n override $url\n\n"); + this.webViewController.loadUrl(url); + } + + @override + void onLoadResource( + WebResourceResponse response, WebResourceRequest request) { + print("Started at: " + + response.startTime.toString() + + "ms ---> duration: " + + response.duration.toString() + + "ms " + + response.url); + } + + @override + void onConsoleMessage(ConsoleMessage consoleMessage) { + print(consoleMessage.message); + } + +} + +class WebviewExampleScreen extends StatefulWidget { + final InAppBrowser browser = new InAppBrowser(); + @override + _WebviewExampleScreenState createState() => new _WebviewExampleScreenState(); +} + +class _WebviewExampleScreenState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return new Center( + child: new RaisedButton( + onPressed: () { + widget.browser.open(url:"https://flutter.io/"); + }, + child: Text("Open Webview Browser")), + ); + } +} diff --git a/ios/Classes/InAppWebView.swift b/ios/Classes/InAppWebView.swift index 2fcf2ca3..96f2325c 100644 --- a/ios/Classes/InAppWebView.swift +++ b/ios/Classes/InAppWebView.swift @@ -26,7 +26,7 @@ public class InAppWebView: WKWebView, UIScrollViewDelegate, WKUIDelegate, WKNavi scrollView.delegate = self } - required init(coder aDecoder: NSCoder) { + required public init(coder aDecoder: NSCoder) { super.init(coder: aDecoder)! } diff --git a/lib/flutter_inappbrowser.dart b/lib/flutter_inappbrowser.dart index 12d11b6b..06f1ebf2 100644 --- a/lib/flutter_inappbrowser.dart +++ b/lib/flutter_inappbrowser.dart @@ -487,6 +487,7 @@ class ChromeSafariBrowser { args.putIfAbsent('headers', () => headersFallback); args.putIfAbsent('options', () => options); args.putIfAbsent('optionsFallback', () => optionsFallback); + args.putIfAbsent('isData', () => false); args.putIfAbsent('useChromeSafariBrowser', () => true); await _ChannelManager.channel.invokeMethod('open', args); this._isOpened = true;