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/macros.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "base/synchronization/waitable_event.h"
9 #include "content/public/browser/browser_thread.h"
10 #include "content/public/browser/message_port_provider.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/test/browser_test.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 class MessagePortProviderBrowserTest : public ContentBrowserTest {
23 };
24 
25 // Verify that messages can be posted to main frame.
IN_PROC_BROWSER_TEST_F(MessagePortProviderBrowserTest,PostMessage)26 IN_PROC_BROWSER_TEST_F(MessagePortProviderBrowserTest, PostMessage) {
27   // Listen for a message.
28   ASSERT_TRUE(embedded_test_server()->Start());
29   GURL url(embedded_test_server()->GetURL("/title1.html"));
30   EXPECT_TRUE(NavigateToURL(shell(), url));
31   EXPECT_TRUE(ExecuteScript(shell(), R"(
32       onmessage = function(e) {
33           domAutomationController.send(e.origin + ':' + e.data);
34       } )"));
35 
36   // Post a message.
37   const std::string target_origin(url.GetOrigin().spec());
38   const std::string source_origin("https://source.origin.com");
39   const std::string message("success");
40   DOMMessageQueue msg_queue;
41   MessagePortProvider::PostMessageToFrame(
42       shell()->web_contents(), base::UTF8ToUTF16(source_origin),
43       base::UTF8ToUTF16(target_origin), base::UTF8ToUTF16(message));
44 
45   // Verify that the message was received (and had the expected payload).
46   std::string expected_test_reply;
47   expected_test_reply += '"';
48   expected_test_reply += source_origin;
49   expected_test_reply += ':';
50   expected_test_reply += message;
51   expected_test_reply += '"';
52   std::string actual_test_reply;
53   EXPECT_TRUE(msg_queue.WaitForMessage(&actual_test_reply));
54   EXPECT_EQ(expected_test_reply, actual_test_reply);
55 }
56 
57 }  // namespace content
58