Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"callHandler" method is not injected into InAppBrowser #1973

Open
2 tasks done
7akub opened this issue Jan 12, 2024 · 2 comments
Open
2 tasks done

"callHandler" method is not injected into InAppBrowser #1973

7akub opened this issue Jan 12, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@7akub
Copy link

7akub commented Jan 12, 2024

  • I have read the Getting Started section
  • I have already searched for the same problem

Environment

Technology Version
Flutter version 3.13.2
Plugin version 6.0.0
Android version 11, MIUI 12.5.15/12.1.1
iOS version n/a
macOS version n/a
Xcode version n/a
Google Chrome version n/a

Device information: Xiaomi Redmi Note 8 Pro / Xiaomi Mi 9T

Description

Provided code worked fine before I moved from version 5.8.0 to version 6.0.0. After upgrade callHandler is not available from the website opened in InAppBrowser. I've been looking for a solution, but it seems that no one else have been affected by this.

Stoped working only on Android devices, I tested it on iOS 17.1.2 and it works just fine.

Expected behavior:
callHandler method should be injected into InAppBrowser

Current behavior:
callHandler is undefined when creating InAppBrowser

Steps to reproduce

final options = InAppBrowserClassSettings(
  browserSettings: InAppBrowserSettings(
    hideTitleBar: true,
    allowGoBackWithBackButton: false,
    shouldCloseOnBackButtonPressed: true,
    hideToolbarTop: !displayNavigation,
    hideUrlBar: true,
  ),
  webViewSettings: InAppWebViewSettings(
    useShouldOverrideUrlLoading: true,
    javaScriptEnabled: true,
    isInspectable: true,
    clearCache: true,
    clearSessionCache: true,
  ),
);

final InAppBrowser browser = CustomBrowser(
  onCloseCallback: () {
    // Do something
  },
);
  
browser.openUrlRequest(
urlRequest: URLRequest(url: WebUri(url)),
settings: options,
);
class CustomBrowser extends InAppBrowser {
  CustomBrowser({
    this.onCloseCallback,
    int? windowId,
    UnmodifiableListView<UserScript>? initialUserScripts,
  }) : super(
          windowId: windowId,
          initialUserScripts: initialUserScripts,
        );

  final Function()? onCloseCallback;

  @override
  Future onBrowserCreated() async {
    developer.log("Browser Created!");

    if (webViewController != null) {
      developer.log('Adding JS handler');

      webViewController!.addJavaScriptHandler(
        handlerName: JavaScriptHandlerType.closeInAppBrowser,
        callback: (_) {
          if (onCloseCallback != null) {
            onCloseCallback!();
          }

          close();
        },
      );
    }
  }
}

Images

image

image

@7akub 7akub added the bug Something isn't working label Jan 12, 2024
Copy link

👋 @7akub

NOTE: This comment is auto-generated.

Are you sure you have already searched for the same problem?

Some people open new issues but they didn't search for something similar or for the same issue. Please, search for it using the GitHub issue search box or on the official inappwebview.dev website, or, also, using Google, StackOverflow, etc. before posting a new one. You may already find an answer to your problem!

If this is really a new issue, then thank you for raising it. I will investigate it and get back to you as soon as possible. Please, make sure you have given me as much context as possible! Also, if you didn't already, post a code example that can replicate this issue.

In the meantime, you can already search for some possible solutions online! Because this plugin uses native WebView, you can search online for the same issue adding android WebView [MY ERROR HERE] or ios WKWebView [MY ERROR HERE] keywords.

Following these steps can save you, me, and other people a lot of time, thanks!

@fuzzybinary
Copy link

I'm also being affected by this.

It appears to be an issue in Android 33+ where WebViewFeature.DOCUMENT_START_SCRIPT is supported. From what I can tell, there's no point at which JAVASCRIPT_BRIDGE_JS_SOURCE is being injected when this feature is enabled.

When testing on Android 31, prepareAndAddUserScripts is called as part of InAppWebview.prepare. but it is not called on Android 33+, and prepareAndAddUserScripts appears to be the only location where JAVASCRIPT_BRIDGE_JS_SOURCE could be injected.

fuzzybinary added a commit to fuzzybinary/flutter_inappwebview that referenced this issue Nov 22, 2024
Android InAppBrowserActivity would not call `prepareAndAddUserScripts` when `WebViewFeature.DOCUMENT_START_SCRIPT`, which would prevent shims like `callHandler` from being injected.

Fix this by calling `prepareAndAddUserScripts` during OnCreate.

Add an integration test for JavaScript handlers in in_app_browser.

refs: pichillilorenzo#1973
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants