Added ContentBlockerActionType.BLOCK_COOKIES and ContentBlockerActionType.IGNORE_PREVIOUS_RULES for iOS and macOS platforms, Updated ContentBlockerTrigger.urlFilterIsCaseSensitive for Android, Fixed Android ContentBlockerActionType.CSS_DISPLAY_NONE usage
This commit is contained in:
parent
92329cd26a
commit
34236b0742
@ -1,3 +1,9 @@
|
|||||||
|
## 6.0.0-beta.13
|
||||||
|
|
||||||
|
- Added `ContentBlockerActionType.BLOCK_COOKIES` and `ContentBlockerActionType.IGNORE_PREVIOUS_RULES` for iOS and macOS platforms
|
||||||
|
- Updated `ContentBlockerTrigger.urlFilterIsCaseSensitive` for Android
|
||||||
|
- Fixed Android `ContentBlockerActionType.CSS_DISPLAY_NONE` usage
|
||||||
|
|
||||||
## 6.0.0-beta.12
|
## 6.0.0-beta.12
|
||||||
|
|
||||||
- Removed `willSuppressErrorPage` WebView Android setting in favor of `disableDefaultErrorPage`.
|
- Removed `willSuppressErrorPage` WebView Android setting in favor of `disableDefaultErrorPage`.
|
||||||
|
@ -8,6 +8,7 @@ import android.webkit.WebResourceResponse;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.pichillilorenzo.flutter_inappwebview.webview.in_app_webview.InAppWebView;
|
import com.pichillilorenzo.flutter_inappwebview.webview.in_app_webview.InAppWebView;
|
||||||
|
import com.pichillilorenzo.flutter_inappwebview.plugin_scripts_js.JavaScriptBridgeJS;
|
||||||
import com.pichillilorenzo.flutter_inappwebview.Util;
|
import com.pichillilorenzo.flutter_inappwebview.Util;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
@ -150,9 +151,9 @@ public class ContentBlockerHandler {
|
|||||||
final String cssSelector = action.getSelector();
|
final String cssSelector = action.getSelector();
|
||||||
final String jsScript = "(function(d) { " +
|
final String jsScript = "(function(d) { " +
|
||||||
" function hide () { " +
|
" function hide () { " +
|
||||||
" if (!d.getElementById('css-display-none-style')) { " +
|
" if (!d.getElementById('" + JavaScriptBridgeJS.JAVASCRIPT_BRIDGE_NAME + "-css-display-none-style')) { " +
|
||||||
" var c = d.createElement('style'); " +
|
" var c = d.createElement('style'); " +
|
||||||
" c.id = 'css-display-none-style'; " +
|
" c.id = '" + JavaScriptBridgeJS.JAVASCRIPT_BRIDGE_NAME + "-css-display-none-style'; " +
|
||||||
" c.innerHTML = '" + cssSelector + " { display: none !important; }'; " +
|
" c.innerHTML = '" + cssSelector + " { display: none !important; }'; " +
|
||||||
" d.body.appendChild(c); " +
|
" d.body.appendChild(c); " +
|
||||||
" }" +
|
" }" +
|
||||||
@ -165,7 +166,7 @@ public class ContentBlockerHandler {
|
|||||||
"})(document);";
|
"})(document);";
|
||||||
|
|
||||||
final Handler handler = new Handler(webView.getWebViewLooper());
|
final Handler handler = new Handler(webView.getWebViewLooper());
|
||||||
handler.post(new Runnable() {
|
handler.postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
@ -174,7 +175,7 @@ public class ContentBlockerHandler {
|
|||||||
webView.loadUrl("javascript:" + jsScript);
|
webView.loadUrl("javascript:" + jsScript);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}, 800);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MAKE_HTTPS:
|
case MAKE_HTTPS:
|
||||||
|
@ -25,11 +25,12 @@ public class ContentBlockerTrigger {
|
|||||||
public ContentBlockerTrigger(@NonNull String urlFilter, @Nullable Boolean urlFilterIsCaseSensitive, @Nullable List<ContentBlockerTriggerResourceType> resourceType,
|
public ContentBlockerTrigger(@NonNull String urlFilter, @Nullable Boolean urlFilterIsCaseSensitive, @Nullable List<ContentBlockerTriggerResourceType> resourceType,
|
||||||
@Nullable List<String> ifDomain, @Nullable List<String> unlessDomain, @Nullable List<String> loadType,
|
@Nullable List<String> ifDomain, @Nullable List<String> unlessDomain, @Nullable List<String> loadType,
|
||||||
@Nullable List<String> ifTopUrl, @Nullable List<String> unlessTopUrl) {
|
@Nullable List<String> ifTopUrl, @Nullable List<String> unlessTopUrl) {
|
||||||
|
this.urlFilterIsCaseSensitive = urlFilterIsCaseSensitive != null ? urlFilterIsCaseSensitive : false;
|
||||||
|
|
||||||
this.urlFilter = urlFilter;
|
this.urlFilter = urlFilter;
|
||||||
this.urlFilterPatternCompiled = Pattern.compile(this.urlFilter);
|
this.urlFilterPatternCompiled = Pattern.compile(this.urlFilter, this.urlFilterIsCaseSensitive ? 0 : Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
this.resourceType = resourceType != null ? resourceType : this.resourceType;
|
this.resourceType = resourceType != null ? resourceType : this.resourceType;
|
||||||
this.urlFilterIsCaseSensitive = urlFilterIsCaseSensitive != null ? urlFilterIsCaseSensitive : false;
|
|
||||||
this.ifDomain = ifDomain != null ? ifDomain : this.ifDomain;
|
this.ifDomain = ifDomain != null ? ifDomain : this.ifDomain;
|
||||||
this.unlessDomain = unlessDomain != null ? unlessDomain : this.unlessDomain;
|
this.unlessDomain = unlessDomain != null ? unlessDomain : this.unlessDomain;
|
||||||
if ((!(this.ifDomain.isEmpty() || this.unlessDomain.isEmpty()) != false))
|
if ((!(this.ifDomain.isEmpty() || this.unlessDomain.isEmpty()) != false))
|
||||||
|
@ -49,14 +49,17 @@ class ContentBlockerTrigger {
|
|||||||
///- MacOS
|
///- MacOS
|
||||||
List<String> ifFrameUrl;
|
List<String> ifFrameUrl;
|
||||||
|
|
||||||
///A Boolean value. The default value is `false`.
|
///A Boolean value indicating if the URL matching should be case-sensitive.
|
||||||
|
///The default value is `false`.
|
||||||
///
|
///
|
||||||
///**Supported Platforms/Implementations**:
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- Android native WebView
|
||||||
///- iOS
|
///- iOS
|
||||||
///- MacOS
|
///- MacOS
|
||||||
bool urlFilterIsCaseSensitive;
|
bool urlFilterIsCaseSensitive;
|
||||||
|
|
||||||
///A list of [ContentBlockerTriggerResourceType] representing the resource types (how the browser intends to use the resource) that the rule should match.
|
///A list of [ContentBlockerTriggerResourceType] representing the resource types
|
||||||
|
///(how the browser intends to use the resource) that the rule should match.
|
||||||
///If not specified, the rule matches all resource types.
|
///If not specified, the rule matches all resource types.
|
||||||
///
|
///
|
||||||
///**Supported Platforms/Implementations**:
|
///**Supported Platforms/Implementations**:
|
||||||
@ -66,7 +69,8 @@ class ContentBlockerTrigger {
|
|||||||
List<ContentBlockerTriggerResourceType> resourceType;
|
List<ContentBlockerTriggerResourceType> resourceType;
|
||||||
|
|
||||||
///A list of strings matched to a URL's domain; limits action to a list of specific domains.
|
///A list of strings matched to a URL's domain; limits action to a list of specific domains.
|
||||||
///Values must be lowercase ASCII, or punycode for non-ASCII. Add * in front to match domain and subdomains. Can't be used with [ContentBlockerTrigger.unlessDomain].
|
///Values must be lowercase ASCII, or punycode for non-ASCII.
|
||||||
|
///Add * in front to match domain and subdomains. Can't be used with [ContentBlockerTrigger.unlessDomain].
|
||||||
///
|
///
|
||||||
///**Supported Platforms/Implementations**:
|
///**Supported Platforms/Implementations**:
|
||||||
///- Android native WebView
|
///- Android native WebView
|
||||||
@ -75,7 +79,8 @@ class ContentBlockerTrigger {
|
|||||||
List<String> ifDomain;
|
List<String> ifDomain;
|
||||||
|
|
||||||
///A list of strings matched to a URL's domain; acts on any site except domains in a provided list.
|
///A list of strings matched to a URL's domain; acts on any site except domains in a provided list.
|
||||||
///Values must be lowercase ASCII, or punycode for non-ASCII. Add * in front to match domain and subdomains. Can't be used with [ContentBlockerTrigger.ifDomain].
|
///Values must be lowercase ASCII, or punycode for non-ASCII.
|
||||||
|
///Add * in front to match domain and subdomains. Can't be used with [ContentBlockerTrigger.ifDomain].
|
||||||
///
|
///
|
||||||
///**Supported Platforms/Implementations**:
|
///**Supported Platforms/Implementations**:
|
||||||
///- Android native WebView
|
///- Android native WebView
|
||||||
@ -83,7 +88,8 @@ class ContentBlockerTrigger {
|
|||||||
///- MacOS
|
///- MacOS
|
||||||
List<String> unlessDomain;
|
List<String> unlessDomain;
|
||||||
|
|
||||||
///A list of [ContentBlockerTriggerLoadType] that can include one of two mutually exclusive values. If not specified, the rule matches all load types.
|
///A list of [ContentBlockerTriggerLoadType] that can include one of two mutually exclusive values.
|
||||||
|
///If not specified, the rule matches all load types.
|
||||||
///
|
///
|
||||||
///**Supported Platforms/Implementations**:
|
///**Supported Platforms/Implementations**:
|
||||||
///- Android native WebView
|
///- Android native WebView
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter_inappwebview_internal_annotations/flutter_inappwebview_internal_annotations.dart';
|
import 'package:flutter_inappwebview_internal_annotations/flutter_inappwebview_internal_annotations.dart';
|
||||||
|
|
||||||
import '../content_blocker.dart';
|
import '../content_blocker.dart';
|
||||||
@ -9,18 +10,55 @@ part 'content_blocker_action_type.g.dart';
|
|||||||
class ContentBlockerActionType_ {
|
class ContentBlockerActionType_ {
|
||||||
// ignore: unused_field
|
// ignore: unused_field
|
||||||
final String _value;
|
final String _value;
|
||||||
|
|
||||||
const ContentBlockerActionType_._internal(this._value);
|
const ContentBlockerActionType_._internal(this._value);
|
||||||
|
|
||||||
///Stops loading of the resource. If the resource was cached, the cache is ignored.
|
///Stops loading of the resource. If the resource was cached, the cache is ignored.
|
||||||
|
@EnumSupportedPlatforms(platforms: [
|
||||||
|
EnumAndroidPlatform(value: 'block'),
|
||||||
|
EnumIOSPlatform(value: 'block'),
|
||||||
|
EnumMacOSPlatform(value: 'block')
|
||||||
|
])
|
||||||
static const BLOCK = const ContentBlockerActionType_._internal('block');
|
static const BLOCK = const ContentBlockerActionType_._internal('block');
|
||||||
|
|
||||||
///Hides elements of the page based on a CSS selector. A selector field contains the selector list. Any matching element has its display property set to none, which hides it.
|
///Hides elements of the page based on a CSS selector.
|
||||||
|
///A selector field contains the selector list.
|
||||||
|
///Any matching element has its display property set to none, which hides it.
|
||||||
///
|
///
|
||||||
///**NOTE**: on Android, JavaScript must be enabled.
|
///**NOTE**: on Android, JavaScript must be enabled.
|
||||||
|
@EnumSupportedPlatforms(platforms: [
|
||||||
|
EnumAndroidPlatform(value: 'css-display-none'),
|
||||||
|
EnumIOSPlatform(value: 'css-display-none'),
|
||||||
|
EnumMacOSPlatform(value: 'css-display-none')
|
||||||
|
])
|
||||||
static const CSS_DISPLAY_NONE =
|
static const CSS_DISPLAY_NONE =
|
||||||
const ContentBlockerActionType_._internal('css-display-none');
|
const ContentBlockerActionType_._internal('css-display-none');
|
||||||
|
|
||||||
///Changes a URL from http to https. URLs with a specified (nondefault) port and links using other protocols are unaffected.
|
///Changes a URL from http to https.
|
||||||
|
///URLs with a specified (nondefault) port and links using other protocols are unaffected.
|
||||||
|
@EnumSupportedPlatforms(platforms: [
|
||||||
|
EnumAndroidPlatform(value: 'make-https'),
|
||||||
|
EnumIOSPlatform(value: 'make-https'),
|
||||||
|
EnumMacOSPlatform(value: 'make-https')
|
||||||
|
])
|
||||||
static const MAKE_HTTPS =
|
static const MAKE_HTTPS =
|
||||||
const ContentBlockerActionType_._internal('make-https');
|
const ContentBlockerActionType_._internal('make-https');
|
||||||
|
|
||||||
|
///Strips cookies from the header before sending it to the server.
|
||||||
|
///This only blocks cookies otherwise acceptable to WebView's privacy policy.
|
||||||
|
///Combining with [IGNORE_PREVIOUS_RULES] doesn't override the browser’s privacy settings.
|
||||||
|
@EnumSupportedPlatforms(platforms: [
|
||||||
|
EnumIOSPlatform(value: 'block-cookies'),
|
||||||
|
EnumMacOSPlatform(value: 'block-cookies')
|
||||||
|
])
|
||||||
|
static const BLOCK_COOKIES =
|
||||||
|
const ContentBlockerActionType_._internal('block-cookies');
|
||||||
|
|
||||||
|
///Ignores previously triggered actions.
|
||||||
|
@EnumSupportedPlatforms(platforms: [
|
||||||
|
EnumIOSPlatform(value: 'ignore-previous-rules'),
|
||||||
|
EnumMacOSPlatform(value: 'ignore-previous-rules')
|
||||||
|
])
|
||||||
|
static const IGNORE_PREVIOUS_RULES =
|
||||||
|
const ContentBlockerActionType_._internal('ignore-previous-rules');
|
||||||
}
|
}
|
||||||
|
@ -17,23 +17,119 @@ class ContentBlockerActionType {
|
|||||||
ContentBlockerActionType._internal(value, nativeValue());
|
ContentBlockerActionType._internal(value, nativeValue());
|
||||||
|
|
||||||
///Stops loading of the resource. If the resource was cached, the cache is ignored.
|
///Stops loading of the resource. If the resource was cached, the cache is ignored.
|
||||||
static const BLOCK = ContentBlockerActionType._internal('block', 'block');
|
///
|
||||||
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- Android native WebView
|
||||||
|
///- iOS
|
||||||
|
///- MacOS
|
||||||
|
static final BLOCK =
|
||||||
|
ContentBlockerActionType._internalMultiPlatform('block', () {
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.android:
|
||||||
|
return 'block';
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
return 'block';
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
return 'block';
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
///Hides elements of the page based on a CSS selector. A selector field contains the selector list. Any matching element has its display property set to none, which hides it.
|
///Hides elements of the page based on a CSS selector.
|
||||||
|
///A selector field contains the selector list.
|
||||||
|
///Any matching element has its display property set to none, which hides it.
|
||||||
///
|
///
|
||||||
///**NOTE**: on Android, JavaScript must be enabled.
|
///**NOTE**: on Android, JavaScript must be enabled.
|
||||||
static const CSS_DISPLAY_NONE = ContentBlockerActionType._internal(
|
///
|
||||||
'css-display-none', 'css-display-none');
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- Android native WebView
|
||||||
|
///- iOS
|
||||||
|
///- MacOS
|
||||||
|
static final CSS_DISPLAY_NONE =
|
||||||
|
ContentBlockerActionType._internalMultiPlatform('css-display-none', () {
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.android:
|
||||||
|
return 'css-display-none';
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
return 'css-display-none';
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
return 'css-display-none';
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
///Changes a URL from http to https. URLs with a specified (nondefault) port and links using other protocols are unaffected.
|
///Changes a URL from http to https.
|
||||||
static const MAKE_HTTPS =
|
///URLs with a specified (nondefault) port and links using other protocols are unaffected.
|
||||||
ContentBlockerActionType._internal('make-https', 'make-https');
|
///
|
||||||
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- Android native WebView
|
||||||
|
///- iOS
|
||||||
|
///- MacOS
|
||||||
|
static final MAKE_HTTPS =
|
||||||
|
ContentBlockerActionType._internalMultiPlatform('make-https', () {
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.android:
|
||||||
|
return 'make-https';
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
return 'make-https';
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
return 'make-https';
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
///Strips cookies from the header before sending it to the server.
|
||||||
|
///This only blocks cookies otherwise acceptable to WebView's privacy policy.
|
||||||
|
///Combining with [IGNORE_PREVIOUS_RULES] doesn't override the browser’s privacy settings.
|
||||||
|
///
|
||||||
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- iOS
|
||||||
|
///- MacOS
|
||||||
|
static final BLOCK_COOKIES =
|
||||||
|
ContentBlockerActionType._internalMultiPlatform('block-cookies', () {
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
return 'block-cookies';
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
return 'block-cookies';
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
|
///Ignores previously triggered actions.
|
||||||
|
///
|
||||||
|
///**Supported Platforms/Implementations**:
|
||||||
|
///- iOS
|
||||||
|
///- MacOS
|
||||||
|
static final IGNORE_PREVIOUS_RULES =
|
||||||
|
ContentBlockerActionType._internalMultiPlatform('ignore-previous-rules',
|
||||||
|
() {
|
||||||
|
switch (defaultTargetPlatform) {
|
||||||
|
case TargetPlatform.iOS:
|
||||||
|
return 'ignore-previous-rules';
|
||||||
|
case TargetPlatform.macOS:
|
||||||
|
return 'ignore-previous-rules';
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
///Set of all values of [ContentBlockerActionType].
|
///Set of all values of [ContentBlockerActionType].
|
||||||
static final Set<ContentBlockerActionType> values = [
|
static final Set<ContentBlockerActionType> values = [
|
||||||
ContentBlockerActionType.BLOCK,
|
ContentBlockerActionType.BLOCK,
|
||||||
ContentBlockerActionType.CSS_DISPLAY_NONE,
|
ContentBlockerActionType.CSS_DISPLAY_NONE,
|
||||||
ContentBlockerActionType.MAKE_HTTPS,
|
ContentBlockerActionType.MAKE_HTTPS,
|
||||||
|
ContentBlockerActionType.BLOCK_COOKIES,
|
||||||
|
ContentBlockerActionType.IGNORE_PREVIOUS_RULES,
|
||||||
].toSet();
|
].toSet();
|
||||||
|
|
||||||
///Gets a possible [ContentBlockerActionType] instance from [String] value.
|
///Gets a possible [ContentBlockerActionType] instance from [String] value.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
name: flutter_inappwebview
|
name: flutter_inappwebview
|
||||||
description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window.
|
description: A Flutter plugin that allows you to add an inline webview, to use an headless webview, and to open an in-app browser window.
|
||||||
version: 6.0.0-beta.12
|
version: 6.0.0-beta.13
|
||||||
homepage: https://inappwebview.dev/
|
homepage: https://inappwebview.dev/
|
||||||
repository: https://github.com/pichillilorenzo/flutter_inappwebview
|
repository: https://github.com/pichillilorenzo/flutter_inappwebview
|
||||||
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
issue_tracker: https://github.com/pichillilorenzo/flutter_inappwebview/issues
|
||||||
|
Loading…
x
Reference in New Issue
Block a user