Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(590)

Unified Diff: content/browser/message_port_provider_browsertest.cc

Issue 831523004: Enable posting a message from JS to Android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix component builds Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/message_port_provider_browsertest.cc
diff --git a/content/browser/message_port_provider_browsertest.cc b/content/browser/message_port_provider_browsertest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..3c9ea5d4df5a780739e02be0382a2a9c0436d69e
--- /dev/null
+++ b/content/browser/message_port_provider_browsertest.cc
@@ -0,0 +1,142 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/bind.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/synchronization/waitable_event.h"
+#include "content/browser/message_port_service.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/message_port_delegate.h"
+#include "content/public/browser/message_port_provider.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/shell/browser/shell.h"
+
+namespace content {
+
+// This test verifies the functionality of the Message Port Provider API.
+
+// A mock class for testing message port provider.
+class MockMessagePortDelegate : public MessagePortDelegate {
+ public:
+ // A container to hold received messages
+ struct Message {
+ int route_id; // the routing id of the target port
+ base::string16 data; // the message data
+ std::vector<int> sent_ports; // any transferred ports
+ };
+
+ typedef std::vector<Message> Messages;
+
+ MockMessagePortDelegate() { }
+ ~MockMessagePortDelegate() override { }
+
+ // MessagePortDelegate implementation
+ void SendMessage(int route_id,
+ const base::string16& message,
+ const std::vector<int>& sent_message_port_ids) override {
+ Message m;
+ m.route_id = route_id;
+ m.data = message;
+ m.sent_ports = sent_message_port_ids;
+ messages_.push_back(m);
+ }
+
+ void SendMessagesAreQueued(int route_id) override { }
+
+ const Messages& getReceivedMessages() {
+ return messages_;
+ }
+ private:
+ Messages messages_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockMessagePortDelegate);
+};
+
+
+class MessagePortProviderBrowserTest : public ContentBrowserTest {
+};
+
+// Verify that messages can be posted to main frame.
+IN_PROC_BROWSER_TEST_F(MessagePortProviderBrowserTest, PostMessage) {
+ const std::string data =
+ "<!DOCTYPE html><html><body>"
+ " <script type=\"text/javascript\">"
+ " onmessage = function (e) { document.title = e.data; }"
+ " </script>"
+ "</body></html>";
+ const base::string16 target_origin(base::UTF8ToUTF16("http://baseurl"));
+ const GURL base_url(target_origin);
+ const GURL history_url;
+ // Load data. Blocks until it is done.
+ content::LoadDataWithBaseURL(shell(), history_url, data, base_url);
+ const base::string16 source_origin(base::UTF8ToUTF16("source"));
+ const base::string16 message(base::UTF8ToUTF16("success"));
+ const std::vector<int> ports;
+ content::TitleWatcher title_watcher(shell()->web_contents(), message);
+ MessagePortProvider::PostMessageToFrame(shell()->web_contents(),
+ source_origin,
+ target_origin,
+ message,
+ ports);
+ EXPECT_EQ(message, title_watcher.WaitAndGetTitle());
+}
+
+namespace {
+
+void VerifyCreateChannelOnIOThread(base::WaitableEvent* event) {
+
+ const base::char16 MESSAGE1[] = { 0x1000, 0 };
+ const base::char16 MESSAGE2[] = { 0x1001, 0 };
+
+ MockMessagePortDelegate delegate;
+ int port1;
+ int port2;
+
+ MessagePortProvider::CreateMessageChannel(&delegate, &port1, &port2);
+ MessagePortService* service = MessagePortService::GetInstance();
+ // Send a message to port1 transferring no ports.
+ std::vector<int> sent_ports;
+ service->PostMessage(port1, base::string16(MESSAGE1), sent_ports);
+ // Verify that message is received
+ const MockMessagePortDelegate::Messages& received =
+ delegate.getReceivedMessages();
+ EXPECT_EQ(received.size(), 1u);
+ // Verify that message sent to port1 is received by entangled port, which is
+ // port2.
+ EXPECT_EQ(received[0].route_id, port2);
+ EXPECT_EQ(received[0].data, MESSAGE1);
+ EXPECT_EQ(received[0].sent_ports.size(), 0u);
+
+ // Create a new channel, and transfer one of its ports to port2, making sure
+ // the transferred port is received.
+ int port3;
+ int port4;
+ MessagePortProvider::CreateMessageChannel(&delegate, &port3, &port4);
+ sent_ports.push_back(port3);
+ service->PostMessage(port1, base::string16(MESSAGE2), sent_ports);
+ EXPECT_EQ(received.size(), 2u);
+ EXPECT_EQ(received[1].route_id, port2);
+ EXPECT_EQ(received[1].data, MESSAGE2);
+ EXPECT_EQ(received[1].sent_ports.size(), 1u);
+ EXPECT_EQ(received[1].sent_ports[0], port3);
+
+ event->Signal();
+}
+
+} // namespace
+
+// Verify that a message channel can be created and used for exchanging
+// messages.
+IN_PROC_BROWSER_TEST_F(MessagePortProviderBrowserTest, CreateChannel) {
+ base::WaitableEvent event(true, false);
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&VerifyCreateChannelOnIOThread, &event));
+ event.Wait();
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698