Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78568bfa authored by Selim Gurun's avatar Selim Gurun Committed by Android (Google) Code Review
Browse files

Merge "Implement PostMessage API for Webview"

parents 4771577a 4c8093af
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -36925,6 +36925,26 @@ package android.webkit {
    method public abstract void onReceivedIcon(java.lang.String, android.graphics.Bitmap);
  }
  public class WebMessage {
    ctor public WebMessage(java.lang.String);
    ctor public WebMessage(java.lang.String, android.webkit.WebMessagePort[]);
    method public java.lang.String getData();
    method public android.webkit.WebMessagePort[] getPorts();
  }
  public abstract class WebMessagePort {
    ctor public WebMessagePort();
    method public abstract void close();
    method public abstract void postMessage(android.webkit.WebMessage);
    method public abstract void setWebMessageCallback(android.webkit.WebMessagePort.WebMessageCallback);
    method public abstract void setWebMessageCallback(android.webkit.WebMessagePort.WebMessageCallback, android.os.Handler);
  }
  public static abstract class WebMessagePort.WebMessageCallback {
    ctor public WebMessagePort.WebMessageCallback();
    method public void onMessage(android.webkit.WebMessagePort, android.webkit.WebMessage);
  }
  public abstract class WebResourceError {
    ctor public WebResourceError();
    method public abstract java.lang.String getDescription();
@@ -37168,6 +37188,7 @@ package android.webkit {
    method public android.webkit.WebBackForwardList copyBackForwardList();
    method public deprecated android.print.PrintDocumentAdapter createPrintDocumentAdapter();
    method public android.print.PrintDocumentAdapter createPrintDocumentAdapter(java.lang.String);
    method public android.webkit.WebMessagePort[] createWebMessageChannel();
    method public void destroy();
    method public void documentHasImages(android.os.Message);
    method public static void enableSlowWholeDocumentDraw();
@@ -37208,6 +37229,7 @@ package android.webkit {
    method public boolean pageDown(boolean);
    method public boolean pageUp(boolean);
    method public void pauseTimers();
    method public void postMessageToMainFrame(android.webkit.WebMessage, android.net.Uri);
    method public void postUrl(java.lang.String, byte[]);
    method public void reload();
    method public void removeJavascriptInterface(java.lang.String);
+24 −0
Original line number Diff line number Diff line
@@ -39154,6 +39154,26 @@ package android.webkit {
    method public abstract void onReceivedIcon(java.lang.String, android.graphics.Bitmap);
  }
  public class WebMessage {
    ctor public WebMessage(java.lang.String);
    ctor public WebMessage(java.lang.String, android.webkit.WebMessagePort[]);
    method public java.lang.String getData();
    method public android.webkit.WebMessagePort[] getPorts();
  }
  public abstract class WebMessagePort {
    ctor public WebMessagePort();
    method public abstract void close();
    method public abstract void postMessage(android.webkit.WebMessage);
    method public abstract void setWebMessageCallback(android.webkit.WebMessagePort.WebMessageCallback);
    method public abstract void setWebMessageCallback(android.webkit.WebMessagePort.WebMessageCallback, android.os.Handler);
  }
  public static abstract class WebMessagePort.WebMessageCallback {
    ctor public WebMessagePort.WebMessageCallback();
    method public void onMessage(android.webkit.WebMessagePort, android.webkit.WebMessage);
  }
  public abstract class WebResourceError {
    ctor public WebResourceError();
    method public abstract java.lang.String getDescription();
@@ -39411,6 +39431,7 @@ package android.webkit {
    method public android.webkit.WebBackForwardList copyBackForwardList();
    method public deprecated android.print.PrintDocumentAdapter createPrintDocumentAdapter();
    method public android.print.PrintDocumentAdapter createPrintDocumentAdapter(java.lang.String);
    method public android.webkit.WebMessagePort[] createWebMessageChannel();
    method public void destroy();
    method public void documentHasImages(android.os.Message);
    method public static void enableSlowWholeDocumentDraw();
@@ -39452,6 +39473,7 @@ package android.webkit {
    method public boolean pageDown(boolean);
    method public boolean pageUp(boolean);
    method public void pauseTimers();
    method public void postMessageToMainFrame(android.webkit.WebMessage, android.net.Uri);
    method public void postUrl(java.lang.String, byte[]);
    method public void reload();
    method public void removeJavascriptInterface(java.lang.String);
@@ -39664,6 +39686,7 @@ package android.webkit {
    method public abstract void clearView();
    method public abstract android.webkit.WebBackForwardList copyBackForwardList();
    method public abstract android.print.PrintDocumentAdapter createPrintDocumentAdapter(java.lang.String);
    method public abstract android.webkit.WebMessagePort[] createWebMessageChannel();
    method public abstract void destroy();
    method public abstract void documentHasImages(android.os.Message);
    method public abstract void dumpViewHierarchyWithProperties(java.io.BufferedWriter, int);
@@ -39710,6 +39733,7 @@ package android.webkit {
    method public abstract boolean pageDown(boolean);
    method public abstract boolean pageUp(boolean);
    method public abstract void pauseTimers();
    method public abstract void postMessageToMainFrame(android.webkit.WebMessage, android.net.Uri);
    method public abstract void postUrl(java.lang.String, byte[]);
    method public abstract void reload();
    method public abstract void removeJavascriptInterface(java.lang.String);
+62 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.webkit;

/**
 * The Java representation of the HTML5 PostMessage event. See
 * https://html.spec.whatwg.org/multipage/comms.html#the-messageevent-interfaces
 * for definition of a MessageEvent in HTML5.
 *
 */
public class WebMessage {

    private String mData;
    private WebMessagePort[] mPorts;

    /**
     * Creates a WebMessage.
     * @param data  the data of the message.
     */
    public WebMessage(String data) {
        mData = data;
    }

    /**
     * Creates a WebMessage.
     * @param data  the data of the message.
     * @param ports  the ports that are sent with the message.
     */
    public WebMessage(String data, WebMessagePort[] ports) {
        mData = data;
        mPorts = ports;
    }

    /**
     * Returns the data of the message.
     */
    public String getData() {
        return mData;
    }

    /**
     * Returns the ports that are sent with the message, or null if no port
     * is sent.
     */
    public WebMessagePort[] getPorts() {
        return mPorts;
    }
}
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.webkit;

import android.os.Handler;

/**
 * The Java representation of the HTML5 Message Port. See
 * https://html.spec.whatwg.org/multipage/comms.html#messageport
 * for definition of MessagePort in HTML5.
 *
 * A Message port represents one endpoint of a Message Channel. In Android
 * webview, there is no separate Message Channel object. When a message channel
 * is created, both ports are tangled to each other and started, and then
 * returned in a MessagePort array, see {@link WebView#createWebMessageChannel}
 * for creating a message channel.
 *
 * When a message port is first created or received via transfer, it does not
 * have a WebMessageCallback to receive web messages. The messages are queued until
 * a WebMessageCallback is set.
 */
public abstract class WebMessagePort {

    /**
     * The listener for handling MessagePort events. The message callback
     * methods are called on the main thread. If the embedder application
     * wants to receive the messages on a different thread, it can do this
     * by passing a Handler in
     *  {@link WebMessagePort#setWebMessageCallback(WebMessageCallback, Handler)}.
     * In the latter case, the application should be extra careful for thread safety
     * since WebMessagePort methods should be called on main thread.
     */
    public static abstract class WebMessageCallback {
        /**
         * Message callback for receiving onMessage events.
         *
         * @param port  the WebMessagePort that the message is destined for
         * @param message  the message from the entangled port.
         */
        public void onMessage(WebMessagePort port, WebMessage message) { }
    }

    /**
     * Post a WebMessage to the entangled port.
     *
     * @param message  the message from Java to JS.
     *
     * @throws IllegalStateException If message port is already transferred or closed.
     */
    public abstract void postMessage(WebMessage message);

    /**
     * Close the message port and free any resources associated with it.
     */
    public abstract void close();

    /**
     * Sets a callback to receive message events on the main thread.
     *
     * @param callback  the message callback.
     */
    public abstract void setWebMessageCallback(WebMessageCallback callback);

    /**
     * Sets a callback to receive message events on the handler that is provided
     * by the application.
     *
     * @param callback  the message callback.
     * @param handler   the handler to receive the message messages.
     */
    public abstract void setWebMessageCallback(WebMessageCallback callback, Handler handler);
}
+32 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.http.SslCertificate;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
@@ -1824,6 +1825,37 @@ public class WebView extends AbsoluteLayout
        mProvider.removeJavascriptInterface(name);
    }

    /**
     * Creates a message channel to communicate with JS and returns the message
     * ports that represent the endpoints of this message channel. The HTML5 message
     * channel functionality is described here:
     * https://html.spec.whatwg.org/multipage/comms.html#messagechannel
     *
     * The returned message channels are entangled and already in started state.
     *
     * @return the two message ports that form the message channel.
     */
    public WebMessagePort[] createWebMessageChannel() {
        checkThread();
        if (TRACE) Log.d(LOGTAG, "createWebMessageChannel");
        return mProvider.createWebMessageChannel();
    }

    /**
     * Post a message to main frame. The embedded application can restrict the
     * messages to a certain target origin. See
     *    https://html.spec.whatwg.org/multipage/comms.html#posting-messages
     * for how target origin can be used.
     *
     * @param message the WebMessage
     * @param targetOrigin the target origin.
     */
    public void postMessageToMainFrame(WebMessage message, Uri targetOrigin) {
        checkThread();
        if (TRACE) Log.d(LOGTAG, "postMessageToMainFrame. TargetOrigin=" + targetOrigin);
        mProvider.postMessageToMainFrame(message, targetOrigin);
    }

    /**
     * Gets the WebSettings object used to control the settings for this
     * WebView.
Loading