Commit 44c8a68f authored by lfg's avatar lfg Committed by Commit bot

Fix crash when a webview tries to load a plugin resource.

BUG=477148
TEST=Load webview browser sample (https://chrome.google.com/webstore/detail/browser-sample/edggnmnajhcbhlnpjnogkjpghaikidaa), use the browser sample app to navigate to a website that embeds a plugin (flash or pdf). Verify that the browser doesn't crash.

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

Cr-Commit-Position: refs/heads/master@{#325454}
parent 5b2b422e
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "content/public/browser/gpu_data_manager.h" #include "content/public/browser/gpu_data_manager.h"
#include "content/public/browser/interstitial_page.h" #include "content/public/browser/interstitial_page.h"
#include "content/public/browser/interstitial_page_delegate.h" #include "content/public/browser/interstitial_page_delegate.h"
...@@ -2748,6 +2749,14 @@ IN_PROC_BROWSER_TEST_F(WebViewCaptureTest, ...@@ -2748,6 +2749,14 @@ IN_PROC_BROWSER_TEST_F(WebViewCaptureTest,
TestHelper("testScreenshotCapture", "web_view/shim", NO_TEST_SERVER); TestHelper("testScreenshotCapture", "web_view/shim", NO_TEST_SERVER);
} }
// Tests that browser process does not crash when loading plugin inside
// <webview> with content settings set to CONTENT_SETTING_BLOCK.
IN_PROC_BROWSER_TEST_F(WebViewTest, TestPlugin) {
browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK);
TestHelper("testPlugin", "web_view/shim", NEEDS_TEST_SERVER);
}
#if defined(OS_WIN) #if defined(OS_WIN)
// Test is disabled on Windows because it times out often. // Test is disabled on Windows because it times out often.
// http://crbug.com/403325 // http://crbug.com/403325
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/browser/guest_view/guest_view_base.h" #include "extensions/browser/guest_view/guest_view_base.h"
#include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_constants.h"
#include "extensions/common/manifest_handlers/webview_info.h" #include "extensions/common/manifest_handlers/webview_info.h"
...@@ -157,6 +158,8 @@ bool IsPluginLoadingAccessibleResourceInWebView( ...@@ -157,6 +158,8 @@ bool IsPluginLoadingAccessibleResourceInWebView(
const extensions::Extension* extension = const extensions::Extension* extension =
extension_registry->GetExtensionById(extension_id, extension_registry->GetExtensionById(extension_id,
extensions::ExtensionRegistry::ENABLED); extensions::ExtensionRegistry::ENABLED);
if (!extension)
return false;
const extensions::WebviewInfo* webview_info = const extensions::WebviewInfo* webview_info =
static_cast<const extensions::WebviewInfo*>(extension->GetManifestData( static_cast<const extensions::WebviewInfo*>(extension->GetManifestData(
extensions::manifest_keys::kWebviewAccessibleResources)); extensions::manifest_keys::kWebviewAccessibleResources));
...@@ -417,7 +420,8 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus( ...@@ -417,7 +420,8 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus(
// If an app has explicitly made internal resources available by listing them // If an app has explicitly made internal resources available by listing them
// in |accessible_resources| in the manifest, then allow them to be loaded by // in |accessible_resources| in the manifest, then allow them to be loaded by
// plugins inside a guest-view. // plugins inside a guest-view.
if (!is_managed && plugin_setting == CONTENT_SETTING_BLOCK && if (params.url.SchemeIs(extensions::kExtensionScheme) && !is_managed &&
plugin_setting == CONTENT_SETTING_BLOCK &&
IsPluginLoadingAccessibleResourceInWebView( IsPluginLoadingAccessibleResourceInWebView(
extension_registry_, render_process_id_, params.url)) { extension_registry_, render_process_id_, params.url)) {
plugin_setting = CONTENT_SETTING_ALLOW; plugin_setting = CONTENT_SETTING_ALLOW;
......
<html>
<body>
<embed src="nonexistant.pdf"></embed>
</body>
</html>
...@@ -32,6 +32,8 @@ embedder.setUp_ = function(config) { ...@@ -32,6 +32,8 @@ embedder.setUp_ = function(config) {
embedder.testImageBaseURL = embedder.baseGuestURL + embedder.testImageBaseURL = embedder.baseGuestURL +
'/extensions/platform_apps/web_view/shim/'; '/extensions/platform_apps/web_view/shim/';
embedder.virtualURL = 'http://virtualurl/'; embedder.virtualURL = 'http://virtualurl/';
embedder.pluginURL = embedder.baseGuestURL +
'/extensions/platform_apps/web_view/shim/embed.html';
}; };
window.runTest = function(testName) { window.runTest = function(testName) {
...@@ -2205,6 +2207,16 @@ function testDisabledZoomMode() { ...@@ -2205,6 +2207,16 @@ function testDisabledZoomMode() {
document.body.appendChild(webview); document.body.appendChild(webview);
} }
function testPlugin() {
var webview = document.createElement('webview');
webview.setAttribute('src', embedder.pluginURL);
webview.addEventListener('loadstop', function(e) {
// Not crashing means success.
embedder.test.succeed();
});
document.body.appendChild(webview);
}
embedder.test.testList = { embedder.test.testList = {
'testAllowTransparencyAttribute': testAllowTransparencyAttribute, 'testAllowTransparencyAttribute': testAllowTransparencyAttribute,
'testAutosizeHeight': testAutosizeHeight, 'testAutosizeHeight': testAutosizeHeight,
...@@ -2287,6 +2299,7 @@ embedder.test.testList = { ...@@ -2287,6 +2299,7 @@ embedder.test.testList = {
'testPerOriginZoomMode': testPerOriginZoomMode, 'testPerOriginZoomMode': testPerOriginZoomMode,
'testPerViewZoomMode': testPerViewZoomMode, 'testPerViewZoomMode': testPerViewZoomMode,
'testDisabledZoomMode': testDisabledZoomMode, 'testDisabledZoomMode': testDisabledZoomMode,
'testPlugin': testPlugin,
}; };
onload = function() { onload = function() {
......
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