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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "base/strings/utf_string_conversions.h"
7 #include "base/synchronization/waitable_event.h"
8 #include "content/browser/message_port_service.h"
9 #include "content/public/browser/browser_thread.h"
10 #include "content/public/browser/message_port_delegate.h"
11 #include "content/public/browser/message_port_provider.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/test/browser_test_utils.h"
14 #include "content/public/test/content_browser_test.h"
15 #include "content/public/test/content_browser_test_utils.h"
16 #include "content/shell/browser/shell.h"
17
18 namespace content {
19
20 // This test verifies the functionality of the Message Port Provider API.
21
22 // A mock class for testing message port provider.
23 class MockMessagePortDelegate : public MessagePortDelegate {
24 public:
25 // A container to hold received messages
26 struct Message {
27 int route_id; // the routing id of the target port
28 base::string16 data; // the message data
29 std::vector<int> sent_ports; // any transferred ports
30 };
31
32 typedef std::vector<Message> Messages;
33
34 MockMessagePortDelegate() { }
35 ~MockMessagePortDelegate() override { }
36
37 // MessagePortDelegate implementation
38 void SendMessage(int route_id,
39 const base::string16& message,
40 const std::vector<int>& sent_message_port_ids) override {
41 Message m;
42 m.route_id = route_id;
43 m.data = message;
44 m.sent_ports = sent_message_port_ids;
45 messages_.push_back(m);
46 }
47
48 void SendMessagesAreQueued(int route_id) override { }
49
50 const Messages& getReceivedMessages() {
51 return messages_;
52 }
53 private:
54 Messages messages_;
55
56 DISALLOW_COPY_AND_ASSIGN(MockMessagePortDelegate);
57 };
58
59
60 class MessagePortProviderBrowserTest : public ContentBrowserTest {
61 };
62
63 // Verify that messages can be posted to main frame.
64 IN_PROC_BROWSER_TEST_F(MessagePortProviderBrowserTest, PostMessage) {
65 const std::string data =
66 "<!DOCTYPE html><html><body>"
67 " <script type=\"text/javascript\">"
68 " onmessage = function (e) { document.title = e.data; }"
69 " </script>"
70 "</body></html>";
71 const base::string16 target_origin(base::UTF8ToUTF16("http://baseurl"));
72 const GURL base_url(target_origin);
73 const GURL history_url;
74 // Load data. Blocks until it is done.
75 content::LoadDataWithBaseURL(shell(), history_url, data, base_url);
76 const base::string16 source_origin(base::UTF8ToUTF16("source"));
77 const base::string16 message(base::UTF8ToUTF16("success"));
78 const std::vector<int> ports;
79 content::TitleWatcher title_watcher(shell()->web_contents(), message);
80 MessagePortProvider::PostMessageToFrame(shell()->web_contents(),
81 source_origin,
82 target_origin,
83 message,
84 ports);
85 EXPECT_EQ(message, title_watcher.WaitAndGetTitle());
86 }
87
88 namespace {
89
90 void VerifyCreateChannelOnIOThread(base::WaitableEvent* event) {
91
92 const base::char16 MESSAGE1[] = { 0x1000, 0 };
93 const base::char16 MESSAGE2[] = { 0x1001, 0 };
94
95 MockMessagePortDelegate delegate;
96 int port1;
97 int port2;
98
99 MessagePortProvider::CreateMessageChannel(&delegate, &port1, &port2);
100 MessagePortService* service = MessagePortService::GetInstance();
101 // Send a message to port1 transferring no ports.
102 std::vector<int> sent_ports;
103 service->PostMessage(port1, base::string16(MESSAGE1), sent_ports);
104 // Verify that message is received
105 const MockMessagePortDelegate::Messages& received =
106 delegate.getReceivedMessages();
107 EXPECT_EQ(received.size(), 1u);
108 // Verify that message sent to port1 is received by entangled port, which is
109 // port2.
110 EXPECT_EQ(received[0].route_id, port2);
111 EXPECT_EQ(received[0].data, MESSAGE1);
112 EXPECT_EQ(received[0].sent_ports.size(), 0u);
113
114 // Create a new channel, and transfer one of its ports to port2, making sure
115 // the transferred port is received.
116 int port3;
117 int port4;
118 MessagePortProvider::CreateMessageChannel(&delegate, &port3, &port4);
119 sent_ports.push_back(port3);
120 service->PostMessage(port1, base::string16(MESSAGE2), sent_ports);
121 EXPECT_EQ(received.size(), 2u);
122 EXPECT_EQ(received[1].route_id, port2);
123 EXPECT_EQ(received[1].data, MESSAGE2);
124 EXPECT_EQ(received[1].sent_ports.size(), 1u);
125 EXPECT_EQ(received[1].sent_ports[0], port3);
126
127 event->Signal();
128 }
129
130 } // namespace
131
132 // Verify that a message channel can be created and used for exchanging
133 // messages.
134 IN_PROC_BROWSER_TEST_F(MessagePortProviderBrowserTest, CreateChannel) {
135 base::WaitableEvent event(true, false);
136 BrowserThread::PostTask(
137 BrowserThread::IO, FROM_HERE,
138 base::Bind(&VerifyCreateChannelOnIOThread, &event));
139 event.Wait();
140 }
141
142 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698