How Do You Use WebMessagePort As An Alternative to addJavascriptInterface()?

后端 未结 4 819
不思量自难忘°
不思量自难忘° 2020-12-10 03:42

Google\'s security guidelines for Android app developers has the following:

WebViews do not use addJavaScriptInterface() with untrusted cont

4条回答
  •  独厮守ぢ
    2020-12-10 04:12

    There's a test for it in CTS

    // Create a message channel and make sure it can be used for data transfer to/from js.
    public void testMessageChannel() throws Throwable {
        if (!NullWebViewUtils.isWebViewAvailable()) {
            return;
        }
        loadPage(CHANNEL_MESSAGE);
        final WebMessagePort[] channel = mOnUiThread.createWebMessageChannel();
        WebMessage message = new WebMessage(WEBVIEW_MESSAGE, new WebMessagePort[]{channel[1]});
        mOnUiThread.postWebMessage(message, Uri.parse(BASE_URI));
        final int messageCount = 3;
        final CountDownLatch latch = new CountDownLatch(messageCount);
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < messageCount; i++) {
                    channel[0].postMessage(new WebMessage(WEBVIEW_MESSAGE + i));
                }
                channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() {
                    @Override
                    public void onMessage(WebMessagePort port, WebMessage message) {
                        int i = messageCount - (int)latch.getCount();
                        assertEquals(WEBVIEW_MESSAGE + i + i, message.getData());
                        latch.countDown();
                    }
                });
            }
        });
        // Wait for all the responses to arrive.
        boolean ignore = latch.await(TIMEOUT, java.util.concurrent.TimeUnit.MILLISECONDS);
    }
    

    file: cts/tests/tests/webkit/src/android/webkit/cts/PostMessageTest.java. At least some starting point.

提交回复
热议问题