Skip to content

Commit

Permalink
[webview_flutter_tizen] Update webview_flutter to 4.4.2 (flutter-tize…
Browse files Browse the repository at this point in the history
  • Loading branch information
Swanseo0 authored and mhoeckner committed Dec 7, 2023
1 parent 9bab48b commit 0701bd3
Show file tree
Hide file tree
Showing 12 changed files with 240 additions and 48 deletions.
10 changes: 10 additions & 0 deletions packages/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 0.9.0

* Update webivew_flutter to 4.4.2.
* Update webview_flutter_platform_interface to 2.6.0.
* Adds pub topics to package metadata.
* Adds support to retrieve the user agent. See `TizenWebViewController.getUserAgent`.
* Adds support to register a callback to receive JavaScript console messages. See `TizenWebViewController.setOnConsoleMessage`.
* Apply PlatformView API change.
* Fix bug on playing youtube on TV.

## 0.8.0

* Update webivew_flutter to 4.2.3.
Expand Down
22 changes: 19 additions & 3 deletions packages/webview_flutter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ This package is not an _endorsed_ implementation of `webview_flutter`. Therefore

```yaml
dependencies:
webview_flutter: ^4.2.3
webview_flutter_tizen: ^0.8.0
webview_flutter: ^4.4.2
webview_flutter_tizen: ^0.9.0
```
## Example
Expand Down Expand Up @@ -59,4 +59,20 @@ class _WebViewExampleState extends State<WebViewExample> {

## Supported devices

This plugin is only supported on Tizen TV devices running Tizen 5.5 or later.
This plugin is only supported on Tizen TV devices running Tizen 5.5 or later.

## Note

To play Youtube, make app's background color to transparent.

```diff
--- a/packages/webview_flutter/example/lib/main.dart
+++ b/packages/webview_flutter/example/lib/main.dart
@override
Widget build(BuildContext context) {
return Scaffold(
- backgroundColor: Colors.green,
+ backgroundColor: Colors.transparent,
appBar: AppBar(
title: const Text('Flutter WebView example'),
```
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
Expand Down Expand Up @@ -176,7 +175,7 @@ Future<void> main() async {

await pageFinished.future;

final String customUserAgent = await _getUserAgent(controller);
final String? customUserAgent = await controller.getUserAgent();
expect(customUserAgent, 'Custom_User_Agent1');
});

Expand Down Expand Up @@ -477,23 +476,6 @@ Future<void> main() async {
});
}

/// Returns the value used for the HTTP User-Agent: request header in subsequent HTTP requests.
Future<String> _getUserAgent(WebViewController controller) async {
return _runJavascriptReturningResult(controller, 'navigator.userAgent;');
}

Future<String> _runJavascriptReturningResult(
WebViewController controller,
String js,
) async {
if (defaultTargetPlatform == TargetPlatform.iOS ||
defaultTargetPlatform == TargetPlatform.linux) {
return await controller.runJavaScriptReturningResult(js) as String;
}
return jsonDecode(await controller.runJavaScriptReturningResult(js) as String)
as String;
}

class ResizableWebView extends StatefulWidget {
const ResizableWebView({
super.key,
Expand Down
56 changes: 54 additions & 2 deletions packages/webview_flutter/example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs, avoid_print
// ignore_for_file: public_member_api_docs

import 'dart:async';
import 'dart:convert';
Expand Down Expand Up @@ -70,6 +70,40 @@ const String kTransparentBackgroundPage = '''
</html>
''';

const String kLogExamplePage = '''
<!DOCTYPE html>
<html lang="en">
<head>
<title>Load file or HTML string example</title>
</head>
<body onload="console.log('Logging that the page is loading.')">
<h1>Local demo page</h1>
<p>
This page is used to test the forwarding of console logs to Dart.
</p>
<style>
.btn-group button {
padding: 24px; 24px;
display: block;
width: 25%;
margin: 5px 0px 0px 0px;
}
</style>
<div class="btn-group">
<button onclick="console.error('This is an error message.')">Error</button>
<button onclick="console.warn('This is a warning message.')">Warning</button>
<button onclick="console.info('This is a info message.')">Info</button>
<button onclick="console.debug('This is a debug message.')">Debug</button>
<button onclick="console.log('This is a log message.')">Log</button>
</div>
</body>
</html>
''';

class WebViewExample extends StatefulWidget {
const WebViewExample({super.key});

Expand Down Expand Up @@ -152,7 +186,7 @@ Page resource error:
return FloatingActionButton(
onPressed: () async {
final String? url = await _controller.currentUrl();
if (context.mounted) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Favorited $url')),
);
Expand All @@ -177,6 +211,7 @@ enum MenuOptions {
loadHtmlString,
transparentBackground,
setCookie,
logExample,
}

class SampleMenu extends StatelessWidget {
Expand Down Expand Up @@ -233,6 +268,9 @@ class SampleMenu extends StatelessWidget {
case MenuOptions.setCookie:
_onSetCookie();
break;
case MenuOptions.logExample:
_onLogExample();
break;
}
},
itemBuilder: (BuildContext context) => <PopupMenuItem<MenuOptions>>[
Expand Down Expand Up @@ -289,6 +327,10 @@ class SampleMenu extends StatelessWidget {
value: MenuOptions.setCookie,
child: Text('Set cookie'),
),
const PopupMenuItem<MenuOptions>(
value: MenuOptions.logExample,
child: Text('Log example'),
),
],
);
}
Expand Down Expand Up @@ -433,6 +475,16 @@ class SampleMenu extends StatelessWidget {

return indexFile.path;
}

Future<void> _onLogExample() {
webViewController
.setOnConsoleMessage((JavaScriptConsoleMessage consoleMessage) {
debugPrint(
'== JS == ${consoleMessage.level.name}: ${consoleMessage.message}');
});

return webViewController.loadHtmlString(kLogExamplePage);
}
}

class NavigationControls extends StatelessWidget {
Expand Down
2 changes: 1 addition & 1 deletion packages/webview_flutter/example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ dependencies:
path_provider: ^2.0.7
path_provider_tizen:
path: ../../path_provider/
webview_flutter: ^4.2.3
webview_flutter: ^4.4.2
webview_flutter_tizen:
path: ../

Expand Down
8 changes: 7 additions & 1 deletion packages/webview_flutter/lib/src/tizen_webview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -211,5 +211,11 @@ class TizenWebView {

/// Sets the value used for the HTTP `User-Agent:` request header.
Future<void> setUserAgent(String? userAgent) =>
_invokeChannelMethod<void>('userAgent', userAgent);
_invokeChannelMethod<void>('setUserAgent', userAgent);

/// Gets the HTTP 'User-Agent:' request header.
Future<String?> getUserAgent() async {
final String? result = await _invokeChannelMethod<String?>('getUserAgent');
return result;
}
}
66 changes: 66 additions & 0 deletions packages/webview_flutter/lib/src/tizen_webview_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ import 'tizen_webview.dart';
const String kTizenNavigationDelegateChannelName =
'plugins.flutter.io/tizen_webview_navigation_delegate_';

/// The channel name of [TizenWebViewController].
const String kTizenWebViewControllerChannelName =
'plugins.flutter.io/tizen_webview_controller_';

/// An implementation of [PlatformWebViewController] using the Tizen WebView API.
class TizenWebViewController extends PlatformWebViewController {
/// Constructs a [TizenWebViewController].
Expand All @@ -26,12 +30,60 @@ class TizenWebViewController extends PlatformWebViewController {
final TizenWebView _webview;
late TizenNavigationDelegate _tizenNavigationDelegate;

void Function(JavaScriptConsoleMessage consoleMessage)? _onConsoleLogCallback;

late final MethodChannel _webviewControllerChannel;

/// Called when [TizenView] is created.
void createWebviewControllerChannel(int viewId) {
_webviewControllerChannel =
MethodChannel(kTizenWebViewControllerChannelName + viewId.toString());
_webviewControllerChannel.setMethodCallHandler((MethodCall call) async {
final Map<String, Object?> arguments =
(call.arguments as Map<Object?, Object?>).cast<String, Object?>();
switch (call.method) {
case 'onConsoleMessage':
JavaScriptLogLevel level = JavaScriptLogLevel.log;
switch (arguments['level']! as String) {
case 'error':
level = JavaScriptLogLevel.error;
break;
case 'warning':
level = JavaScriptLogLevel.warning;
break;
case 'debug':
level = JavaScriptLogLevel.debug;
break;
case 'info':
level = JavaScriptLogLevel.info;
break;
case 'log':
level = JavaScriptLogLevel.log;
break;
}

if (_onConsoleLogCallback != null) {
_onConsoleLogCallback!(JavaScriptConsoleMessage(
level: level,
message: arguments['message']! as String,
));
}
return null;
}

throw MissingPluginException(
'${call.method} was invoked but has no handler',
);
});
}

/// Called when [TizenView] is created.
void onCreate(int viewId) {
_webview.onCreate(viewId);
if (_webview.hasNavigationDelegate) {
_tizenNavigationDelegate.createNavigationDelegateChannel(viewId);
}
createWebviewControllerChannel(viewId);
}

@override
Expand Down Expand Up @@ -173,6 +225,20 @@ class TizenWebViewController extends PlatformWebViewController {
'This version of `TizenWebViewController` currently has no '
'implementation.');
}

/// Sets a callback that notifies the host application of any log messages
/// written to the JavaScript console.
@override
Future<void> setOnConsoleMessage(
void Function(JavaScriptConsoleMessage consoleMessage)
onConsoleMessage) async {
_onConsoleLogCallback = onConsoleMessage;
}

@override
Future<String?> getUserAgent() {
return _webview.getUserAgent();
}
}

/// An implementation of [PlatformWebViewWidget] with the Tizen WebView API.
Expand Down
12 changes: 9 additions & 3 deletions packages/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: webview_flutter_tizen
description: Tizen implementation of the webview_flutter plugin.
homepage: https://github.com/flutter-tizen/plugins
repository: https://github.com/flutter-tizen/plugins/tree/master/packages/webview_flutter
version: 0.8.0
version: 0.9.0

environment:
sdk: ">=2.18.0 <4.0.0"
Expand All @@ -20,5 +20,11 @@ dependencies:
flutter:
sdk: flutter
flutter_tizen: ^0.2.1
webview_flutter: ^4.2.3
webview_flutter_platform_interface: ^2.3.0
webview_flutter: ^4.4.2
webview_flutter_platform_interface: ^2.6.0

topics:
- html
- webview
- webview-flutter

10 changes: 6 additions & 4 deletions packages/webview_flutter/tizen/src/ewk_internal_api_binding.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ bool EwkInternalApiBinding::Initialize() {
dlsym(handle_, "ewk_view_ime_window_set"));
view.KeyEventsEnabledSet = reinterpret_cast<EwkViewKeyEventsEnabledSetFnPtr>(
dlsym(handle_, "ewk_view_key_events_enabled_set"));
view.SupportVideoHoleSet = reinterpret_cast<EwkViewSupportVideoHoleSetFnPtr>(
dlsym(handle_, "ewk_view_set_support_video_hole"));

// ewk_main
main.SetArguments = reinterpret_cast<EwkSetArgumentsFnPtr>(
Expand All @@ -57,8 +59,8 @@ bool EwkInternalApiBinding::Initialize() {

return view.SetBackgroundColor && view.FeedTouchEvent && view.SendKeyEvent &&
view.OffscreenRenderingEnabledSet && view.ImeWindowSet &&
view.KeyEventsEnabledSet && main.SetArguments &&
settings.ImePanelEnabledSet && console_message.LevelGet &&
console_message.TextGet && console_message.LineGet &&
console_message.SourceGet;
view.KeyEventsEnabledSet && view.SupportVideoHoleSet &&
main.SetArguments && settings.ImePanelEnabledSet &&
console_message.LevelGet && console_message.TextGet &&
console_message.LineGet && console_message.SourceGet;
}
5 changes: 5 additions & 0 deletions packages/webview_flutter/tizen/src/ewk_internal_api_binding.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ typedef void (*EwkViewOffscreenRenderingEnabledSetFnPtr)(Evas_Object* obj,
typedef void (*EwkViewImeWindowSetFnPtr)(Evas_Object* obj, void* window);
typedef Eina_Bool (*EwkViewKeyEventsEnabledSetFnPtr)(Evas_Object* obj,
Eina_Bool enabled);
typedef Eina_Bool (*EwkViewSupportVideoHoleSetFnPtr)(Evas_Object* obj,
void* window,
Eina_Bool enabled,
Eina_Bool boo);

typedef struct {
EwkViewBgColorSetFnPtr SetBackgroundColor = nullptr;
Expand All @@ -45,6 +49,7 @@ typedef struct {
nullptr;
EwkViewImeWindowSetFnPtr ImeWindowSet = nullptr;
EwkViewKeyEventsEnabledSetFnPtr KeyEventsEnabledSet = nullptr;
EwkViewSupportVideoHoleSetFnPtr SupportVideoHoleSet = nullptr;
} EwkViewProcTable;

typedef void (*EwkSetArgumentsFnPtr)(int argc, char** argv);
Expand Down
Loading

0 comments on commit 0701bd3

Please sign in to comment.