summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlazyboy <lazyboy@chromium.org>2014-10-02 19:44:54 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-03 02:45:06 +0000
commit97865ff398d0eb5f12546e3f6b28d925ad30069d (patch)
treece5bf71a6599f7966fbe9bd7f57f1ca6759c24ab
parent838b341ba8c4db61d5d83cc66bb2c759e555a931 (diff)
downloadchromium_src-97865ff398d0eb5f12546e3f6b28d925ad30069d.zip
chromium_src-97865ff398d0eb5f12546e3f6b28d925ad30069d.tar.gz
chromium_src-97865ff398d0eb5f12546e3f6b28d925ad30069d.tar.bz2
<webview>: Do not attempt to navigate unattached guest.
This CL also adds a check for NULL embedder_web_contents() in WebContentsViewGuest::GetContainerBounds(). This provides extra guard against trying to navigate unattached guests. Unattached guests do not have a embedder_web_contents(). BUG=419611 Test=See bug description. Review URL: https://codereview.chromium.org/615253008 Cr-Commit-Position: refs/heads/master@{#297977}
-rw-r--r--chrome/browser/apps/web_view_browsertest.cc18
-rw-r--r--chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.html12
-rw-r--r--chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.js51
-rw-r--r--chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/manifest.json12
-rw-r--r--chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/test.js7
-rw-r--r--content/browser/web_contents/web_contents_view_guest.cc13
-rw-r--r--extensions/browser/guest_view/web_view/web_view_guest.cc3
7 files changed, 112 insertions, 4 deletions
diff --git a/chrome/browser/apps/web_view_browsertest.cc b/chrome/browser/apps/web_view_browsertest.cc
index 491a90b..c83c9f6 100644
--- a/chrome/browser/apps/web_view_browsertest.cc
+++ b/chrome/browser/apps/web_view_browsertest.cc
@@ -819,6 +819,24 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, AutoSize) {
<< message_;
}
+// Test for http://crbug.com/419611.
+IN_PROC_BROWSER_TEST_F(WebViewTest, DisplayNoneSetSrc) {
+ LoadAndLaunchPlatformApp("web_view/display_none_set_src",
+ "WebViewTest.LAUNCHED");
+ // Navigate the guest while it's in "display: none" state.
+ SendMessageToEmbedder("navigate-guest");
+ GetGuestViewManager()->WaitForGuestCreated();
+
+ // Now attempt to navigate the guest again.
+ SendMessageToEmbedder("navigate-guest");
+
+ ExtensionTestMessageListener test_passed_listener("WebViewTest.PASSED",
+ false);
+ // Making the guest visible would trigger loadstop.
+ SendMessageToEmbedder("show-guest");
+ EXPECT_TRUE(test_passed_listener.WaitUntilSatisfied());
+}
+
// http://crbug.com/326332
IN_PROC_BROWSER_TEST_F(WebViewTest, DISABLED_Shim_TestAutosizeAfterNavigation) {
TestHelper("testAutosizeAfterNavigation", "web_view/shim", NO_TEST_SERVER);
diff --git a/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.html b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.html
new file mode 100644
index 0000000..d7227a6
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.html
@@ -0,0 +1,12 @@
+<!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>
diff --git a/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.js b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.js
new file mode 100644
index 0000000..262c102
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/main.js
@@ -0,0 +1,51 @@
+// 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 failTest = function() {
+ chrome.test.sendMessage('WebViewTest.FAILURE');
+};
+
+var waitingForLoadstop = false;
+
+var startTest = function() {
+ var webview = document.createElement('webview');
+ webview.style.display = 'none';
+ document.body.appendChild(webview);
+
+ var onLoadstop = function(e) {
+ if (waitingForLoadstop) {
+ chrome.test.sendMessage('WebViewTest.PASSED');
+ }
+ };
+ webview.addEventListener('loadstop', onLoadstop);
+
+ chrome.test.sendMessage('WebViewTest.LAUNCHED');
+};
+
+window.onAppCommand = function(command) {
+ LOG('onAppCommand: ' + command);
+ switch (command) {
+ case 'navigate-guest':
+ window.console.log('navigate-guest command');
+ document.querySelector('webview').src =
+ 'data:text/html,<body>Guest</body>';
+ break;
+ case 'show-guest':
+ waitingForLoadstop = true;
+ document.querySelector('webview').style.display = '';
+ break;
+ case 'hide-guest':
+ document.querySelector('webview').style.display = 'none';
+ break;
+ default:
+ failTest();
+ break;
+ }
+};
+
+window.onload = startTest;
diff --git a/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/manifest.json b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/manifest.json
new file mode 100644
index 0000000..1413e28
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/manifest.json
@@ -0,0 +1,12 @@
+{
+ "name": "<webview> check set src multiple times while display: none.",
+ "version": "1",
+ "permissions": [
+ "webview"
+ ],
+ "app": {
+ "background": {
+ "scripts": ["test.js"]
+ }
+ }
+}
diff --git a/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/test.js b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/test.js
new file mode 100644
index 0000000..a80d274
--- /dev/null
+++ b/chrome/test/data/extensions/platform_apps/web_view/display_none_set_src/test.js
@@ -0,0 +1,7 @@
+// 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 () {});
+});
diff --git a/content/browser/web_contents/web_contents_view_guest.cc b/content/browser/web_contents/web_contents_view_guest.cc
index 17a5c484..675cfae 100644
--- a/content/browser/web_contents/web_contents_view_guest.cc
+++ b/content/browser/web_contents/web_contents_view_guest.cc
@@ -96,10 +96,15 @@ ContextMenuParams WebContentsViewGuest::ConvertContextMenuParams(
}
void WebContentsViewGuest::GetContainerBounds(gfx::Rect* out) const {
- // We need embedder container's bounds to calculate our bounds.
- guest_->embedder_web_contents()->GetView()->GetContainerBounds(out);
- gfx::Point guest_coordinates = guest_->GetScreenCoordinates(gfx::Point());
- out->Offset(guest_coordinates.x(), guest_coordinates.y());
+ if (guest_->embedder_web_contents()) {
+ // We need embedder container's bounds to calculate our bounds.
+ guest_->embedder_web_contents()->GetView()->GetContainerBounds(out);
+ gfx::Point guest_coordinates = guest_->GetScreenCoordinates(gfx::Point());
+ out->Offset(guest_coordinates.x(), guest_coordinates.y());
+ } else {
+ out->set_origin(gfx::Point());
+ }
+
out->set_size(size_);
}
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc
index f00a682..0b64df4f 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -898,6 +898,9 @@ content::ColorChooser* WebViewGuest::OpenColorChooser(
void WebViewGuest::NavigateGuest(const std::string& src,
bool force_navigation) {
+ if (!attached())
+ return;
+
if (src.empty())
return;