diff options
author | lazyboy <lazyboy@chromium.org> | 2014-10-02 19:44:54 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-03 02:45:06 +0000 |
commit | 97865ff398d0eb5f12546e3f6b28d925ad30069d (patch) | |
tree | ce5bf71a6599f7966fbe9bd7f57f1ca6759c24ab | |
parent | 838b341ba8c4db61d5d83cc66bb2c759e555a931 (diff) | |
download | chromium_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}
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; |