Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Closed
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
4 changes: 4 additions & 0 deletions packages/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.3.10

* Add `domStorageMode` property.

## 0.3.9+2

* Update Dart code to conform to current Dart formatter.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,9 @@ private void applySettings(Map<String, Object> settings) {
case "jsMode":
updateJsMode((Integer) settings.get(key));
break;
case "domStorageMode":
updateDomStorageMode((Integer) settings.get(key));
break;
case "hasNavigationDelegate":
final boolean hasNavigationDelegate = (boolean) settings.get(key);

Expand Down Expand Up @@ -226,6 +229,19 @@ private void updateJsMode(int mode) {
}
}

private void updateDomStorageMode(int mode) {
switch (mode) {
case 0: //disabled
webView.getSettings().setDomStorageEnabled(false);
break;
case 1: // enabled
webView.getSettings().setDomStorageEnabled(true);
break;
default:
throw new IllegalArgumentException("Trying to set unknown DOM Storage mode: " + mode);
}
}

private void registerJavaScriptChannelNames(List<String> channelNames) {
for (String channelName : channelNames) {
webView.addJavascriptInterface(
Expand Down
6 changes: 5 additions & 1 deletion packages/webview_flutter/lib/platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,15 @@ class WebSettings {
this.javascriptMode,
this.hasNavigationDelegate,
this.debuggingEnabled,
this.domStorageMode,
});

/// The JavaScript execution mode to be used by the webview.
final JavascriptMode javascriptMode;

/// The DOM Stroage mode to be used by Android webview.
final DOMStorageMode domStorageMode;

/// Whether the [WebView] has a [NavigationDelegate] set.
final bool hasNavigationDelegate;

Expand All @@ -178,7 +182,7 @@ class WebSettings {

@override
String toString() {
return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled)';
return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled, domStorageMode: $domStorageMode)';
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController {
}

_addIfNonNull('jsMode', settings.javascriptMode?.index);
_addIfNonNull('domStorageMode', settings.domStorageMode?.index);
_addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate);
_addIfNonNull('debuggingEnabled', settings.debuggingEnabled);
return map;
Expand Down
22 changes: 22 additions & 0 deletions packages/webview_flutter/lib/webview_flutter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ enum JavascriptMode {
unrestricted,
}

enum DOMStorageMode {
/// DOM Storage is disabled.
disabled,

/// DOM Storage is enabled.
enabled,
}

/// A message that was sent by JavaScript code running in a [WebView].
class JavascriptMessage {
/// Constructs a JavaScript message object.
Expand Down Expand Up @@ -111,17 +119,20 @@ class WebView extends StatefulWidget {
/// `onWebViewCreated` callback once the web view is created.
///
/// The `javascriptMode` parameter must not be null.
/// The `domStorageMode` parameter must not be null.
const WebView({
Key key,
this.onWebViewCreated,
this.initialUrl,
this.javascriptMode = JavascriptMode.disabled,
this.domStorageMode = DOMStorageMode.disabled,
this.javascriptChannels,
this.navigationDelegate,
this.gestureRecognizers,
this.onPageFinished,
this.debuggingEnabled = false,
}) : assert(javascriptMode != null),
assert(domStorageMode != null),
super(key: key);

static WebViewPlatform _platform;
Expand Down Expand Up @@ -177,6 +188,9 @@ class WebView extends StatefulWidget {
/// Whether Javascript execution is enabled.
final JavascriptMode javascriptMode;

/// Whether DOM Storage is enabled;
final DOMStorageMode domStorageMode;

/// The set of [JavascriptChannel]s available to JavaScript code running in the web view.
///
/// For each [JavascriptChannel] in the set, a channel object is made available for the
Expand Down Expand Up @@ -323,6 +337,7 @@ CreationParams _creationParamsfromWidget(WebView widget) {
WebSettings _webSettingsFromWidget(WebView widget) {
return WebSettings(
javascriptMode: widget.javascriptMode,
domStorageMode: widget.domStorageMode,
hasNavigationDelegate: widget.navigationDelegate != null,
debuggingEnabled: widget.debuggingEnabled,
);
Expand All @@ -332,17 +347,23 @@ WebSettings _webSettingsFromWidget(WebView widget) {
WebSettings _clearUnchangedWebSettings(
WebSettings currentValue, WebSettings newValue) {
assert(currentValue.javascriptMode != null);
assert(currentValue.domStorageMode != null);
assert(currentValue.hasNavigationDelegate != null);
assert(currentValue.debuggingEnabled != null);
assert(newValue.javascriptMode != null);
assert(newValue.domStorageMode != null);
assert(newValue.hasNavigationDelegate != null);
assert(newValue.debuggingEnabled != null);
JavascriptMode javascriptMode;
DOMStorageMode domStorageMode;
bool hasNavigationDelegate;
bool debuggingEnabled;
if (currentValue.javascriptMode != newValue.javascriptMode) {
javascriptMode = newValue.javascriptMode;
}
if (currentValue.domStorageMode != newValue.domStorageMode) {
domStorageMode = newValue.domStorageMode;
}
if (currentValue.hasNavigationDelegate != newValue.hasNavigationDelegate) {
hasNavigationDelegate = newValue.hasNavigationDelegate;
}
Expand All @@ -352,6 +373,7 @@ WebSettings _clearUnchangedWebSettings(

return WebSettings(
javascriptMode: javascriptMode,
domStorageMode: domStorageMode,
hasNavigationDelegate: hasNavigationDelegate,
debuggingEnabled: debuggingEnabled);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: webview_flutter
description: A Flutter plugin that provides a WebView widget on Android and iOS.
version: 0.3.9+2
version: 0.3.10
author: Flutter Team <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter

Expand Down
25 changes: 25 additions & 0 deletions packages/webview_flutter/test/webview_flutter_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,24 @@ void main() {
expect(platformWebView.javascriptMode, JavascriptMode.disabled);
});

testWidgets('DOM Storage mode', (WidgetTester tester) async {
await tester.pumpWidget(const WebView(
initialUrl: 'https://youtube.com',
domStorageMode: DOMStorageMode.enabled,
));

final FakePlatformWebView platformWebView =
fakePlatformViewsController.lastCreatedView;

expect(platformWebView.domStorageMode, DOMStorageMode.enabled);

await tester.pumpWidget(const WebView(
initialUrl: 'https://youtube.com',
domStorageMode: DOMStorageMode.disabled,
));
expect(platformWebView.domStorageMode, DOMStorageMode.disabled);
});

testWidgets('Load url', (WidgetTester tester) async {
WebViewController controller;
await tester.pumpWidget(
Expand Down Expand Up @@ -823,6 +841,8 @@ class FakePlatformWebView {
List<String>.from(params['javascriptChannelNames']);
}
javascriptMode = JavascriptMode.values[params['settings']['jsMode']];
domStorageMode =
DOMStorageMode.values[params['settings']['domStorageMode']];
hasNavigationDelegate =
params['settings']['hasNavigationDelegate'] ?? false;
debuggingEnabled = params['settings']['debuggingEnabled'];
Expand All @@ -841,6 +861,7 @@ class FakePlatformWebView {

String get currentUrl => history.isEmpty ? null : history[currentPosition];
JavascriptMode javascriptMode;
DOMStorageMode domStorageMode;
List<String> javascriptChannelNames;

bool hasNavigationDelegate;
Expand All @@ -856,6 +877,10 @@ class FakePlatformWebView {
if (call.arguments['jsMode'] != null) {
javascriptMode = JavascriptMode.values[call.arguments['jsMode']];
}
if (call.arguments['domStorageMode'] != null) {
domStorageMode =
DOMStorageMode.values[call.arguments['domStorageMode']];
}
if (call.arguments['hasNavigationDelegate'] != null) {
hasNavigationDelegate = call.arguments['hasNavigationDelegate'];
}
Expand Down