| Index: content/browser/webui/web_ui_mojo_browsertest.cc
|
| diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc
|
| index 9bacd6685cd72d1688a324c88dd487cc1249db24..167c27635ad2dc866a412b735e1057fb2a0eb432 100644
|
| --- a/content/browser/webui/web_ui_mojo_browsertest.cc
|
| +++ b/content/browser/webui/web_ui_mojo_browsertest.cc
|
| @@ -31,9 +31,11 @@ namespace content {
|
| namespace {
|
|
|
| bool got_message = false;
|
| -int message_count = 0;
|
| +int echo_message_count = 0;
|
| +int flip_bits_message_count = 0;
|
|
|
| -const int kExpectedMessageCount = 100;
|
| +const int kExpectedEchoMessageCount = 100;
|
| +const int kExpectedFlipBitsMessageCount = 2000;
|
|
|
| // Negative numbers with different values in each byte, the last of
|
| // which can survive promotion to double and back.
|
| @@ -73,6 +75,21 @@ base::FilePath GetFilePathForJSResource(const std::string& path) {
|
| return file_path.DirName().AppendASCII(binding_path);
|
| }
|
|
|
| +bool IsRunningOnIsolatedBot() {
|
| + // Currently there is no way to have a generated file included in the isolate
|
| + // files. If the bindings file doesn't exist assume we're on such a bot and
|
| + // pass the current test.
|
| + // TODO(sky): remove this conditional when isolates support copying from gen.
|
| + const base::FilePath test_file_path(
|
| + GetFilePathForJSResource(
|
| + "content/test/data/web_ui_test_mojo_bindings.mojom"));
|
| + if (!base::PathExists(test_file_path)) {
|
| + LOG(WARNING) << " mojom binding file doesn't exist, assuming on isolate";
|
| + return true;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| // The bindings for the page are generated from a .mojom file. This code looks
|
| // up the generated file from disk and returns it.
|
| bool GetResource(const std::string& id,
|
| @@ -113,6 +130,10 @@ class BrowserTargetImpl : public mojo::BrowserTarget {
|
| NOTREACHED();
|
| }
|
|
|
| + virtual void FlipBitsResponse(const mojo::EchoArgs& arg1) OVERRIDE {
|
| + NOTREACHED();
|
| + }
|
| +
|
| protected:
|
| mojo::RemotePtr<mojo::RendererTarget> client_;
|
| base::RunLoop* run_loop_;
|
| @@ -164,7 +185,7 @@ class EchoBrowserTargetImpl : public BrowserTargetImpl {
|
| builder.set_double_inf(kExpectedDoubleInf);
|
| builder.set_double_nan(kExpectedDoubleNan);
|
| builder.set_name("coming");
|
| - client_->Echo(builder.Finish());
|
| + client_->Echo(kExpectedEchoMessageCount, builder.Finish());
|
| }
|
|
|
| virtual ~EchoBrowserTargetImpl() {}
|
| @@ -195,8 +216,8 @@ class EchoBrowserTargetImpl : public BrowserTargetImpl {
|
| EXPECT_EQ(-1, arg2.si8());
|
| EXPECT_EQ(std::string("going"), arg2.name().To<std::string>());
|
|
|
| - message_count += 1;
|
| - if (message_count == kExpectedMessageCount)
|
| + echo_message_count += 1;
|
| + if (echo_message_count == kExpectedEchoMessageCount)
|
| run_loop_->Quit();
|
| }
|
|
|
| @@ -204,6 +225,46 @@ class EchoBrowserTargetImpl : public BrowserTargetImpl {
|
| DISALLOW_COPY_AND_ASSIGN(EchoBrowserTargetImpl);
|
| };
|
|
|
| +class FlipBitsBrowserTargetImpl : public BrowserTargetImpl {
|
| + public:
|
| + FlipBitsBrowserTargetImpl(mojo::ScopedRendererTargetHandle handle,
|
| + base::RunLoop* run_loop)
|
| + : BrowserTargetImpl(handle, run_loop) {
|
| + mojo::AllocationScope scope;
|
| + mojo::EchoArgs::Builder builder;
|
| + builder.set_si64(kExpectedInt64Value);
|
| + builder.set_si32(kExpectedInt32Value);
|
| + builder.set_si16(kExpectedInt16Value);
|
| + builder.set_si8(kExpectedInt8Value);
|
| + builder.set_ui64(kExpectedUInt64Value);
|
| + builder.set_ui32(kExpectedUInt32Value);
|
| + builder.set_ui16(kExpectedUInt16Value);
|
| + builder.set_ui8(kExpectedUInt8Value);
|
| + builder.set_float_val(kExpectedFloatVal);
|
| + builder.set_float_inf(kExpectedFloatInf);
|
| + builder.set_float_nan(kExpectedFloatNan);
|
| + builder.set_double_val(kExpectedDoubleVal);
|
| + builder.set_double_inf(kExpectedDoubleInf);
|
| + builder.set_double_nan(kExpectedDoubleNan);
|
| + builder.set_name("flipping");
|
| + client_->FlipBits(kExpectedFlipBitsMessageCount, builder.Finish());
|
| + }
|
| +
|
| + virtual ~FlipBitsBrowserTargetImpl() {}
|
| +
|
| + // mojo::BrowserTarget overrides:
|
| + // Everything is fine so long as the corrupt message dosen't trigger
|
| + // ASAN errors, so just quit the RunLoop after N calls.
|
| + virtual void FlipBitsResponse(const mojo::EchoArgs& arg1) OVERRIDE {
|
| + flip_bits_message_count += 1;
|
| + if (flip_bits_message_count == kExpectedFlipBitsMessageCount)
|
| + run_loop_->Quit();
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(FlipBitsBrowserTargetImpl);
|
| +};
|
| +
|
| // WebUIController that sets up mojo bindings.
|
| class TestWebUIController : public WebUIController {
|
| public:
|
| @@ -266,6 +327,27 @@ class EchoTestWebUIController : public TestWebUIController {
|
| DISALLOW_COPY_AND_ASSIGN(EchoTestWebUIController);
|
| };
|
|
|
| +// TestWebUIController that additionally creates the flip bits test
|
| +// BrowserTarget implementation at the right time.
|
| +class FlipBitsTestWebUIController : public TestWebUIController {
|
| + public:
|
| + FlipBitsTestWebUIController(WebUI* web_ui, base::RunLoop* run_loop)
|
| + : TestWebUIController(web_ui, run_loop) {
|
| + }
|
| +
|
| + // WebUIController overrides:
|
| + virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE {
|
| + mojo::InterfacePipe<mojo::BrowserTarget, mojo::RendererTarget> pipe;
|
| + browser_target_.reset(new FlipBitsBrowserTargetImpl(
|
| + pipe.handle_to_peer.Pass(), run_loop_));
|
| + render_view_host->SetWebUIHandle(
|
| + mojo::ScopedMessagePipeHandle(pipe.handle_to_self.release()));
|
| + }
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(FlipBitsTestWebUIController);
|
| +};
|
| +
|
| // WebUIControllerFactory that creates TestWebUIController.
|
| class TestWebUIControllerFactory : public WebUIControllerFactory {
|
| public:
|
| @@ -279,6 +361,8 @@ class TestWebUIControllerFactory : public WebUIControllerFactory {
|
| return new PingTestWebUIController(web_ui, run_loop_);
|
| if (url.query() == "echo")
|
| return new EchoTestWebUIController(web_ui, run_loop_);
|
| + if (url.query() == "flipbits")
|
| + return new FlipBitsTestWebUIController(web_ui, run_loop_);
|
| return NULL;
|
| }
|
| virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context,
|
| @@ -331,17 +415,8 @@ class WebUIMojoTest : public ContentBrowserTest {
|
| // Loads a webui page that contains mojo bindings and verifies a message makes
|
| // it from the browser to the page and back.
|
| IN_PROC_BROWSER_TEST_F(WebUIMojoTest, MAYBE_EndToEndPing) {
|
| - // Currently there is no way to have a generated file included in the isolate
|
| - // files. If the bindings file doesn't exist assume we're on such a bot and
|
| - // pass.
|
| - // TODO(sky): remove this conditional when isolates support copying from gen.
|
| - const base::FilePath test_file_path(
|
| - GetFilePathForJSResource(
|
| - "content/test/data/web_ui_test_mojo_bindings.mojom"));
|
| - if (!base::PathExists(test_file_path)) {
|
| - LOG(WARNING) << " mojom binding file doesn't exist, assuming on isolate";
|
| + if (IsRunningOnIsolatedBot())
|
| return;
|
| - }
|
|
|
| got_message = false;
|
| ASSERT_TRUE(test_server()->Start());
|
| @@ -357,19 +432,10 @@ IN_PROC_BROWSER_TEST_F(WebUIMojoTest, MAYBE_EndToEndPing) {
|
| // Loads a webui page that contains mojo bindings and verifies that
|
| // parameters are passed back correctly from JavaScript.
|
| IN_PROC_BROWSER_TEST_F(WebUIMojoTest, MAYBE_EndToEndEcho) {
|
| - // Currently there is no way to have a generated file included in the isolate
|
| - // files. If the bindings file doesn't exist assume we're on such a bot and
|
| - // pass.
|
| - // TODO(sky): remove this conditional when isolates support copying from gen.
|
| - const base::FilePath test_file_path(
|
| - GetFilePathForJSResource(
|
| - "content/test/data/web_ui_test_mojo_bindings.mojom"));
|
| - if (!base::PathExists(test_file_path)) {
|
| - LOG(WARNING) << " mojom binding file doesn't exist, assuming on isolate";
|
| + if (IsRunningOnIsolatedBot())
|
| return;
|
| - }
|
|
|
| - message_count = 0;
|
| + echo_message_count = 0;
|
| ASSERT_TRUE(test_server()->Start());
|
| base::RunLoop run_loop;
|
| factory()->set_run_loop(&run_loop);
|
| @@ -377,7 +443,26 @@ IN_PROC_BROWSER_TEST_F(WebUIMojoTest, MAYBE_EndToEndEcho) {
|
| NavigateToURL(shell(), test_url);
|
| // RunLoop is quit when response received from page.
|
| run_loop.Run();
|
| - EXPECT_EQ(kExpectedMessageCount, message_count);
|
| + EXPECT_EQ(kExpectedEchoMessageCount, echo_message_count);
|
| +}
|
| +
|
| +// Loads a webui page that contains mojo bindings and verifies that
|
| +// corrupted parameters passed back from JavaScript don't trigger
|
| +// ASAN errors.
|
| +// TODO(tsepez): disabled due to http://crbug.com/366797.
|
| +IN_PROC_BROWSER_TEST_F(WebUIMojoTest, DISABLED_EndToEndFlipBits) {
|
| + if (IsRunningOnIsolatedBot())
|
| + return;
|
| +
|
| + flip_bits_message_count = 0;
|
| + ASSERT_TRUE(test_server()->Start());
|
| + base::RunLoop run_loop;
|
| + factory()->set_run_loop(&run_loop);
|
| + GURL test_url(test_server()->GetURL("files/web_ui_mojo.html?flipbits"));
|
| + NavigateToURL(shell(), test_url);
|
| + // RunLoop is quit when response received from page.
|
| + run_loop.Run();
|
| + EXPECT_EQ(kExpectedFlipBitsMessageCount, flip_bits_message_count);
|
| }
|
|
|
| } // namespace
|
|
|