Commit 719b3afb authored by lazyboy@chromium.org's avatar lazyboy@chromium.org

Rewrite AcceptTouchEvents test from content_browsertests to browser_tests.

Ran in trybot to make sure this is not flaky, 200 runs were successful on win and linux trybots.

BUG=368077
Test=None, internal test only change.

Review URL: https://codereview.chromium.org/271593009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@269830 0039d316-1c4b-4281-b951-d872f2087c98
parent 07c19ac6
......@@ -29,6 +29,7 @@
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/fake_speech_recognition_manager.h"
#include "content/public/test/test_renderer_host.h"
#include "extensions/common/extension.h"
#include "extensions/common/extensions_client.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
......@@ -674,6 +675,23 @@ class WebViewTest : public extensions::PlatformAppBrowserTest {
base::StringPrintf("onAppCommand('%s');", message.c_str())));
}
void SendMessageToGuestAndWait(const std::string& message,
const std::string& wait_message) {
scoped_ptr<ExtensionTestMessageListener> listener;
if (!wait_message.empty()) {
listener.reset(new ExtensionTestMessageListener(wait_message, false));
}
EXPECT_TRUE(
content::ExecuteScript(
GetGuestWebContents(),
base::StringPrintf("onAppCommand('%s');", message.c_str())));
if (listener) {
ASSERT_TRUE(listener->WaitUntilSatisfied());
}
}
content::WebContents* GetGuestWebContents() {
return guest_web_contents_;
}
......@@ -737,6 +755,34 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, EmbedderVisibilityChanged) {
loop_runner->Run();
}
IN_PROC_BROWSER_TEST_F(WebViewTest, AcceptTouchEvents) {
LoadAppWithGuest("web_view/accept_touch_events");
content::RenderViewHost* embedder_rvh =
GetEmbedderWebContents()->GetRenderViewHost();
bool embedder_has_touch_handler =
content::RenderViewHostTester::HasTouchEventHandler(embedder_rvh);
EXPECT_FALSE(embedder_has_touch_handler);
SendMessageToGuestAndWait("install-touch-handler", "installed-touch-handler");
// Note that we need to wait for the installed/registered touch handler to
// appear in browser process before querying |embedder_rvh|.
// In practice, since we do a roundrtip from browser process to guest and
// back, this is sufficient.
embedder_has_touch_handler =
content::RenderViewHostTester::HasTouchEventHandler(embedder_rvh);
EXPECT_TRUE(embedder_has_touch_handler);
SendMessageToGuestAndWait("uninstall-touch-handler",
"uninstalled-touch-handler");
// Same as the note above about waiting.
embedder_has_touch_handler =
content::RenderViewHostTester::HasTouchEventHandler(embedder_rvh);
EXPECT_FALSE(embedder_has_touch_handler);
}
// This test ensures JavaScript errors ("Cannot redefine property") do not
// happen when a <webview> is removed from DOM and added back.
IN_PROC_BROWSER_TEST_F(WebViewTest,
......
<!doctype html>
<!--
* Copyright 2014 The Chromium Authors. All rights reserved. Use of this
* source code is governed by a BSD-style license that can be found in the
* LICENSE file.
-->
<html>
<head>
<script type="text/javascript" src="guest.js"></script>
</head>
<body>
Test guest.
<div id="touch-div"></div>
</body>
</html>
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var LOG = function(msg) {
window.console.log(msg);
};
var touchDiv;
var embedder;
function init() {
touchDiv = document.createElement('div');
touchDiv.innerText = 'With touch';
document.body.appendChild(touchDiv);
}
function handler() {}
function onAppCommand(command) {
LOG('onAppCommand, command = ' + command);
switch (command) {
case 'install-touch-handler':
touchDiv.addEventListener('touchstart', handler);
sendMessageToEmbedder('installed-touch-handler');
break;
case 'uninstall-touch-handler':
touchDiv.removeEventListener('touchstart', handler);
sendMessageToEmbedder('uninstalled-touch-handler');
break;
}
};
function sendMessageToEmbedder(message) {
if (!embedder) {
LOG('no embedder channel to send postMessage');
return;
}
embedder.postMessage(JSON.stringify([message]), '*');
}
window.addEventListener('message', function(e) {
embedder = e.source;
var data = JSON.parse(e.data);
if (data[0] == 'connect') {
sendMessageToEmbedder('connected');
}
});
window.onload = init;
<!doctype html>
<!--
* Copyright 2014 The Chromium Authors. All rights reserved. Use of this
* source code is governed by a BSD-style license that can be found in the
* LICENSE file.
-->
<html>
<body>
<div id="webview-tag-container"></div>
<script src="main.js"></script>
</body>
</html>
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var LOG = function(msg) {
window.console.log(msg);
};
var startTest = function() {
var webview = document.querySelector('webview');
var onLoadStop = function(e) {
webview.contentWindow.postMessage(JSON.stringify(['connect']),'*');
};
webview.addEventListener('loadstop', onLoadStop);
webview.addEventListener('consolemessage', function(e) {
LOG('g: ' + e.message);
});
webview.partition = 'partition1';
webview.src = 'guest.html';
};
window.addEventListener('message', function(e) {
var data = JSON.parse(e.data);
LOG('data: ' + data);
switch (data[0]) {
case 'connected':
chrome.test.sendMessage('WebViewTest.LAUNCHED');
break;
case 'installed-touch-handler':
case 'uninstalled-touch-handler':
chrome.test.sendMessage(data[0]);
break;
}
});
chrome.test.getConfig(function(config) {
var guestURL = 'data:text/html,<html><body>foo</body></html>';
document.querySelector('#webview-tag-container').innerHTML =
'<webview style="width: 10px; height: 10px; margin: 0; padding: 0;"' +
'></webview>';
startTest();
});
{
"name": "<webview> touch handler registration test.",
"version": "1",
"permissions": [
"webview"
],
"app": {
"background": {
"scripts": ["test.js"]
}
},
"webview": {
"partitions": [
{
"name": "partition1",
"accessible_resources": [
"guest.js",
"guest.html"
]
}
]
}
}
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create('main.html', {}, function () {});
});
......@@ -54,20 +54,6 @@ using content::WebContentsImpl;
const char kHTMLForGuest[] =
"data:text/html,<html><body>hello world</body></html>";
const char kHTMLForGuestTouchHandler[] =
"data:text/html,<html><body><div id=\"touch\">With touch</div></body>"
"<script type=\"text/javascript\">"
"function handler() {}"
"function InstallTouchHandler() { "
" document.getElementById(\"touch\").addEventListener(\"touchstart\", "
" handler);"
"}"
"function UninstallTouchHandler() { "
" document.getElementById(\"touch\").removeEventListener(\"touchstart\", "
" handler);"
"}"
"</script></html>";
const char kHTMLForGuestAcceptDrag[] =
"data:text/html,<html><body>"
"<script>"
......@@ -161,47 +147,6 @@ class TestShortHangTimeoutGuestFactory : public TestBrowserPluginHostFactory {
DISALLOW_COPY_AND_ASSIGN(TestShortHangTimeoutGuestFactory);
};
// A transparent observer that can be used to verify that a RenderViewHost
// received a specific message.
class MessageObserver : public WebContentsObserver {
public:
MessageObserver(WebContents* web_contents, uint32 message_id)
: WebContentsObserver(web_contents),
message_id_(message_id),
message_received_(false) {
}
virtual ~MessageObserver() {}
void WaitUntilMessageReceived() {
if (message_received_)
return;
message_loop_runner_ = new MessageLoopRunner();
message_loop_runner_->Run();
}
void ResetState() {
message_received_ = false;
}
// IPC::Listener implementation.
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
if (message.type() == message_id_) {
message_received_ = true;
if (message_loop_runner_)
message_loop_runner_->Quit();
}
return false;
}
private:
scoped_refptr<MessageLoopRunner> message_loop_runner_;
uint32 message_id_;
bool message_received_;
DISALLOW_COPY_AND_ASSIGN(MessageObserver);
};
class BrowserPluginHostTest : public ContentBrowserTest {
public:
BrowserPluginHostTest()
......@@ -424,36 +369,6 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, MAYBE_EmbedderSameAfterNav) {
ASSERT_EQ(test_embedder_after_nav, test_embedder());
}
// Verifies that installing/uninstalling touch-event handlers in the guest
// plugin correctly updates the touch-event handling state in the embedder.
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptTouchEvents) {
const char kEmbedderURL[] = "/browser_plugin_embedder.html";
StartBrowserPluginTest(
kEmbedderURL, kHTMLForGuestTouchHandler, true, std::string());
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
test_embedder()->web_contents()->GetRenderViewHost());
// The embedder should not have any touch event handlers at this point.
EXPECT_FALSE(rvh->has_touch_handler());
// Install the touch handler in the guest. This should cause the embedder to
// start listening for touch events too.
MessageObserver observer(test_embedder()->web_contents(),
ViewHostMsg_HasTouchEventHandlers::ID);
ExecuteSyncJSFunction(test_guest()->web_contents()->GetMainFrame(),
"InstallTouchHandler();");
observer.WaitUntilMessageReceived();
EXPECT_TRUE(rvh->has_touch_handler());
// Uninstalling the touch-handler in guest should cause the embedder to stop
// listening for touch events.
observer.ResetState();
ExecuteSyncJSFunction(test_guest()->web_contents()->GetMainFrame(),
"UninstallTouchHandler();");
observer.WaitUntilMessageReceived();
EXPECT_FALSE(rvh->has_touch_handler());
}
// This tests verifies that reloading the embedder does not crash the browser
// and that the guest is reset.
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, DISABLED_ReloadEmbedder) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment