cef/patch/patches/content_2015.patch
Marshall Greenblatt 8f240861e3 Implement NetworkService request interception/handling (see issue #2622).
Implementation notes:
- Chromium change: CookieMonster::SetCookieableSchemes needs to be called
  immediately after the CookieMonster is created in NetworkContext::
  ApplyContextParamsToBuilder. Add a Profile::GetCookieableSchemes method and
  NetworkContextParams.cookieable_schemes member (set from
  ProfileNetworkContextService::CreateNetworkContextParams) to support that.
- Chromium change: Add a ContentBrowserClient::HandleExternalProtocol variant
  that exposes additional NetworkService request information.
- GetResourceResponseFilter is not yet implemented.

API changes:
- Resource-related callbacks have been moved from CefRequestHandler to a new
  CefResourceRequestHandler interface which is returned via the
  GetResourceRequestHandler method. If the CefRequestHandler declines to handle
  a resource it can optionally be handled by the CefRequestContextHandler, if
  any, associated with the loading context.
- The OnProtocolExecution callback has been moved from CefRequestHandler to
  CefResourceRequestHandler and will be called if a custom scheme request is
  unhandled.
- Cookie send/save permission callbacks have been moved from CefRequestHandler
  and CefResourceHandler to CefResourceRequestHandler.
- New methods added to CefResourceHandler that better match NetworkService
  execution sequence expectations. The old methods are now deprecated.
- New methods added to CefRequest and CefResponse.

Known behavior changes with the NetworkService implementation:
- Modifying the |new_url| parameter in OnResourceRedirect will no longer result
  in the method being called an additional time (likely a bug in the old
  implementation).
- Modifying the request URL in OnResourceResponse would previously cause a
  redirect. This behavior is now deprecated because the NetworkService does not
  support this functionality when using default network loaders. Temporary
  support has been added in combination with CefResourceHandler usage only.
- Other changes to the request object in OnResourceResponse will now cause the
  request to be restarted. This means that OnBeforeResourceLoad, etc, will be
  called an additional time with the new request information.
- CefResponse::GetMimeType will now be empty for non-200 responses.
- Requests using custom schemes can now be handled via CefResourceRequestHandler
  with the same callback behavior as builtin schemes.
- Redirects of custom scheme requests will now be followed as expected.
- Default handling of builtin schemes can now be disabled by setting
  |disable_default_handling| to true in GetResourceRequestHandler.
- Unhandled requests (custom scheme or builtin scheme with default handling
  disabled) will fail with an CefResponse::GetError value of
  ERR_UNKNOWN_URL_SCHEME.
- The CefSchemeHandlerFactory::Create callback will now include cookie headers.

To test:
- Run `cefclient --enable-network-service`. All resources should load
  successfully (this tests the transparent proxy capability).
- All tests pass with NetworkService disabled.
- The following tests pass with NetworkService enabled:
  - CookieTest.*
  - FrameTest.* (excluding .*Nav)
  - NavigationTest.* (excluding .Redirect*)
  - RequestHandlerTest.*
  - RequestContextTest.Basic*
  - RequestContextTest.Popup*
  - RequestTest.*
  - ResourceManagerTest.*
  - ResourceRequestHandlerTest.* (excluding .Filter*)
  - SchemeHandlerTest.*
  - StreamResourceHandlerTest.*
2019-04-23 22:53:28 -04:00

508 lines
26 KiB
Diff

diff --git chrome/browser/download/download_target_determiner.cc chrome/browser/download/download_target_determiner.cc
index 010f9511741c..a777f2d7a106 100644
--- chrome/browser/download/download_target_determiner.cc
+++ chrome/browser/download/download_target_determiner.cc
@@ -602,8 +602,8 @@ void IsHandledBySafePlugin(content::ResourceContext* resource_context,
content::PluginService* plugin_service =
content::PluginService::GetInstance();
bool plugin_found = plugin_service->GetPluginInfo(
- -1, -1, resource_context, url, url::Origin(), mime_type, false, &is_stale,
- &plugin_info, &actual_mime_type);
+ -1, -1, resource_context, url, true, url::Origin(), mime_type, false,
+ &is_stale, &plugin_info, &actual_mime_type);
if (is_stale && stale_plugin_action == RETRY_IF_STALE_PLUGIN_LIST) {
// The GetPlugins call causes the plugin list to be refreshed. Once that's
// done we can retry the GetPluginInfo call. We break out of this cycle
diff --git chrome/browser/plugins/chrome_plugin_service_filter.cc chrome/browser/plugins/chrome_plugin_service_filter.cc
index c9ca4a805d1b..0928f0e237f1 100644
--- chrome/browser/plugins/chrome_plugin_service_filter.cc
+++ chrome/browser/plugins/chrome_plugin_service_filter.cc
@@ -169,6 +169,7 @@ bool ChromePluginServiceFilter::IsPluginAvailable(
int render_frame_id,
const void* context,
const GURL& plugin_content_url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
content::WebPluginInfo* plugin) {
base::AutoLock auto_lock(lock_);
diff --git chrome/browser/plugins/chrome_plugin_service_filter.h chrome/browser/plugins/chrome_plugin_service_filter.h
index c707c8773a74..20bdf74abf01 100644
--- chrome/browser/plugins/chrome_plugin_service_filter.h
+++ chrome/browser/plugins/chrome_plugin_service_filter.h
@@ -65,6 +65,7 @@ class ChromePluginServiceFilter : public content::PluginServiceFilter,
int render_frame_id,
const void* context,
const GURL& plugin_content_url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
content::WebPluginInfo* plugin) override;
diff --git chrome/browser/plugins/pdf_iframe_navigation_throttle.cc chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
index 2eb7f21919fd..4218d3352d70 100644
--- chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
+++ chrome/browser/plugins/pdf_iframe_navigation_throttle.cc
@@ -71,8 +71,8 @@ bool IsPDFPluginEnabled(content::NavigationHandle* navigation_handle,
content::WebPluginInfo plugin_info;
return content::PluginService::GetInstance()->GetPluginInfo(
process_id, routing_id, resource_context, navigation_handle->GetURL(),
- web_contents->GetMainFrame()->GetLastCommittedOrigin(), kPDFMimeType,
- false /* allow_wildcard */, is_stale, &plugin_info,
+ false, web_contents->GetMainFrame()->GetLastCommittedOrigin(),
+ kPDFMimeType, false /* allow_wildcard */, is_stale, &plugin_info,
nullptr /* actual_mime_type */);
}
#endif
diff --git chrome/browser/ui/views/frame/browser_root_view.cc chrome/browser/ui/views/frame/browser_root_view.cc
index be77d0e074e9..949873b9bb22 100644
--- chrome/browser/ui/views/frame/browser_root_view.cc
+++ chrome/browser/ui/views/frame/browser_root_view.cc
@@ -70,7 +70,7 @@ void OnFindURLMimeType(const GURL& url,
content::PluginService::GetInstance()->GetPluginInfo(
-1, // process ID
MSG_ROUTING_NONE, // routing ID
- profile->GetResourceContext(), url, url::Origin(), mime_type,
+ profile->GetResourceContext(), url, true, url::Origin(), mime_type,
false, nullptr, &plugin, nullptr));
}
diff --git content/browser/devtools/devtools_http_handler.cc content/browser/devtools/devtools_http_handler.cc
index 94892dd57d36..1d4036fdedf8 100644
--- content/browser/devtools/devtools_http_handler.cc
+++ content/browser/devtools/devtools_http_handler.cc
@@ -572,7 +572,7 @@ void DevToolsHttpHandler::OnJsonRequest(
version.SetString("Protocol-Version",
DevToolsAgentHost::GetProtocolVersion());
version.SetString("WebKit-Version", GetWebKitVersion());
- version.SetString("Browser", GetContentClient()->browser()->GetProduct());
+ version.SetString("Browser", GetContentClient()->browser()->GetChromeProduct());
version.SetString("User-Agent",
GetContentClient()->browser()->GetUserAgent());
version.SetString("V8-Version", V8_VERSION_STRING);
diff --git content/browser/frame_host/navigation_handle_impl.cc content/browser/frame_host/navigation_handle_impl.cc
index 8191262c3815..0fc558a96b1b 100644
--- content/browser/frame_host/navigation_handle_impl.cc
+++ content/browser/frame_host/navigation_handle_impl.cc
@@ -316,12 +316,6 @@ net::Error NavigationHandleImpl::GetNetErrorCode() {
}
RenderFrameHostImpl* NavigationHandleImpl::GetRenderFrameHost() {
- // Only allow the RenderFrameHost to be retrieved once it has been set for
- // this navigation. This will happens either at WillProcessResponse time for
- // regular navigations or at WillFailRequest time for error pages.
- CHECK_GE(state_, PROCESSING_WILL_FAIL_REQUEST)
- << "This accessor should only be called after a RenderFrameHost has been "
- "picked for this navigation.";
static_assert(WILL_FAIL_REQUEST < WILL_PROCESS_RESPONSE,
"WillFailRequest state should come before WillProcessResponse");
return navigation_request_->render_frame_host();
diff --git content/browser/frame_host/render_frame_message_filter.cc content/browser/frame_host/render_frame_message_filter.cc
index 23470d05e0bd..550d1dd993af 100644
--- content/browser/frame_host/render_frame_message_filter.cc
+++ content/browser/frame_host/render_frame_message_filter.cc
@@ -707,6 +707,7 @@ void RenderFrameMessageFilter::GetCookies(int render_frame_id,
void RenderFrameMessageFilter::OnGetPluginInfo(
int render_frame_id,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool* found,
@@ -718,8 +719,8 @@ void RenderFrameMessageFilter::OnGetPluginInfo(
bool allow_wildcard = true;
*found = plugin_service_->GetPluginInfo(
render_process_id_, render_frame_id, resource_context_, url,
- main_frame_origin, mime_type, allow_wildcard, nullptr, info,
- actual_mime_type);
+ is_main_frame, main_frame_origin, mime_type, allow_wildcard, nullptr,
+ info, actual_mime_type);
}
void RenderFrameMessageFilter::OnOpenChannelToPepperPlugin(
diff --git content/browser/frame_host/render_frame_message_filter.h content/browser/frame_host/render_frame_message_filter.h
index 641c7bcbf1b8..3faf6a6452c4 100644
--- content/browser/frame_host/render_frame_message_filter.h
+++ content/browser/frame_host/render_frame_message_filter.h
@@ -146,6 +146,7 @@ class CONTENT_EXPORT RenderFrameMessageFilter
#if BUILDFLAG(ENABLE_PLUGINS)
void OnGetPluginInfo(int render_frame_id,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool* found,
diff --git content/browser/loader/mime_sniffing_resource_handler.cc content/browser/loader/mime_sniffing_resource_handler.cc
index 31aa4bc38442..0314343499d3 100644
--- content/browser/loader/mime_sniffing_resource_handler.cc
+++ content/browser/loader/mime_sniffing_resource_handler.cc
@@ -510,8 +510,8 @@ bool MimeSniffingResourceHandler::CheckForPluginHandler(
WebPluginInfo plugin;
bool has_plugin = plugin_service_->GetPluginInfo(
info->GetChildID(), info->GetRenderFrameID(), info->GetContext(),
- request()->url(), url::Origin(), response_->head.mime_type,
- allow_wildcard, &stale, &plugin, nullptr);
+ request()->url(), info->IsMainFrame(), url::Origin(),
+ response_->head.mime_type, allow_wildcard, &stale, &plugin, nullptr);
if (stale) {
// Refresh the plugins asynchronously.
diff --git content/browser/loader/navigation_url_loader_impl.cc content/browser/loader/navigation_url_loader_impl.cc
index f9d3104fa375..719b84b88615 100644
--- content/browser/loader/navigation_url_loader_impl.cc
+++ content/browser/loader/navigation_url_loader_impl.cc
@@ -927,6 +927,12 @@ class NavigationURLLoaderImpl::URLLoaderRequestController
resource_request_->has_user_gesture, resource_request_->method,
resource_request_->headers, &proxied_factory_request_,
external_protocol_factory);
+ if (!handled) {
+ handled = GetContentClient()->browser()->HandleExternalProtocol(
+ web_contents_getter_, frame_tree_node_id_,
+ navigation_ui_data_.get(), *resource_request_,
+ &proxied_factory_request_, external_protocol_factory);
+ }
if (external_protocol_factory) {
factory =
@@ -1156,7 +1162,7 @@ class NavigationURLLoaderImpl::URLLoaderRequestController
// path does as well for navigations.
bool has_plugin = PluginService::GetInstance()->GetPluginInfo(
-1 /* render_process_id */, -1 /* render_frame_id */, resource_context_,
- resource_request_->url, url::Origin(), head.mime_type,
+ resource_request_->url, true, url::Origin(), head.mime_type,
false /* allow_wildcard */, &stale, &plugin, nullptr);
if (stale) {
diff --git content/browser/plugin_service_impl.cc content/browser/plugin_service_impl.cc
index a599f989065f..115867edec92 100644
--- content/browser/plugin_service_impl.cc
+++ content/browser/plugin_service_impl.cc
@@ -302,6 +302,7 @@ bool PluginServiceImpl::GetPluginInfo(int render_process_id,
int render_frame_id,
ResourceContext* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool allow_wildcard,
@@ -318,7 +319,8 @@ bool PluginServiceImpl::GetPluginInfo(int render_process_id,
for (size_t i = 0; i < plugins.size(); ++i) {
if (!filter_ ||
filter_->IsPluginAvailable(render_process_id, render_frame_id, context,
- url, main_frame_origin, &plugins[i])) {
+ url, is_main_frame, main_frame_origin,
+ &plugins[i])) {
*info = plugins[i];
if (actual_mime_type)
*actual_mime_type = mime_types[i];
diff --git content/browser/plugin_service_impl.h content/browser/plugin_service_impl.h
index cb19abcd26b8..12d66dd7db6e 100644
--- content/browser/plugin_service_impl.h
+++ content/browser/plugin_service_impl.h
@@ -57,6 +57,7 @@ class CONTENT_EXPORT PluginServiceImpl : public PluginService {
int render_frame_id,
ResourceContext* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool allow_wildcard,
diff --git content/browser/renderer_host/plugin_registry_impl.cc content/browser/renderer_host/plugin_registry_impl.cc
index 427e1cb8946c..2f00734e9dfc 100644
--- content/browser/renderer_host/plugin_registry_impl.cc
+++ content/browser/renderer_host/plugin_registry_impl.cc
@@ -27,6 +27,7 @@ void PluginRegistryImpl::Bind(blink::mojom::PluginRegistryRequest request) {
}
void PluginRegistryImpl::GetPlugins(bool refresh,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
GetPluginsCallback callback) {
auto* plugin_service = PluginServiceImpl::GetInstance();
@@ -48,10 +49,11 @@ void PluginRegistryImpl::GetPlugins(bool refresh,
plugin_service->GetPlugins(base::BindOnce(
&PluginRegistryImpl::GetPluginsComplete, weak_factory_.GetWeakPtr(),
- main_frame_origin, std::move(callback)));
+ is_main_frame, main_frame_origin, std::move(callback)));
}
void PluginRegistryImpl::GetPluginsComplete(
+ bool is_main_frame,
const url::Origin& main_frame_origin,
GetPluginsCallback callback,
const std::vector<WebPluginInfo>& all_plugins) {
@@ -61,7 +63,7 @@ void PluginRegistryImpl::GetPluginsComplete(
GetContentClient()->browser()->GetMimeHandlerViewMimeTypes(
resource_context_);
- const int child_process_id = -1;
+ const int child_process_id = render_process_id_;
const int routing_id = MSG_ROUTING_NONE;
// In this loop, copy the WebPluginInfo (and do not use a reference) because
// the filter might mutate it.
@@ -70,7 +72,7 @@ void PluginRegistryImpl::GetPluginsComplete(
if (!filter ||
filter->IsPluginAvailable(child_process_id, routing_id,
resource_context_, main_frame_origin.GetURL(),
- main_frame_origin, &plugin)) {
+ is_main_frame, main_frame_origin, &plugin)) {
auto plugin_blink = blink::mojom::PluginInfo::New();
plugin_blink->name = plugin.name;
plugin_blink->description = plugin.desc;
diff --git content/browser/renderer_host/plugin_registry_impl.h content/browser/renderer_host/plugin_registry_impl.h
index 3009401dac6b..b4c5a9e2db50 100644
--- content/browser/renderer_host/plugin_registry_impl.h
+++ content/browser/renderer_host/plugin_registry_impl.h
@@ -24,17 +24,24 @@ class PluginRegistryImpl : public blink::mojom::PluginRegistry {
// blink::mojom::PluginRegistry
void GetPlugins(bool refresh,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
GetPluginsCallback callback) override;
+ void set_render_process_id(int render_process_id) {
+ render_process_id_ = render_process_id;
+ }
+
private:
- void GetPluginsComplete(const url::Origin& main_frame_origin,
+ void GetPluginsComplete(bool is_main_frame,
+ const url::Origin& main_frame_origin,
GetPluginsCallback callback,
const std::vector<WebPluginInfo>& all_plugins);
ResourceContext* const resource_context_;
mojo::BindingSet<PluginRegistry> bindings_;
base::TimeTicks last_plugin_refresh_time_;
+ int render_process_id_ = -1;
base::WeakPtrFactory<PluginRegistryImpl> weak_factory_;
};
diff --git content/common/frame_messages.h content/common/frame_messages.h
index 5ea18183cc12..a40b09f2e0e4 100644
--- content/common/frame_messages.h
+++ content/common/frame_messages.h
@@ -1278,9 +1278,10 @@ IPC_MESSAGE_ROUTED1(FrameHostMsg_PepperStopsPlayback,
// type. If there is no matching plugin, |found| is false.
// |actual_mime_type| is the actual mime type supported by the
// found plugin.
-IPC_SYNC_MESSAGE_CONTROL4_3(FrameHostMsg_GetPluginInfo,
+IPC_SYNC_MESSAGE_CONTROL5_3(FrameHostMsg_GetPluginInfo,
int /* render_frame_id */,
GURL /* url */,
+ bool /* is_main_frame */,
url::Origin /* main_frame_origin */,
std::string /* mime_type */,
bool /* found */,
diff --git content/public/browser/content_browser_client.h content/public/browser/content_browser_client.h
index b89c08735e10..4a319326afb9 100644
--- content/public/browser/content_browser_client.h
+++ content/public/browser/content_browser_client.h
@@ -1439,6 +1439,15 @@ class CONTENT_EXPORT ContentBrowserClient {
network::mojom::URLLoaderFactoryRequest* factory_request,
network::mojom::URLLoaderFactory*& out_factory);
+ // Same as above, but exposing the whole ResourceRequest object.
+ virtual bool HandleExternalProtocol(
+ ResourceRequestInfo::WebContentsGetter web_contents_getter,
+ int frame_tree_node_id,
+ NavigationUIData* navigation_data,
+ const network::ResourceRequest& request,
+ network::mojom::URLLoaderFactoryRequest* factory_request,
+ network::mojom::URLLoaderFactory*& out_factory) { return false; }
+
// Creates an OverlayWindow to be used for Picture-in-Picture. This window
// will house the content shown when in Picture-in-Picture mode. This will
// return a new OverlayWindow.
@@ -1506,6 +1515,10 @@ class CONTENT_EXPORT ContentBrowserClient {
// Used as part of the user agent string.
virtual std::string GetProduct() const;
+ // Returns the Chrome-specific product string. This is used for compatibility
+ // purposes with external tools like Selenium.
+ virtual std::string GetChromeProduct() const { return GetProduct(); }
+
// Returns the user agent. Content may cache this value.
virtual std::string GetUserAgent() const;
diff --git content/public/browser/plugin_service.h content/public/browser/plugin_service.h
index aed3085c7794..3b31542094d4 100644
--- content/public/browser/plugin_service.h
+++ content/public/browser/plugin_service.h
@@ -73,6 +73,7 @@ class CONTENT_EXPORT PluginService {
int render_frame_id,
ResourceContext* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool allow_wildcard,
diff --git content/public/browser/plugin_service_filter.h content/public/browser/plugin_service_filter.h
index 3b610b1f554e..7c439e060779 100644
--- content/public/browser/plugin_service_filter.h
+++ content/public/browser/plugin_service_filter.h
@@ -33,6 +33,7 @@ class PluginServiceFilter {
int render_frame_id,
const void* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
WebPluginInfo* plugin) = 0;
diff --git content/public/renderer/content_renderer_client.h content/public/renderer/content_renderer_client.h
index a7413c47e02b..54e7f221ed04 100644
--- content/public/renderer/content_renderer_client.h
+++ content/public/renderer/content_renderer_client.h
@@ -73,6 +73,9 @@ class CONTENT_EXPORT ContentRendererClient {
// Notifies us that the RenderThread has been created.
virtual void RenderThreadStarted() {}
+ // Notifies that the RenderThread can now send sync IPC messages.
+ virtual void RenderThreadConnected() {}
+
// Notifies that a new RenderFrame has been created.
virtual void RenderFrameCreated(RenderFrame* render_frame) {}
@@ -332,6 +335,10 @@ class CONTENT_EXPORT ContentRendererClient {
// This method may invalidate the frame.
virtual void RunScriptsAtDocumentIdle(RenderFrame* render_frame) {}
+ // Notifies that a DevTools agent has attached or detached.
+ virtual void DevToolsAgentAttached() {}
+ virtual void DevToolsAgentDetached() {}
+
// Allows subclasses to enable some runtime features before Blink has
// started.
virtual void SetRuntimeFeaturesDefaultsBeforeBlinkInitialization() {}
diff --git content/public/renderer/render_frame_observer.h content/public/renderer/render_frame_observer.h
index f16b90c8077b..8f6c7cddaf9a 100644
--- content/public/renderer/render_frame_observer.h
+++ content/public/renderer/render_frame_observer.h
@@ -194,6 +194,9 @@ class CONTENT_EXPORT RenderFrameObserver : public IPC::Listener,
virtual void DidReceiveTransferSizeUpdate(int resource_id,
int received_data_length) {}
+ // Called when this frame gains focus.
+ virtual void FrameFocused() {}
+
// Called when the focused node has changed to |node|.
virtual void FocusedNodeChanged(const blink::WebNode& node) {}
diff --git content/renderer/render_frame_impl.cc content/renderer/render_frame_impl.cc
index 61e0039608e8..b79b6a2dbc22 100644
--- content/renderer/render_frame_impl.cc
+++ content/renderer/render_frame_impl.cc
@@ -3926,7 +3926,8 @@ blink::WebPlugin* RenderFrameImpl::CreatePlugin(
std::string mime_type;
bool found = false;
Send(new FrameHostMsg_GetPluginInfo(
- routing_id_, params.url, frame_->Top()->GetSecurityOrigin(),
+ routing_id_, params.url, frame_->Parent() == nullptr,
+ frame_->Top()->GetSecurityOrigin(),
params.mime_type.Utf8(), &found, &info, &mime_type));
if (!found)
return nullptr;
@@ -4353,6 +4354,8 @@ void RenderFrameImpl::FrameDetached(DetachType type) {
void RenderFrameImpl::FrameFocused() {
Send(new FrameHostMsg_FrameFocused(routing_id_));
+ for (auto& observer : observers_)
+ observer.FrameFocused();
}
void RenderFrameImpl::DidChangeName(const blink::WebString& name) {
diff --git content/renderer/render_thread_impl.cc content/renderer/render_thread_impl.cc
index 47903ba66fd6..8c2fdded4d32 100644
--- content/renderer/render_thread_impl.cc
+++ content/renderer/render_thread_impl.cc
@@ -806,6 +806,8 @@ void RenderThreadImpl::Init() {
StartServiceManagerConnection();
+ GetContentClient()->renderer()->RenderThreadConnected();
+
GetAssociatedInterfaceRegistry()->AddInterface(
base::Bind(&RenderThreadImpl::OnRendererInterfaceRequest,
base::Unretained(this)));
diff --git content/renderer/renderer_blink_platform_impl.cc content/renderer/renderer_blink_platform_impl.cc
index 2c6828e7b474..f0e0611a0c59 100644
--- content/renderer/renderer_blink_platform_impl.cc
+++ content/renderer/renderer_blink_platform_impl.cc
@@ -1113,6 +1113,14 @@ void RendererBlinkPlatformImpl::RecordMetricsForBackgroundedRendererPurge() {
//------------------------------------------------------------------------------
+void RendererBlinkPlatformImpl::DevToolsAgentAttached() {
+ GetContentClient()->renderer()->DevToolsAgentAttached();
+}
+
+void RendererBlinkPlatformImpl::DevToolsAgentDetached() {
+ GetContentClient()->renderer()->DevToolsAgentDetached();
+}
+
void RendererBlinkPlatformImpl::InitializeWebDatabaseHostIfNeeded() {
if (!web_database_host_) {
web_database_host_ = blink::mojom::ThreadSafeWebDatabaseHostPtr::Create(
diff --git content/renderer/renderer_blink_platform_impl.h content/renderer/renderer_blink_platform_impl.h
index d8620e051044..517d795f815e 100644
--- content/renderer/renderer_blink_platform_impl.h
+++ content/renderer/renderer_blink_platform_impl.h
@@ -241,6 +241,9 @@ class CONTENT_EXPORT RendererBlinkPlatformImpl : public BlinkPlatformImpl {
std::unique_ptr<blink::WebDataConsumerHandle> CreateDataConsumerHandle(
mojo::ScopedDataPipeConsumerHandle handle) override;
+ void DevToolsAgentAttached() override;
+ void DevToolsAgentDetached() override;
+
// Returns non-null.
// It is invalid to call this in an incomplete env where
// RenderThreadImpl::current() returns nullptr (e.g. in some tests).
diff --git content/shell/browser/shell_plugin_service_filter.cc content/shell/browser/shell_plugin_service_filter.cc
index 3a48c59b7e3e..d10ef64adbba 100644
--- content/shell/browser/shell_plugin_service_filter.cc
+++ content/shell/browser/shell_plugin_service_filter.cc
@@ -18,6 +18,7 @@ bool ShellPluginServiceFilter::IsPluginAvailable(
int render_frame_id,
const void* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
WebPluginInfo* plugin) {
return plugin->name == base::ASCIIToUTF16("Blink Test Plugin") ||
diff --git content/shell/browser/shell_plugin_service_filter.h content/shell/browser/shell_plugin_service_filter.h
index 7767a620a9fd..8a95377f5f3b 100644
--- content/shell/browser/shell_plugin_service_filter.h
+++ content/shell/browser/shell_plugin_service_filter.h
@@ -21,6 +21,7 @@ class ShellPluginServiceFilter : public PluginServiceFilter {
int render_frame_id,
const void* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
WebPluginInfo* plugin) override;
diff --git content/test/fake_plugin_service.cc content/test/fake_plugin_service.cc
index 6500af1d859f..0d078a4a4281 100644
--- content/test/fake_plugin_service.cc
+++ content/test/fake_plugin_service.cc
@@ -29,6 +29,7 @@ bool FakePluginService::GetPluginInfo(int render_process_id,
int render_frame_id,
ResourceContext* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool allow_wildcard,
diff --git content/test/fake_plugin_service.h content/test/fake_plugin_service.h
index 205dfc39dfa7..ec250828b0ba 100644
--- content/test/fake_plugin_service.h
+++ content/test/fake_plugin_service.h
@@ -30,6 +30,7 @@ class FakePluginService : public PluginService {
int render_frame_id,
ResourceContext* context,
const GURL& url,
+ bool is_main_frame,
const url::Origin& main_frame_origin,
const std::string& mime_type,
bool allow_wildcard,