Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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