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

Side by Side Diff: ppapi/tests/test_post_message.cc

Issue 6538028: A proposal for an initial postMessage interface. This will allow JavaScript ... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 9 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 | Annotate | Revision Log
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "ppapi/tests/test_post_message.h"
6
7 #include "ppapi/c/dev/ppb_testing_dev.h"
8 #include "ppapi/c/pp_var.h"
9 #include "ppapi/cpp/dev/scriptable_object_deprecated.h"
10 #include "ppapi/cpp/instance.h"
11 #include "ppapi/cpp/var.h"
12 #include "ppapi/tests/testing_instance.h"
13
14 REGISTER_TEST_CASE(PostMessage);
15
16 namespace {
17 const PPB_Testing_Dev* GetTestingInterface() {
18 static const PPB_Testing_Dev* g_testing_interface =
19 reinterpret_cast<PPB_Testing_Dev const*>(
20 pp::Module::Get()->GetBrowserInterface(PPB_TESTING_DEV_INTERFACE));
21 return g_testing_interface;
22 }
23
24 const std::string kTestString("Hello world!");
25 const bool kTestBool(true);
26 const int32_t kTestInt(42);
27 const double kTestDouble(42.0);
28 const int32_t kThreadsToRun(10);
29 } // namespace
30
31 bool TestPostMessage::Init() {
32 testing_interface_ = reinterpret_cast<const PPB_Testing_Dev*>(
33 pp::Module::Get()->GetBrowserInterface(PPB_TESTING_DEV_INTERFACE));
34 if (!testing_interface_) {
35 // Give a more helpful error message for the testing interface being gone
36 // since that needs special enabling in Chrome.
37 instance_->AppendError("This test needs the testing interface, which is "
38 "not currently available. In Chrome, use --enable-pepper-testing when "
39 "launching.");
40 }
41 return (testing_interface_ != NULL);
42 }
43
44 void TestPostMessage::RunTest() {
45 RUN_TEST(SendingData);
46 RUN_TEST(MessageEvent);
47 RUN_TEST(NoHandler);
48 }
49
50 void TestPostMessage::HandleMessage(const pp::Var& message_data) {
51 message_data_.push_back(message_data);
52 }
53
54 bool TestPostMessage::MakeOnMessageEcho(const std::string& expression) {
55 std::string js_code(
56 "document.getElementById('plugin').onmessage = function(message_event) {"
57 " document.getElementById('plugin').postMessage(");
58 js_code += expression;
59 js_code += ");}";
60 pp::Var exception;
61 // TODO(dmichael): Move ExecuteScript to the testing interface.
62 instance_->ExecuteScript(js_code, &exception);
63 return(exception.is_undefined());
64 }
65
66 std::string TestPostMessage::TestSendingData() {
sehr (please use chromium) 2011/03/14 23:47:46 I thought that postMessage only passed strings?
dmichael(do not use this one) 2011/03/16 21:08:48 Who said that? I never said that ;-) Eventually,
67 // Set up the JavaScript onmessage handler to echo the data part of the
68 // message event back to us.
69 ASSERT_TRUE(MakeOnMessageEcho("message_event.data"));
70
71 // Test sending a message to JavaScript for each supported type. The JS sends
72 // the data back to us, and we check that they match.
73 message_data_.clear();
74 instance_->PostMessage(pp::Var(kTestString));
75 // Note that the trusted in-process version is completely synchronous, so we
76 // do not need to use 'RunMessageLoop' to wait.
77 ASSERT_EQ(message_data_.size(), 1);
78 ASSERT_TRUE(message_data_.back().is_string());
79 ASSERT_EQ(message_data_.back().AsString(), kTestString);
80
81 message_data_.clear();
82 instance_->PostMessage(pp::Var(kTestBool));
83 ASSERT_EQ(message_data_.size(), 1);
84 ASSERT_TRUE(message_data_.back().is_bool());
85 ASSERT_EQ(message_data_.back().AsBool(), kTestBool);
86
87 message_data_.clear();
88 instance_->PostMessage(pp::Var(kTestInt));
89 ASSERT_EQ(message_data_.size(), 1);
90 ASSERT_TRUE(message_data_.back().is_number());
91 ASSERT_DOUBLE_EQ(message_data_.back().AsDouble(),
92 static_cast<double>(kTestInt));
93
94 message_data_.clear();
95 instance_->PostMessage(pp::Var(kTestDouble));
96 ASSERT_EQ(message_data_.size(), 1);
97 ASSERT_TRUE(message_data_.back().is_number());
98 ASSERT_DOUBLE_EQ(message_data_.back().AsDouble(), kTestDouble);
99
100 message_data_.clear();
101 instance_->PostMessage(pp::Var());
102 ASSERT_EQ(message_data_.size(), 1);
103 ASSERT_TRUE(message_data_.back().is_undefined());
104
105 message_data_.clear();
106 instance_->PostMessage(pp::Var(pp::Var::Null()));
107 ASSERT_EQ(message_data_.size(), 1);
108 ASSERT_TRUE(message_data_.back().is_null());
109
110 return std::string();
111 }
112
113 std::string TestPostMessage::TestMessageEvent() {
114 // Set up the JavaScript onmessage handler to pass us some values from the
115 // MessageEvent and make sure they match our expectations.
116
117 // Have onmessage pass back the type of message_event and make sure it's
118 // "object".
119 ASSERT_TRUE(MakeOnMessageEcho("typeof(message_event)"));
120 message_data_.clear();
121 instance_->PostMessage(pp::Var(kTestInt));
122 ASSERT_EQ(message_data_.size(), 1);
123 ASSERT_TRUE(message_data_.back().is_string());
124 ASSERT_EQ(message_data_.back().AsString(), "object");
125
126 // Make sure all the non-data properties have the expected values.
127 bool success = MakeOnMessageEcho("((message_event.origin == '')"
128 " && (message_event.lastEventId == '')"
129 " && (message_event.source == null)"
130 " && (message_event.ports == null)"
131 " && (message_event.bubbles == false)"
132 " && (message_event.cancelable == false)"
133 ")");
134 ASSERT_TRUE(success);
135 message_data_.clear();
136 instance_->PostMessage(pp::Var(kTestInt));
137 // Note that the trusted in-process version is completely synchronous, so we
138 // do not need to use 'RunMessageLoop' to wait.
139 ASSERT_EQ(message_data_.size(), 1);
140 ASSERT_TRUE(message_data_.back().is_bool());
141 ASSERT_TRUE(message_data_.back().AsBool());
142
143 return std::string();
144 }
145
146 std::string TestPostMessage::TestNoHandler() {
147 // Delete the onmessage handler (if it exists)
148 std::string js_code(
149 "if (document.getElementById('plugin').onmessage) {"
150 " delete document.getElementById('plugin').onmessage;"
151 "}");
152 pp::Var exception;
153 instance_->ExecuteScript(js_code, &exception);
154 ASSERT_TRUE(exception.is_undefined());
155
156 // Now send a message and make sure we don't get anything back (and that we
157 // don't crash).
158 message_data_.clear();
159 instance_->PostMessage(pp::Var());
160 ASSERT_EQ(message_data_.size(), 0);
161 return std::string();
162 }
163
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698