mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Fix navigation from inside PDF files (issue #1737)
This commit is contained in:
2
cef.gyp
2
cef.gyp
@@ -1328,6 +1328,8 @@
|
|||||||
# Include sources for extensions support.
|
# Include sources for extensions support.
|
||||||
'<(DEPTH)/chrome/common/extensions/chrome_manifest_url_handlers.cc',
|
'<(DEPTH)/chrome/common/extensions/chrome_manifest_url_handlers.cc',
|
||||||
'<(DEPTH)/chrome/common/extensions/chrome_manifest_url_handlers.h',
|
'<(DEPTH)/chrome/common/extensions/chrome_manifest_url_handlers.h',
|
||||||
|
'<(DEPTH)/chrome/common/extensions/extension_process_policy.cc',
|
||||||
|
'<(DEPTH)/chrome/common/extensions/extension_process_policy.h',
|
||||||
'<(DEPTH)/chrome/common/pepper_permission_util.cc',
|
'<(DEPTH)/chrome/common/pepper_permission_util.cc',
|
||||||
'<(DEPTH)/chrome/common/pepper_permission_util.h',
|
'<(DEPTH)/chrome/common/pepper_permission_util.h',
|
||||||
'<(DEPTH)/chrome/common/url_constants.cc',
|
'<(DEPTH)/chrome/common/url_constants.cc',
|
||||||
|
@@ -65,6 +65,7 @@
|
|||||||
#include "extensions/browser/guest_view/extensions_guest_view_message_filter.h"
|
#include "extensions/browser/guest_view/extensions_guest_view_message_filter.h"
|
||||||
#include "extensions/browser/io_thread_extension_message_filter.h"
|
#include "extensions/browser/io_thread_extension_message_filter.h"
|
||||||
#include "extensions/common/constants.h"
|
#include "extensions/common/constants.h"
|
||||||
|
#include "extensions/common/switches.h"
|
||||||
#include "net/ssl/ssl_cert_request_info.h"
|
#include "net/ssl/ssl_cert_request_info.h"
|
||||||
#include "ppapi/host/ppapi_host.h"
|
#include "ppapi/host/ppapi_host.h"
|
||||||
#include "third_party/WebKit/public/web/WebWindowFeatures.h"
|
#include "third_party/WebKit/public/web/WebWindowFeatures.h"
|
||||||
@@ -325,6 +326,14 @@ int GetCrashSignalFD(const base::CommandLine& command_line) {
|
|||||||
if (!breakpad::IsCrashReporterEnabled())
|
if (!breakpad::IsCrashReporterEnabled())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
// Extensions have the same process type as renderers.
|
||||||
|
if (command_line.HasSwitch(extensions::switches::kExtensionProcess)) {
|
||||||
|
static breakpad::CrashHandlerHostLinux* crash_handler = NULL;
|
||||||
|
if (!crash_handler)
|
||||||
|
crash_handler = CreateCrashHandlerHost("extension");
|
||||||
|
return crash_handler->GetDeathSignalSocket();
|
||||||
|
}
|
||||||
|
|
||||||
std::string process_type =
|
std::string process_type =
|
||||||
command_line.GetSwitchValueASCII(switches::kProcessType);
|
command_line.GetSwitchValueASCII(switches::kProcessType);
|
||||||
|
|
||||||
@@ -756,6 +765,20 @@ void CefContentBrowserClient::AppendExtraCommandLineSwitches(
|
|||||||
};
|
};
|
||||||
command_line->CopySwitchesFrom(*browser_cmd, kSwitchNames,
|
command_line->CopySwitchesFrom(*browser_cmd, kSwitchNames,
|
||||||
arraysize(kSwitchNames));
|
arraysize(kSwitchNames));
|
||||||
|
|
||||||
|
if (extensions::ExtensionsEnabled()) {
|
||||||
|
// Based on ChromeContentBrowserClientExtensionsPart::
|
||||||
|
// AppendExtraRendererCommandLineSwitches
|
||||||
|
content::RenderProcessHost* process =
|
||||||
|
content::RenderProcessHost::FromID(child_process_id);
|
||||||
|
content::BrowserContext* browser_context =
|
||||||
|
process ? process->GetBrowserContext() : NULL;
|
||||||
|
if (browser_context &&
|
||||||
|
extensions::ProcessMap::Get(browser_context)->Contains(
|
||||||
|
process->GetID())) {
|
||||||
|
command_line->AppendSwitch(extensions::switches::kExtensionProcess);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OS_LINUX)
|
#if defined(OS_LINUX)
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
#include "base/strings/string_number_conversions.h"
|
#include "base/strings/string_number_conversions.h"
|
||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "chrome/common/chrome_switches.h"
|
#include "chrome/common/chrome_switches.h"
|
||||||
|
#include "chrome/common/extensions/extension_process_policy.h"
|
||||||
#include "chrome/common/pepper_permission_util.h"
|
#include "chrome/common/pepper_permission_util.h"
|
||||||
#include "chrome/common/url_constants.h"
|
#include "chrome/common/url_constants.h"
|
||||||
#include "chrome/grit/generated_resources.h"
|
#include "chrome/grit/generated_resources.h"
|
||||||
@@ -60,6 +61,7 @@
|
|||||||
#include "content/public/renderer/render_view_visitor.h"
|
#include "content/public/renderer/render_view_visitor.h"
|
||||||
#include "content/renderer/render_frame_impl.h"
|
#include "content/renderer/render_frame_impl.h"
|
||||||
#include "extensions/common/constants.h"
|
#include "extensions/common/constants.h"
|
||||||
|
#include "extensions/common/switches.h"
|
||||||
#include "extensions/renderer/dispatcher.h"
|
#include "extensions/renderer/dispatcher.h"
|
||||||
#include "extensions/renderer/dispatcher_delegate.h"
|
#include "extensions/renderer/dispatcher_delegate.h"
|
||||||
#include "extensions/renderer/extension_frame_helper.h"
|
#include "extensions/renderer/extension_frame_helper.h"
|
||||||
@@ -163,6 +165,67 @@ std::string GetPluginInstancePosterAttribute(
|
|||||||
return std::string();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsStandaloneExtensionProcess() {
|
||||||
|
return base::CommandLine::ForCurrentProcess()->HasSwitch(
|
||||||
|
extensions::switches::kExtensionProcess);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CrossesExtensionExtents(
|
||||||
|
blink::WebLocalFrame* frame,
|
||||||
|
const GURL& new_url,
|
||||||
|
bool is_extension_url,
|
||||||
|
bool is_initial_navigation) {
|
||||||
|
DCHECK(!frame->parent());
|
||||||
|
GURL old_url(frame->document().url());
|
||||||
|
|
||||||
|
extensions::RendererExtensionRegistry* extension_registry =
|
||||||
|
extensions::RendererExtensionRegistry::Get();
|
||||||
|
|
||||||
|
// If old_url is still empty and this is an initial navigation, then this is
|
||||||
|
// a window.open operation. We should look at the opener URL. Note that the
|
||||||
|
// opener is a local frame in this case.
|
||||||
|
if (is_initial_navigation && old_url.is_empty() && frame->opener()) {
|
||||||
|
blink::WebLocalFrame* opener_frame = frame->opener()->toWebLocalFrame();
|
||||||
|
|
||||||
|
// If we're about to open a normal web page from a same-origin opener stuck
|
||||||
|
// in an extension process, we want to keep it in process to allow the
|
||||||
|
// opener to script it.
|
||||||
|
blink::WebDocument opener_document = opener_frame->document();
|
||||||
|
blink::WebSecurityOrigin opener_origin = opener_document.securityOrigin();
|
||||||
|
bool opener_is_extension_url = !opener_origin.isUnique() &&
|
||||||
|
extension_registry->GetExtensionOrAppByURL(
|
||||||
|
opener_document.url()) != NULL;
|
||||||
|
if (!is_extension_url &&
|
||||||
|
!opener_is_extension_url &&
|
||||||
|
IsStandaloneExtensionProcess() &&
|
||||||
|
opener_origin.canRequest(blink::WebURL(new_url)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// In all other cases, we want to compare against the URL that determines
|
||||||
|
// the type of process. In default Chrome, that's the URL of the opener's
|
||||||
|
// top frame and not the opener frame itself. In --site-per-process, we
|
||||||
|
// can use the opener frame itself.
|
||||||
|
// TODO(nick): Either wire this up to SiteIsolationPolicy, or to state on
|
||||||
|
// |opener_frame|/its ancestors.
|
||||||
|
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
||||||
|
switches::kSitePerProcess) ||
|
||||||
|
base::CommandLine::ForCurrentProcess()->HasSwitch(
|
||||||
|
switches::kIsolateExtensions))
|
||||||
|
old_url = opener_frame->document().url();
|
||||||
|
else
|
||||||
|
old_url = opener_frame->top()->document().url();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only consider keeping non-app URLs in an app process if this window
|
||||||
|
// has an opener (in which case it might be an OAuth popup that tries to
|
||||||
|
// script an iframe within the app).
|
||||||
|
bool should_consider_workaround = !!frame->opener();
|
||||||
|
|
||||||
|
return extensions::CrossesExtensionProcessBoundary(
|
||||||
|
*extension_registry->GetMainThreadExtensionSet(), old_url, new_url,
|
||||||
|
should_consider_workaround);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
CefContentRendererClient::CefContentRendererClient()
|
CefContentRendererClient::CefContentRendererClient()
|
||||||
@@ -565,6 +628,63 @@ bool CefContentRendererClient::HandleNavigation(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CefContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
|
||||||
|
const GURL& url,
|
||||||
|
const std::string& http_method,
|
||||||
|
bool is_initial_navigation,
|
||||||
|
bool is_server_redirect,
|
||||||
|
bool* send_referrer) {
|
||||||
|
DCHECK(!frame->parent());
|
||||||
|
|
||||||
|
// For now, we skip the rest for POST submissions. This is because
|
||||||
|
// http://crbug.com/101395 is more likely to cause compatibility issues
|
||||||
|
// with hosted apps and extensions than WebUI pages. We will remove this
|
||||||
|
// check when cross-process POST submissions are supported.
|
||||||
|
if (http_method != "GET")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (extensions::ExtensionsEnabled()) {
|
||||||
|
const extensions::RendererExtensionRegistry* extension_registry =
|
||||||
|
extensions::RendererExtensionRegistry::Get();
|
||||||
|
|
||||||
|
// Determine if the new URL is an extension (excluding bookmark apps).
|
||||||
|
const extensions::Extension* new_url_extension =
|
||||||
|
extensions::GetNonBookmarkAppExtension(
|
||||||
|
*extension_registry->GetMainThreadExtensionSet(), url);
|
||||||
|
bool is_extension_url = !!new_url_extension;
|
||||||
|
|
||||||
|
// If the navigation would cross an app extent boundary, we also need
|
||||||
|
// to defer to the browser to ensure process isolation. This is not
|
||||||
|
// necessary for server redirects, which will be transferred to a new
|
||||||
|
// process by the browser process when they are ready to commit. It is
|
||||||
|
// necessary for client redirects, which won't be transferred in the same
|
||||||
|
// way.
|
||||||
|
if (!is_server_redirect &&
|
||||||
|
CrossesExtensionExtents(frame, url, is_extension_url,
|
||||||
|
is_initial_navigation)) {
|
||||||
|
// Include the referrer in this case since we're going from a hosted web
|
||||||
|
// page. (the packaged case is handled previously by the extension
|
||||||
|
// navigation test)
|
||||||
|
*send_referrer = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is a reload, check whether it has the wrong process type. We
|
||||||
|
// should send it to the browser if it's an extension URL (e.g., hosted app)
|
||||||
|
// in a normal process, or if it's a process for an extension that has been
|
||||||
|
// uninstalled. Without --site-per-process mode, we never fork processes
|
||||||
|
// for subframes, so this check only makes sense for top-level frames.
|
||||||
|
// TODO(alexmos,nasko): Figure out how this check should work when reloading
|
||||||
|
// subframes in --site-per-process mode.
|
||||||
|
if (!frame->parent() && frame->document().url() == url) {
|
||||||
|
if (is_extension_url != IsStandaloneExtensionProcess())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool CefContentRendererClient::WillSendRequest(
|
bool CefContentRendererClient::WillSendRequest(
|
||||||
blink::WebFrame* frame,
|
blink::WebFrame* frame,
|
||||||
ui::PageTransition transition_type,
|
ui::PageTransition transition_type,
|
||||||
|
@@ -97,6 +97,12 @@ class CefContentRendererClient : public content::ContentRendererClient,
|
|||||||
blink::WebNavigationType type,
|
blink::WebNavigationType type,
|
||||||
blink::WebNavigationPolicy default_policy,
|
blink::WebNavigationPolicy default_policy,
|
||||||
bool is_redirect) override;
|
bool is_redirect) override;
|
||||||
|
bool ShouldFork(blink::WebLocalFrame* frame,
|
||||||
|
const GURL& url,
|
||||||
|
const std::string& http_method,
|
||||||
|
bool is_initial_navigation,
|
||||||
|
bool is_server_redirect,
|
||||||
|
bool* send_referrer) override;
|
||||||
bool WillSendRequest(blink::WebFrame* frame,
|
bool WillSendRequest(blink::WebFrame* frame,
|
||||||
ui::PageTransition transition_type,
|
ui::PageTransition transition_type,
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
|
@@ -212,4 +212,10 @@ patches = [
|
|||||||
'name': 'render_widget_host_1070383005',
|
'name': 'render_widget_host_1070383005',
|
||||||
'path': '../content/browser/renderer_host/',
|
'path': '../content/browser/renderer_host/',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
# Fix incorrect forward declaration in extension_process_policy.h.
|
||||||
|
# https://code.google.com/p/chromium/issues/detail?id=543230
|
||||||
|
'name': 'extension_process_policy_543230',
|
||||||
|
'path': '../chrome/common/extensions/',
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
18
patch/patches/extension_process_policy_543230.patch
Normal file
18
patch/patches/extension_process_policy_543230.patch
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
diff --git extension_process_policy.h extension_process_policy.h
|
||||||
|
index 7231c0f..2323483 100644
|
||||||
|
--- extension_process_policy.h
|
||||||
|
+++ extension_process_policy.h
|
||||||
|
@@ -5,12 +5,12 @@
|
||||||
|
#ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_PROCESS_POLICY_H_
|
||||||
|
#define CHROME_COMMON_EXTENSIONS_EXTENSION_PROCESS_POLICY_H_
|
||||||
|
|
||||||
|
-class ExtensionSet;
|
||||||
|
class GURL;
|
||||||
|
|
||||||
|
namespace extensions {
|
||||||
|
|
||||||
|
class Extension;
|
||||||
|
+class ExtensionSet;
|
||||||
|
|
||||||
|
// Returns the extension for the given URL. Excludes extension objects for
|
||||||
|
// bookmark apps, which do not use the app process model.
|
Binary file not shown.
Reference in New Issue
Block a user