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

Side by Side Diff: content/browser/webui/web_ui_mojo_browsertest.cc

Issue 268593002: Move existing Mojo JS <--> CPP tests out of webui test harness. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix JS busted when I alphebetized dependency list. Created 6 years, 7 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
« no previous file with comments | « no previous file | content/test/data/web_ui_mojo.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <limits> 5 #include <limits>
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
(...skipping 14 matching lines...) Expand all
25 #include "grit/content_resources.h" 25 #include "grit/content_resources.h"
26 #include "mojo/common/test/test_utils.h" 26 #include "mojo/common/test/test_utils.h"
27 #include "mojo/public/cpp/bindings/allocation_scope.h" 27 #include "mojo/public/cpp/bindings/allocation_scope.h"
28 #include "mojo/public/cpp/bindings/remote_ptr.h" 28 #include "mojo/public/cpp/bindings/remote_ptr.h"
29 #include "mojo/public/js/bindings/constants.h" 29 #include "mojo/public/js/bindings/constants.h"
30 30
31 namespace content { 31 namespace content {
32 namespace { 32 namespace {
33 33
34 bool got_message = false; 34 bool got_message = false;
35 int message_count = 0;
36
37 const int kExpectedMessageCount = 100;
38
39 // Negative numbers with different values in each byte, the last of
40 // which can survive promotion to double and back.
41 const int8 kExpectedInt8Value = -65;
42 const int16 kExpectedInt16Value = -16961;
43 const int32 kExpectedInt32Value = -1145258561;
44 const int64 kExpectedInt64Value = -77263311946305LL;
45
46 // Positive numbers with different values in each byte, the last of
47 // which can survive promotion to double and back.
48 const uint8 kExpectedUInt8Value = 65;
49 const uint16 kExpectedUInt16Value = 16961;
50 const uint32 kExpectedUInt32Value = 1145258561;
51 const uint64 kExpectedUInt64Value = 77263311946305LL;
52
53 // Double/float values, including special case constants.
54 const double kExpectedDoubleVal = 3.14159265358979323846;
55 const double kExpectedDoubleInf = std::numeric_limits<double>::infinity();
56 const double kExpectedDoubleNan = std::numeric_limits<double>::quiet_NaN();
57 const float kExpectedFloatVal = static_cast<float>(kExpectedDoubleVal);
58 const float kExpectedFloatInf = std::numeric_limits<float>::infinity();
59 const float kExpectedFloatNan = std::numeric_limits<float>::quiet_NaN();
60
61 // NaN has the property that it is not equal to itself.
62 #define EXPECT_NAN(x) EXPECT_NE(x, x)
63 35
64 // The bindings for the page are generated from a .mojom file. This code looks 36 // The bindings for the page are generated from a .mojom file. This code looks
65 // up the generated file from disk and returns it. 37 // up the generated file from disk and returns it.
66 bool GetResource(const std::string& id, 38 bool GetResource(const std::string& id,
67 const WebUIDataSource::GotDataCallback& callback) { 39 const WebUIDataSource::GotDataCallback& callback) {
68 // These are handled by the WebUIDataSource that AddMojoDataSource() creates. 40 // These are handled by the WebUIDataSource that AddMojoDataSource() creates.
69 if (id == mojo::kCodecModuleName || 41 if (id == mojo::kCodecModuleName ||
70 id == mojo::kConnectionModuleName || 42 id == mojo::kConnectionModuleName ||
71 id == mojo::kConnectorModuleName || 43 id == mojo::kConnectorModuleName ||
72 id == mojo::kRouterModuleName) 44 id == mojo::kRouterModuleName)
(...skipping 17 matching lines...) Expand all
90 run_loop_(run_loop) { 62 run_loop_(run_loop) {
91 } 63 }
92 64
93 virtual ~BrowserTargetImpl() {} 65 virtual ~BrowserTargetImpl() {}
94 66
95 // mojo::BrowserTarget overrides: 67 // mojo::BrowserTarget overrides:
96 virtual void PingResponse() OVERRIDE { 68 virtual void PingResponse() OVERRIDE {
97 NOTREACHED(); 69 NOTREACHED();
98 } 70 }
99 71
100 virtual void EchoResponse(const mojo::EchoArgs& arg1,
101 const mojo::EchoArgs& arg2) OVERRIDE {
102 NOTREACHED();
103 }
104
105 protected: 72 protected:
106 mojo::RemotePtr<mojo::RendererTarget> client_; 73 mojo::RemotePtr<mojo::RendererTarget> client_;
107 base::RunLoop* run_loop_; 74 base::RunLoop* run_loop_;
108 75
109 private: 76 private:
110 DISALLOW_COPY_AND_ASSIGN(BrowserTargetImpl); 77 DISALLOW_COPY_AND_ASSIGN(BrowserTargetImpl);
111 }; 78 };
112 79
113 class PingBrowserTargetImpl : public BrowserTargetImpl { 80 class PingBrowserTargetImpl : public BrowserTargetImpl {
114 public: 81 public:
115 PingBrowserTargetImpl(mojo::ScopedRendererTargetHandle handle, 82 PingBrowserTargetImpl(mojo::ScopedRendererTargetHandle handle,
116 base::RunLoop* run_loop) 83 base::RunLoop* run_loop)
117 : BrowserTargetImpl(handle, run_loop) { 84 : BrowserTargetImpl(handle, run_loop) {
118 client_->Ping(); 85 client_->Ping();
119 } 86 }
120 87
121 virtual ~PingBrowserTargetImpl() {} 88 virtual ~PingBrowserTargetImpl() {}
122 89
123 // mojo::BrowserTarget overrides: 90 // mojo::BrowserTarget overrides:
124 // Quit the RunLoop when called. 91 // Quit the RunLoop when called.
125 virtual void PingResponse() OVERRIDE { 92 virtual void PingResponse() OVERRIDE {
126 got_message = true; 93 got_message = true;
127 run_loop_->Quit(); 94 run_loop_->Quit();
128 } 95 }
129 96
130 private: 97 private:
131 DISALLOW_COPY_AND_ASSIGN(PingBrowserTargetImpl); 98 DISALLOW_COPY_AND_ASSIGN(PingBrowserTargetImpl);
132 }; 99 };
133 100
134 class EchoBrowserTargetImpl : public BrowserTargetImpl {
135 public:
136 EchoBrowserTargetImpl(mojo::ScopedRendererTargetHandle handle,
137 base::RunLoop* run_loop)
138 : BrowserTargetImpl(handle, run_loop) {
139 mojo::AllocationScope scope;
140 mojo::EchoArgs::Builder builder;
141 builder.set_si64(kExpectedInt64Value);
142 builder.set_si32(kExpectedInt32Value);
143 builder.set_si16(kExpectedInt16Value);
144 builder.set_si8(kExpectedInt8Value);
145 builder.set_ui64(kExpectedUInt64Value);
146 builder.set_ui32(kExpectedUInt32Value);
147 builder.set_ui16(kExpectedUInt16Value);
148 builder.set_ui8(kExpectedUInt8Value);
149 builder.set_float_val(kExpectedFloatVal);
150 builder.set_float_inf(kExpectedFloatInf);
151 builder.set_float_nan(kExpectedFloatNan);
152 builder.set_double_val(kExpectedDoubleVal);
153 builder.set_double_inf(kExpectedDoubleInf);
154 builder.set_double_nan(kExpectedDoubleNan);
155 builder.set_name("coming");
156 mojo::Array<mojo::String>::Builder string_array(3);
157 string_array[0] = "one";
158 string_array[1] = "two";
159 string_array[2] = "three";
160 builder.set_string_array(string_array.Finish());
161 client_->Echo(builder.Finish());
162 }
163
164 virtual ~EchoBrowserTargetImpl() {}
165
166 // mojo::BrowserTarget overrides:
167 // Check the response, and quit the RunLoop after N calls.
168 virtual void EchoResponse(const mojo::EchoArgs& arg1,
169 const mojo::EchoArgs& arg2) OVERRIDE {
170 EXPECT_EQ(kExpectedInt64Value, arg1.si64());
171 EXPECT_EQ(kExpectedInt32Value, arg1.si32());
172 EXPECT_EQ(kExpectedInt16Value, arg1.si16());
173 EXPECT_EQ(kExpectedInt8Value, arg1.si8());
174 EXPECT_EQ(kExpectedUInt64Value, arg1.ui64());
175 EXPECT_EQ(kExpectedUInt32Value, arg1.ui32());
176 EXPECT_EQ(kExpectedUInt16Value, arg1.ui16());
177 EXPECT_EQ(kExpectedUInt8Value, arg1.ui8());
178 EXPECT_EQ(kExpectedFloatVal, arg1.float_val());
179 EXPECT_EQ(kExpectedFloatInf, arg1.float_inf());
180 EXPECT_NAN(arg1.float_nan());
181 EXPECT_EQ(kExpectedDoubleVal, arg1.double_val());
182 EXPECT_EQ(kExpectedDoubleInf, arg1.double_inf());
183 EXPECT_NAN(arg1.double_nan());
184 EXPECT_EQ(std::string("coming"), arg1.name().To<std::string>());
185 EXPECT_EQ(std::string("one"), arg1.string_array()[0].To<std::string>());
186 EXPECT_EQ(std::string("two"), arg1.string_array()[1].To<std::string>());
187 EXPECT_EQ(std::string("three"), arg1.string_array()[2].To<std::string>());
188
189 EXPECT_EQ(-1, arg2.si64());
190 EXPECT_EQ(-1, arg2.si32());
191 EXPECT_EQ(-1, arg2.si16());
192 EXPECT_EQ(-1, arg2.si8());
193 EXPECT_EQ(std::string("going"), arg2.name().To<std::string>());
194
195 message_count += 1;
196 if (message_count == kExpectedMessageCount)
197 run_loop_->Quit();
198 }
199
200 private:
201 DISALLOW_COPY_AND_ASSIGN(EchoBrowserTargetImpl);
202 };
203
204 // WebUIController that sets up mojo bindings. 101 // WebUIController that sets up mojo bindings.
205 class TestWebUIController : public WebUIController { 102 class TestWebUIController : public WebUIController {
206 public: 103 public:
207 TestWebUIController(WebUI* web_ui, base::RunLoop* run_loop) 104 TestWebUIController(WebUI* web_ui, base::RunLoop* run_loop)
208 : WebUIController(web_ui), 105 : WebUIController(web_ui),
209 run_loop_(run_loop) { 106 run_loop_(run_loop) {
210 content::WebUIDataSource* data_source = 107 content::WebUIDataSource* data_source =
211 WebUIDataSource::AddMojoDataSource( 108 WebUIDataSource::AddMojoDataSource(
212 web_ui->GetWebContents()->GetBrowserContext()); 109 web_ui->GetWebContents()->GetBrowserContext());
213 data_source->SetRequestFilter(base::Bind(&GetResource)); 110 data_source->SetRequestFilter(base::Bind(&GetResource));
(...skipping 21 matching lines...) Expand all
235 browser_target_.reset(new PingBrowserTargetImpl( 132 browser_target_.reset(new PingBrowserTargetImpl(
236 pipe.handle_to_peer.Pass(), run_loop_)); 133 pipe.handle_to_peer.Pass(), run_loop_));
237 render_view_host->SetWebUIHandle( 134 render_view_host->SetWebUIHandle(
238 mojo::ScopedMessagePipeHandle(pipe.handle_to_self.release())); 135 mojo::ScopedMessagePipeHandle(pipe.handle_to_self.release()));
239 } 136 }
240 137
241 private: 138 private:
242 DISALLOW_COPY_AND_ASSIGN(PingTestWebUIController); 139 DISALLOW_COPY_AND_ASSIGN(PingTestWebUIController);
243 }; 140 };
244 141
245 // TestWebUIController that additionally creates the echo test BrowserTarget
246 // implementation at the right time.
247 class EchoTestWebUIController : public TestWebUIController {
248 public:
249 EchoTestWebUIController(WebUI* web_ui, base::RunLoop* run_loop)
250 : TestWebUIController(web_ui, run_loop) {
251 }
252
253 // WebUIController overrides:
254 virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE {
255 mojo::InterfacePipe<mojo::BrowserTarget, mojo::RendererTarget> pipe;
256 browser_target_.reset(new EchoBrowserTargetImpl(
257 pipe.handle_to_peer.Pass(), run_loop_));
258 render_view_host->SetWebUIHandle(
259 mojo::ScopedMessagePipeHandle(pipe.handle_to_self.release()));
260 }
261
262 private:
263 DISALLOW_COPY_AND_ASSIGN(EchoTestWebUIController);
264 };
265
266 // WebUIControllerFactory that creates TestWebUIController. 142 // WebUIControllerFactory that creates TestWebUIController.
267 class TestWebUIControllerFactory : public WebUIControllerFactory { 143 class TestWebUIControllerFactory : public WebUIControllerFactory {
268 public: 144 public:
269 TestWebUIControllerFactory() : run_loop_(NULL) {} 145 TestWebUIControllerFactory() : run_loop_(NULL) {}
270 146
271 void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; } 147 void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
272 148
273 virtual WebUIController* CreateWebUIControllerForURL( 149 virtual WebUIController* CreateWebUIControllerForURL(
274 WebUI* web_ui, const GURL& url) const OVERRIDE { 150 WebUI* web_ui, const GURL& url) const OVERRIDE {
275 if (url.query() == "ping") 151 if (url.query() == "ping")
276 return new PingTestWebUIController(web_ui, run_loop_); 152 return new PingTestWebUIController(web_ui, run_loop_);
277 if (url.query() == "echo")
278 return new EchoTestWebUIController(web_ui, run_loop_);
279 return NULL; 153 return NULL;
280 } 154 }
281 virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context, 155 virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context,
282 const GURL& url) const OVERRIDE { 156 const GURL& url) const OVERRIDE {
283 return reinterpret_cast<WebUI::TypeID>(1); 157 return reinterpret_cast<WebUI::TypeID>(1);
284 } 158 }
285 virtual bool UseWebUIForURL(BrowserContext* browser_context, 159 virtual bool UseWebUIForURL(BrowserContext* browser_context,
286 const GURL& url) const OVERRIDE { 160 const GURL& url) const OVERRIDE {
287 return true; 161 return true;
288 } 162 }
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 ASSERT_TRUE(test_server()->Start()); 208 ASSERT_TRUE(test_server()->Start());
335 base::RunLoop run_loop; 209 base::RunLoop run_loop;
336 factory()->set_run_loop(&run_loop); 210 factory()->set_run_loop(&run_loop);
337 GURL test_url(test_server()->GetURL("files/web_ui_mojo.html?ping")); 211 GURL test_url(test_server()->GetURL("files/web_ui_mojo.html?ping"));
338 NavigateToURL(shell(), test_url); 212 NavigateToURL(shell(), test_url);
339 // RunLoop is quit when message received from page. 213 // RunLoop is quit when message received from page.
340 run_loop.Run(); 214 run_loop.Run();
341 EXPECT_TRUE(got_message); 215 EXPECT_TRUE(got_message);
342 } 216 }
343 217
344 // Loads a webui page that contains mojo bindings and verifies that
345 // parameters are passed back correctly from JavaScript.
346 IN_PROC_BROWSER_TEST_F(WebUIMojoTest, EndToEndEcho) {
347 // Currently there is no way to have a generated file included in the isolate
348 // files. If the bindings file doesn't exist assume we're on such a bot and
349 // pass.
350 // TODO(sky): remove this conditional when isolates support copying from gen.
351 const base::FilePath test_file_path(
352 mojo::test::GetFilePathForJSResource(
353 "content/test/data/web_ui_test_mojo_bindings.mojom"));
354 if (!base::PathExists(test_file_path)) {
355 LOG(WARNING) << " mojom binding file doesn't exist, assuming on isolate";
356 return;
357 }
358
359 message_count = 0;
360 ASSERT_TRUE(test_server()->Start());
361 base::RunLoop run_loop;
362 factory()->set_run_loop(&run_loop);
363 GURL test_url(test_server()->GetURL("files/web_ui_mojo.html?echo"));
364 NavigateToURL(shell(), test_url);
365 // RunLoop is quit when response received from page.
366 run_loop.Run();
367 EXPECT_EQ(kExpectedMessageCount, message_count);
368 }
369
370 } // namespace 218 } // namespace
371 } // namespace content 219 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/test/data/web_ui_mojo.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698