2013-01-03 18:24:24 +01:00
|
|
|
// Copyright (c) 2013 The Chromium Embedded Framework Authors.
|
|
|
|
// Portions copyright (c) 2012 The Chromium Authors. All rights reserved.
|
2012-04-03 03:34:16 +02:00
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
|
|
#include "libcef/renderer/content_renderer_client.h"
|
|
|
|
|
2013-02-02 01:21:59 +01:00
|
|
|
#include "libcef/browser/context.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "libcef/common/cef_messages.h"
|
2012-12-31 11:41:15 +01:00
|
|
|
#include "libcef/common/cef_switches.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "libcef/common/content_client.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "libcef/common/extensions/extensions_client.h"
|
|
|
|
#include "libcef/common/extensions/extensions_util.h"
|
2013-11-21 21:59:28 +01:00
|
|
|
#include "libcef/common/request_impl.h"
|
2012-11-20 21:08:36 +01:00
|
|
|
#include "libcef/common/values_impl.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "libcef/renderer/browser_impl.h"
|
2015-08-14 16:41:08 +02:00
|
|
|
#include "libcef/renderer/extensions/extensions_dispatcher_delegate.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "libcef/renderer/extensions/extensions_renderer_client.h"
|
|
|
|
#include "libcef/renderer/extensions/print_web_view_helper_delegate.h"
|
2015-08-31 13:28:07 +02:00
|
|
|
#include "libcef/renderer/media/cef_key_systems.h"
|
2015-03-25 22:22:47 +01:00
|
|
|
#include "libcef/renderer/pepper/pepper_helper.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "libcef/renderer/plugins/cef_plugin_placeholder.h"
|
|
|
|
#include "libcef/renderer/plugins/plugin_preroller.h"
|
2014-04-04 18:50:38 +02:00
|
|
|
#include "libcef/renderer/render_frame_observer.h"
|
2012-11-02 19:16:28 +01:00
|
|
|
#include "libcef/renderer/render_message_filter.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "libcef/renderer/render_process_observer.h"
|
|
|
|
#include "libcef/renderer/thread_util.h"
|
|
|
|
#include "libcef/renderer/v8_impl.h"
|
2013-10-16 02:25:38 +02:00
|
|
|
#include "libcef/renderer/webkit_glue.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
|
2012-12-31 11:41:15 +01:00
|
|
|
#include "base/command_line.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "base/metrics/user_metrics_action.h"
|
2012-12-31 11:41:15 +01:00
|
|
|
#include "base/path_service.h"
|
2013-06-22 04:06:32 +02:00
|
|
|
#include "base/strings/string_number_conversions.h"
|
2014-04-04 18:50:38 +02:00
|
|
|
#include "base/strings/utf_string_conversions.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "chrome/common/chrome_switches.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "chrome/common/pepper_permission_util.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "chrome/grit/generated_resources.h"
|
|
|
|
#include "chrome/renderer/content_settings_observer.h"
|
2013-04-04 20:10:17 +02:00
|
|
|
#include "chrome/renderer/loadtimes_extension_bindings.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "chrome/renderer/pepper/chrome_pdf_print_client.h"
|
2014-10-07 22:44:33 +02:00
|
|
|
#include "chrome/renderer/spellchecker/spellcheck.h"
|
|
|
|
#include "chrome/renderer/spellchecker/spellcheck_provider.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "components/content_settings/core/common/content_settings_types.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "components/nacl/common/nacl_constants.h"
|
2015-02-04 19:10:14 +01:00
|
|
|
#include "components/printing/renderer/print_web_view_helper.h"
|
2014-09-27 01:48:19 +02:00
|
|
|
#include "components/web_cache/renderer/web_cache_render_process_observer.h"
|
2014-04-04 18:50:38 +02:00
|
|
|
#include "content/child/worker_task_runner.h"
|
2013-12-17 23:04:35 +01:00
|
|
|
#include "content/common/frame_messages.h"
|
2013-02-02 01:21:59 +01:00
|
|
|
#include "content/public/browser/browser_thread.h"
|
|
|
|
#include "content/public/browser/render_process_host.h"
|
2015-03-04 02:00:13 +01:00
|
|
|
#include "content/public/child/child_thread.h"
|
2013-06-24 18:40:40 +02:00
|
|
|
#include "content/public/common/content_constants.h"
|
2014-01-14 18:37:02 +01:00
|
|
|
#include "content/public/common/content_paths.h"
|
2015-02-04 19:10:14 +01:00
|
|
|
#include "content/public/renderer/plugin_instance_throttler.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "content/public/renderer/render_thread.h"
|
|
|
|
#include "content/public/renderer/render_view.h"
|
2014-10-07 22:44:33 +02:00
|
|
|
#include "content/public/renderer/render_view_visitor.h"
|
2013-12-17 23:04:35 +01:00
|
|
|
#include "content/renderer/render_frame_impl.h"
|
2015-07-16 23:40:01 +02:00
|
|
|
#include "extensions/renderer/dispatcher.h"
|
|
|
|
#include "extensions/renderer/dispatcher_delegate.h"
|
|
|
|
#include "extensions/renderer/extension_frame_helper.h"
|
|
|
|
#include "extensions/renderer/extension_helper.h"
|
|
|
|
#include "extensions/renderer/guest_view/extensions_guest_view_container.h"
|
|
|
|
#include "extensions/renderer/guest_view/extensions_guest_view_container_dispatcher.h"
|
|
|
|
#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container.h"
|
2012-04-03 03:34:16 +02:00
|
|
|
#include "ipc/ipc_sync_channel.h"
|
2012-12-31 11:41:15 +01:00
|
|
|
#include "media/base/media.h"
|
2013-06-22 04:06:32 +02:00
|
|
|
#include "third_party/WebKit/public/platform/WebPrerenderingSupport.h"
|
|
|
|
#include "third_party/WebKit/public/platform/WebString.h"
|
|
|
|
#include "third_party/WebKit/public/platform/WebURL.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "third_party/WebKit/public/web/WebConsoleMessage.h"
|
2013-06-24 18:40:40 +02:00
|
|
|
#include "third_party/WebKit/public/web/WebDocument.h"
|
2015-01-09 18:22:10 +01:00
|
|
|
#include "third_party/WebKit/public/web/WebElement.h"
|
2013-06-22 04:06:32 +02:00
|
|
|
#include "third_party/WebKit/public/web/WebFrame.h"
|
2014-07-01 00:30:29 +02:00
|
|
|
#include "third_party/WebKit/public/web/WebLocalFrame.h"
|
2013-06-24 18:40:40 +02:00
|
|
|
#include "third_party/WebKit/public/web/WebPluginParams.h"
|
2013-06-22 04:06:32 +02:00
|
|
|
#include "third_party/WebKit/public/web/WebPrerendererClient.h"
|
|
|
|
#include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
|
|
|
|
#include "third_party/WebKit/public/web/WebSecurityPolicy.h"
|
|
|
|
#include "third_party/WebKit/public/web/WebView.h"
|
2015-09-09 16:05:39 +02:00
|
|
|
#include "ui/base/l10n/l10n_util.h"
|
2012-04-24 20:01:48 +02:00
|
|
|
|
2015-04-08 15:16:17 +02:00
|
|
|
#if defined(OS_MACOSX)
|
|
|
|
#include "base/mac/mac_util.h"
|
|
|
|
#include "base/strings/sys_string_conversions.h"
|
|
|
|
#endif
|
|
|
|
|
2012-05-29 19:18:33 +02:00
|
|
|
namespace {
|
|
|
|
|
2013-11-08 22:28:56 +01:00
|
|
|
// Stub implementation of blink::WebPrerenderingSupport.
|
|
|
|
class CefPrerenderingSupport : public blink::WebPrerenderingSupport {
|
2012-05-29 19:18:33 +02:00
|
|
|
private:
|
2014-11-12 20:25:15 +01:00
|
|
|
void add(const blink::WebPrerender& prerender) override {}
|
|
|
|
void cancel(const blink::WebPrerender& prerender) override {}
|
|
|
|
void abandon(const blink::WebPrerender& prerender) override {}
|
2012-05-29 19:18:33 +02:00
|
|
|
};
|
|
|
|
|
2013-11-08 22:28:56 +01:00
|
|
|
// Stub implementation of blink::WebPrerendererClient.
|
2012-05-29 19:18:33 +02:00
|
|
|
class CefPrerendererClient : public content::RenderViewObserver,
|
2013-11-08 22:28:56 +01:00
|
|
|
public blink::WebPrerendererClient {
|
2012-05-29 19:18:33 +02:00
|
|
|
public:
|
|
|
|
explicit CefPrerendererClient(content::RenderView* render_view)
|
|
|
|
: content::RenderViewObserver(render_view) {
|
|
|
|
DCHECK(render_view);
|
|
|
|
render_view->GetWebView()->setPrerendererClient(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2014-11-12 20:25:15 +01:00
|
|
|
~CefPrerendererClient() override {}
|
2012-05-29 19:18:33 +02:00
|
|
|
|
2014-11-12 20:25:15 +01:00
|
|
|
void willAddPrerender(blink::WebPrerender* prerender) override {}
|
2012-05-29 19:18:33 +02:00
|
|
|
};
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
void IsGuestViewApiAvailableToScriptContext(
|
|
|
|
bool* api_is_available,
|
|
|
|
extensions::ScriptContext* context) {
|
|
|
|
if (context->GetAvailability("guestViewInternal").is_available()) {
|
|
|
|
*api_is_available = true;
|
2015-01-09 18:22:10 +01:00
|
|
|
}
|
2015-07-16 23:40:01 +02:00
|
|
|
}
|
2015-01-09 18:22:10 +01:00
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
void AppendParams(const std::vector<base::string16>& additional_names,
|
|
|
|
const std::vector<base::string16>& additional_values,
|
|
|
|
blink::WebVector<blink::WebString>* existing_names,
|
|
|
|
blink::WebVector<blink::WebString>* existing_values) {
|
|
|
|
DCHECK(additional_names.size() == additional_values.size());
|
|
|
|
DCHECK(existing_names->size() == existing_values->size());
|
2015-01-09 18:22:10 +01:00
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
size_t existing_size = existing_names->size();
|
|
|
|
size_t total_size = existing_size + additional_names.size();
|
|
|
|
|
|
|
|
blink::WebVector<blink::WebString> names(total_size);
|
|
|
|
blink::WebVector<blink::WebString> values(total_size);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < existing_size; ++i) {
|
|
|
|
names[i] = (*existing_names)[i];
|
|
|
|
values[i] = (*existing_values)[i];
|
2015-02-04 19:10:14 +01:00
|
|
|
}
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
for (size_t i = 0; i < additional_names.size(); ++i) {
|
|
|
|
names[existing_size + i] = additional_names[i];
|
|
|
|
values[existing_size + i] = additional_values[i];
|
2015-02-04 19:10:14 +01:00
|
|
|
}
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
existing_names->swap(names);
|
|
|
|
existing_values->swap(values);
|
|
|
|
}
|
2015-01-09 18:22:10 +01:00
|
|
|
|
2015-09-09 16:05:39 +02:00
|
|
|
std::string GetPluginInstancePosterAttribute(
|
|
|
|
const blink::WebPluginParams& params) {
|
|
|
|
DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size());
|
|
|
|
|
|
|
|
for (size_t i = 0; i < params.attributeNames.size(); ++i) {
|
|
|
|
if (params.attributeNames[i].utf8() == "poster" &&
|
|
|
|
!params.attributeValues[i].isEmpty()) {
|
|
|
|
return params.attributeValues[i].utf8();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return std::string();
|
|
|
|
}
|
|
|
|
|
2012-05-29 19:18:33 +02:00
|
|
|
} // namespace
|
|
|
|
|
2012-11-02 19:16:28 +01:00
|
|
|
CefContentRendererClient::CefContentRendererClient()
|
2013-06-05 01:37:26 +02:00
|
|
|
: devtools_agent_count_(0),
|
2013-02-02 01:21:59 +01:00
|
|
|
uncaught_exception_stack_size_(0),
|
|
|
|
single_process_cleanup_complete_(false) {
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
CefContentRendererClient::~CefContentRendererClient() {
|
|
|
|
}
|
|
|
|
|
|
|
|
// static
|
|
|
|
CefContentRendererClient* CefContentRendererClient::Get() {
|
|
|
|
return static_cast<CefContentRendererClient*>(
|
2013-04-16 00:16:01 +02:00
|
|
|
CefContentClient::Get()->renderer());
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
CefRefPtr<CefBrowserImpl> CefContentRendererClient::GetBrowserForView(
|
|
|
|
content::RenderView* view) {
|
|
|
|
CEF_REQUIRE_RT_RETURN(NULL);
|
|
|
|
|
|
|
|
BrowserMap::const_iterator it = browsers_.find(view);
|
|
|
|
if (it != browsers_.end())
|
|
|
|
return it->second;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
CefRefPtr<CefBrowserImpl> CefContentRendererClient::GetBrowserForMainFrame(
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebFrame* frame) {
|
2012-04-03 03:34:16 +02:00
|
|
|
CEF_REQUIRE_RT_RETURN(NULL);
|
|
|
|
|
|
|
|
BrowserMap::const_iterator it = browsers_.begin();
|
|
|
|
for (; it != browsers_.end(); ++it) {
|
|
|
|
content::RenderView* render_view = it->second->render_view();
|
|
|
|
if (render_view && render_view->GetWebView() &&
|
|
|
|
render_view->GetWebView()->mainFrame() == frame) {
|
|
|
|
return it->second;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefContentRendererClient::OnBrowserDestroyed(CefBrowserImpl* browser) {
|
|
|
|
BrowserMap::iterator it = browsers_.begin();
|
|
|
|
for (; it != browsers_.end(); ++it) {
|
|
|
|
if (it->second.get() == browser) {
|
|
|
|
browsers_.erase(it);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// No browser was found in the map.
|
|
|
|
NOTREACHED();
|
|
|
|
}
|
|
|
|
|
2012-12-31 11:41:15 +01:00
|
|
|
void CefContentRendererClient::WebKitInitialized() {
|
2015-01-09 18:22:10 +01:00
|
|
|
const base::CommandLine* command_line =
|
|
|
|
base::CommandLine::ForCurrentProcess();
|
2013-03-08 01:41:26 +01:00
|
|
|
|
2014-05-29 19:15:34 +02:00
|
|
|
// Create global objects associated with the default Isolate.
|
|
|
|
CefV8IsolateCreated();
|
|
|
|
|
2012-12-31 11:41:15 +01:00
|
|
|
// TODO(cef): Enable these once the implementation supports it.
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebRuntimeFeatures::enableNotifications(false);
|
2012-12-31 11:41:15 +01:00
|
|
|
|
2013-06-05 01:37:26 +02:00
|
|
|
const CefContentClient::SchemeInfoList* schemes =
|
|
|
|
CefContentClient::Get()->GetCustomSchemes();
|
|
|
|
if (!schemes->empty()) {
|
2012-12-31 11:41:15 +01:00
|
|
|
// Register the custom schemes.
|
2013-06-05 01:37:26 +02:00
|
|
|
CefContentClient::SchemeInfoList::const_iterator it = schemes->begin();
|
|
|
|
for (; it != schemes->end(); ++it) {
|
|
|
|
const CefContentClient::SchemeInfo& info = *it;
|
2013-11-08 22:28:56 +01:00
|
|
|
const blink::WebString& scheme =
|
|
|
|
blink::WebString::fromUTF8(info.scheme_name);
|
2013-04-18 19:58:23 +02:00
|
|
|
if (info.is_standard) {
|
|
|
|
// Standard schemes must also be registered as CORS enabled to support
|
|
|
|
// CORS-restricted requests (for example, XMLHttpRequest redirects).
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebSecurityPolicy::registerURLSchemeAsCORSEnabled(scheme);
|
2012-12-31 11:41:15 +01:00
|
|
|
}
|
2013-04-18 19:58:23 +02:00
|
|
|
if (info.is_local)
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebSecurityPolicy::registerURLSchemeAsLocal(scheme);
|
2013-04-18 19:58:23 +02:00
|
|
|
if (info.is_display_isolated)
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(scheme);
|
2012-12-31 11:41:15 +01:00
|
|
|
}
|
|
|
|
}
|
2012-04-24 20:01:48 +02:00
|
|
|
|
2012-12-31 11:41:15 +01:00
|
|
|
if (!cross_origin_whitelist_entries_.empty()) {
|
|
|
|
// Add the cross-origin white list entries.
|
|
|
|
for (size_t i = 0; i < cross_origin_whitelist_entries_.size(); ++i) {
|
|
|
|
const Cef_CrossOriginWhiteListEntry_Params& entry =
|
|
|
|
cross_origin_whitelist_entries_[i];
|
|
|
|
GURL gurl = GURL(entry.source_origin);
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebSecurityPolicy::addOriginAccessWhitelistEntry(
|
2012-12-31 11:41:15 +01:00
|
|
|
gurl,
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebString::fromUTF8(entry.target_protocol),
|
|
|
|
blink::WebString::fromUTF8(entry.target_domain),
|
2012-12-31 11:41:15 +01:00
|
|
|
entry.allow_target_subdomains);
|
2012-04-24 20:01:48 +02:00
|
|
|
}
|
2012-12-31 11:41:15 +01:00
|
|
|
cross_origin_whitelist_entries_.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
// The number of stack trace frames to capture for uncaught exceptions.
|
2015-01-09 18:22:10 +01:00
|
|
|
if (command_line->HasSwitch(switches::kUncaughtExceptionStackSize)) {
|
2012-12-31 11:41:15 +01:00
|
|
|
int uncaught_exception_stack_size = 0;
|
|
|
|
base::StringToInt(
|
2015-01-09 18:22:10 +01:00
|
|
|
command_line->GetSwitchValueASCII(
|
|
|
|
switches::kUncaughtExceptionStackSize),
|
2012-12-31 11:41:15 +01:00
|
|
|
&uncaught_exception_stack_size);
|
|
|
|
|
|
|
|
if (uncaught_exception_stack_size > 0) {
|
2013-01-03 18:24:24 +01:00
|
|
|
uncaught_exception_stack_size_ = uncaught_exception_stack_size;
|
|
|
|
CefV8SetUncaughtExceptionStackSize(uncaught_exception_stack_size_);
|
2012-04-24 20:01:48 +02:00
|
|
|
}
|
|
|
|
}
|
2012-12-31 11:41:15 +01:00
|
|
|
|
|
|
|
// Notify the render process handler.
|
|
|
|
CefRefPtr<CefApp> application = CefContentClient::Get()->application();
|
|
|
|
if (application.get()) {
|
|
|
|
CefRefPtr<CefRenderProcessHandler> handler =
|
|
|
|
application->GetRenderProcessHandler();
|
|
|
|
if (handler.get())
|
|
|
|
handler->OnWebKitInitialized();
|
|
|
|
}
|
2012-04-24 20:01:48 +02:00
|
|
|
}
|
|
|
|
|
2013-01-03 18:24:24 +01:00
|
|
|
void CefContentRendererClient::OnRenderProcessShutdown() {
|
|
|
|
// Destroy global objects associated with the default Isolate.
|
|
|
|
CefV8IsolateDestroyed();
|
|
|
|
}
|
|
|
|
|
2012-11-02 19:16:28 +01:00
|
|
|
void CefContentRendererClient::DevToolsAgentAttached() {
|
|
|
|
CEF_REQUIRE_RT();
|
|
|
|
++devtools_agent_count_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CefContentRendererClient::DevToolsAgentDetached() {
|
|
|
|
CEF_REQUIRE_RT();
|
|
|
|
--devtools_agent_count_;
|
|
|
|
if (devtools_agent_count_ == 0 && uncaught_exception_stack_size_ > 0) {
|
|
|
|
// When the last DevToolsAgent is detached the stack size is set to 0.
|
|
|
|
// Restore the user-specified stack size here.
|
2013-01-03 18:24:24 +01:00
|
|
|
CefV8SetUncaughtExceptionStackSize(uncaught_exception_stack_size_);
|
2012-11-02 19:16:28 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-03 18:24:24 +01:00
|
|
|
scoped_refptr<base::SequencedTaskRunner>
|
|
|
|
CefContentRendererClient::GetCurrentTaskRunner() {
|
|
|
|
// Check if currently on the render thread.
|
|
|
|
if (CEF_CURRENTLY_ON_RT())
|
|
|
|
return render_task_runner_;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-02-02 01:21:59 +01:00
|
|
|
void CefContentRendererClient::RunSingleProcessCleanup() {
|
|
|
|
DCHECK(content::RenderProcessHost::run_renderer_in_process());
|
|
|
|
|
|
|
|
// Make sure the render thread was actually started.
|
2014-09-27 01:48:19 +02:00
|
|
|
if (!render_task_runner_.get())
|
2013-02-02 01:21:59 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
if (content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
|
|
|
|
RunSingleProcessCleanupOnUIThread();
|
|
|
|
} else {
|
|
|
|
content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
|
|
|
|
base::Bind(&CefContentRendererClient::RunSingleProcessCleanupOnUIThread,
|
|
|
|
base::Unretained(this)));
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wait for the render thread cleanup to complete. Spin instead of using
|
|
|
|
// base::WaitableEvent because calling Wait() is not allowed on the UI
|
|
|
|
// thread.
|
|
|
|
bool complete = false;
|
|
|
|
do {
|
|
|
|
{
|
|
|
|
base::AutoLock lock_scope(single_process_cleanup_lock_);
|
|
|
|
complete = single_process_cleanup_complete_;
|
|
|
|
}
|
|
|
|
if (!complete)
|
|
|
|
base::PlatformThread::YieldCurrentThread();
|
|
|
|
} while (!complete);
|
|
|
|
}
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
void CefContentRendererClient::RenderThreadStarted() {
|
2014-10-07 22:44:33 +02:00
|
|
|
const base::CommandLine* command_line =
|
|
|
|
base::CommandLine::ForCurrentProcess();
|
|
|
|
|
2015-07-24 02:06:56 +02:00
|
|
|
render_task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
2012-04-03 03:34:16 +02:00
|
|
|
observer_.reset(new CefRenderProcessObserver());
|
2014-09-27 01:48:19 +02:00
|
|
|
web_cache_observer_.reset(new web_cache::WebCacheRenderProcessObserver());
|
2012-04-03 03:34:16 +02:00
|
|
|
|
|
|
|
content::RenderThread* thread = content::RenderThread::Get();
|
|
|
|
thread->AddObserver(observer_.get());
|
2014-09-27 01:48:19 +02:00
|
|
|
thread->AddObserver(web_cache_observer_.get());
|
2012-11-02 19:16:28 +01:00
|
|
|
thread->GetChannel()->AddFilter(new CefRenderMessageFilter);
|
2012-04-03 03:34:16 +02:00
|
|
|
|
2014-10-07 22:44:33 +02:00
|
|
|
if (!command_line->HasSwitch(switches::kDisableSpellChecking)) {
|
|
|
|
spellcheck_.reset(new SpellCheck());
|
|
|
|
thread->AddObserver(spellcheck_.get());
|
|
|
|
}
|
|
|
|
|
2013-02-02 01:21:59 +01:00
|
|
|
if (content::RenderProcessHost::run_renderer_in_process()) {
|
|
|
|
// When running in single-process mode register as a destruction observer
|
|
|
|
// on the render thread's MessageLoop.
|
2013-04-16 00:16:01 +02:00
|
|
|
base::MessageLoop::current()->AddDestructionObserver(this);
|
2013-02-02 01:21:59 +01:00
|
|
|
}
|
|
|
|
|
2013-11-08 22:28:56 +01:00
|
|
|
blink::WebPrerenderingSupport::initialize(new CefPrerenderingSupport());
|
2012-05-29 19:18:33 +02:00
|
|
|
|
2012-11-20 21:08:36 +01:00
|
|
|
// Retrieve the new render thread information synchronously.
|
|
|
|
CefProcessHostMsg_GetNewRenderThreadInfo_Params params;
|
|
|
|
thread->Send(new CefProcessHostMsg_GetNewRenderThreadInfo(¶ms));
|
|
|
|
|
2012-12-31 11:41:15 +01:00
|
|
|
// Cross-origin entries need to be added after WebKit is initialized.
|
|
|
|
cross_origin_whitelist_entries_ = params.cross_origin_whitelist_entries;
|
2012-04-03 03:34:16 +02:00
|
|
|
|
2015-04-08 15:16:17 +02:00
|
|
|
#if defined(OS_MACOSX)
|
|
|
|
if (base::mac::IsOSLionOrLater()) {
|
|
|
|
base::ScopedCFTypeRef<CFStringRef> key(
|
|
|
|
base::SysUTF8ToCFStringRef("NSScrollViewRubberbanding"));
|
|
|
|
base::ScopedCFTypeRef<CFStringRef> value;
|
|
|
|
|
|
|
|
// If the command-line switch is specified then set the value that will be
|
|
|
|
// checked in RenderThreadImpl::Init(). Otherwise, remove the application-
|
|
|
|
// level value.
|
|
|
|
if (command_line->HasSwitch(switches::kDisableScrollBounce))
|
|
|
|
value.reset(base::SysUTF8ToCFStringRef("false"));
|
|
|
|
|
|
|
|
CFPreferencesSetAppValue(key, value, kCFPreferencesCurrentApplication);
|
|
|
|
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
|
|
|
|
}
|
|
|
|
#endif // defined(OS_MACOSX)
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
if (extensions::PdfExtensionEnabled()) {
|
|
|
|
pdf_print_client_.reset(new ChromePDFPrintClient());
|
|
|
|
pdf::PepperPDFHost::SetPrintClient(pdf_print_client_.get());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (extensions::ExtensionsEnabled()) {
|
|
|
|
extensions_client_.reset(new extensions::CefExtensionsClient);
|
|
|
|
extensions::ExtensionsClient::Set(extensions_client_.get());
|
|
|
|
|
|
|
|
extensions_renderer_client_.reset(
|
|
|
|
new extensions::CefExtensionsRendererClient);
|
|
|
|
extensions::ExtensionsRendererClient::Set(
|
|
|
|
extensions_renderer_client_.get());
|
|
|
|
|
2015-08-14 16:41:08 +02:00
|
|
|
extension_dispatcher_delegate_.reset(
|
|
|
|
new extensions::CefExtensionsDispatcherDelegate());
|
2015-07-16 23:40:01 +02:00
|
|
|
|
|
|
|
// Must be initialized after ExtensionsRendererClient.
|
|
|
|
extension_dispatcher_.reset(
|
|
|
|
new extensions::Dispatcher(extension_dispatcher_delegate_.get()));
|
|
|
|
thread->AddObserver(extension_dispatcher_.get());
|
|
|
|
|
|
|
|
guest_view_container_dispatcher_.reset(
|
|
|
|
new extensions::ExtensionsGuestViewContainerDispatcher());
|
|
|
|
thread->AddObserver(guest_view_container_dispatcher_.get());
|
|
|
|
}
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
// Notify the render process handler.
|
|
|
|
CefRefPtr<CefApp> application = CefContentClient::Get()->application();
|
|
|
|
if (application.get()) {
|
|
|
|
CefRefPtr<CefRenderProcessHandler> handler =
|
|
|
|
application->GetRenderProcessHandler();
|
2012-11-20 21:08:36 +01:00
|
|
|
if (handler.get()) {
|
|
|
|
CefRefPtr<CefListValueImpl> listValuePtr(
|
|
|
|
new CefListValueImpl(¶ms.extra_info, false, true));
|
|
|
|
handler->OnRenderThreadCreated(listValuePtr.get());
|
|
|
|
listValuePtr->Detach(NULL);
|
|
|
|
}
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
2015-08-14 16:41:08 +02:00
|
|
|
|
|
|
|
// Register extensions last because it will trigger WebKit initialization.
|
|
|
|
thread->RegisterExtension(extensions_v8::LoadTimesExtension::Get());
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
2014-01-02 23:41:11 +01:00
|
|
|
void CefContentRendererClient::RenderFrameCreated(
|
|
|
|
content::RenderFrame* render_frame) {
|
2014-04-04 18:50:38 +02:00
|
|
|
new CefRenderFrameObserver(render_frame);
|
2015-03-25 22:22:47 +01:00
|
|
|
new CefPepperHelper(render_frame);
|
2015-07-16 23:40:01 +02:00
|
|
|
|
|
|
|
if (extensions::ExtensionsEnabled()) {
|
|
|
|
new extensions::ExtensionFrameHelper(render_frame,
|
|
|
|
extension_dispatcher_.get());
|
|
|
|
extension_dispatcher_->OnRenderFrameCreated(render_frame);
|
|
|
|
}
|
|
|
|
|
2014-01-02 23:41:11 +01:00
|
|
|
BrowserCreated(render_frame->GetRenderView(), render_frame);
|
|
|
|
}
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
void CefContentRendererClient::RenderViewCreated(
|
|
|
|
content::RenderView* render_view) {
|
2015-07-16 23:40:01 +02:00
|
|
|
new CefPrerendererClient(render_view);
|
|
|
|
new printing::PrintWebViewHelper(
|
|
|
|
render_view,
|
|
|
|
make_scoped_ptr<printing::PrintWebViewHelper::Delegate>(
|
|
|
|
new extensions::CefPrintWebViewHelperDelegate()));
|
|
|
|
|
|
|
|
if (extensions::ExtensionsEnabled()) {
|
|
|
|
new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
|
|
|
|
}
|
|
|
|
|
|
|
|
const base::CommandLine* command_line =
|
|
|
|
base::CommandLine::ForCurrentProcess();
|
|
|
|
if (!command_line->HasSwitch(switches::kDisableSpellChecking))
|
|
|
|
new SpellCheckProvider(render_view, spellcheck_.get());
|
|
|
|
|
2014-01-02 23:41:11 +01:00
|
|
|
BrowserCreated(render_view, render_view->GetMainRenderFrame());
|
2012-04-03 03:34:16 +02:00
|
|
|
}
|
|
|
|
|
2014-07-01 00:30:29 +02:00
|
|
|
bool CefContentRendererClient::OverrideCreatePlugin(
|
|
|
|
content::RenderFrame* render_frame,
|
|
|
|
blink::WebLocalFrame* frame,
|
|
|
|
const blink::WebPluginParams& params,
|
|
|
|
blink::WebPlugin** plugin) {
|
2015-07-16 23:40:01 +02:00
|
|
|
if (!extensions::ExtensionsEnabled())
|
2014-07-01 00:30:29 +02:00
|
|
|
return false;
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
// Based on ChromeContentRendererClient::OverrideCreatePlugin.
|
|
|
|
std::string orig_mime_type = params.mimeType.utf8();
|
|
|
|
if (orig_mime_type == content::kBrowserPluginMimeType) {
|
|
|
|
bool guest_view_api_available = false;
|
|
|
|
extension_dispatcher_->script_context_set().ForEach(
|
2015-07-24 02:06:56 +02:00
|
|
|
render_frame,
|
2015-07-16 23:40:01 +02:00
|
|
|
base::Bind(&IsGuestViewApiAvailableToScriptContext,
|
|
|
|
&guest_view_api_available));
|
|
|
|
if (guest_view_api_available)
|
|
|
|
return false;
|
2014-07-01 00:30:29 +02:00
|
|
|
}
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
GURL url(params.url);
|
|
|
|
CefViewHostMsg_GetPluginInfo_Output output;
|
|
|
|
render_frame->Send(new CefViewHostMsg_GetPluginInfo(
|
|
|
|
render_frame->GetRoutingID(), url, frame->top()->document().url(),
|
|
|
|
orig_mime_type, &output));
|
|
|
|
|
|
|
|
*plugin = CreatePlugin(render_frame, frame, params, output);
|
|
|
|
return true;
|
2014-07-01 00:30:29 +02:00
|
|
|
}
|
|
|
|
|
2013-11-21 21:59:28 +01:00
|
|
|
bool CefContentRendererClient::HandleNavigation(
|
2014-02-05 21:35:45 +01:00
|
|
|
content::RenderFrame* render_frame,
|
2013-12-17 23:04:35 +01:00
|
|
|
content::DocumentState* document_state,
|
|
|
|
int opener_id,
|
2013-11-21 21:59:28 +01:00
|
|
|
blink::WebFrame* frame,
|
|
|
|
const blink::WebURLRequest& request,
|
|
|
|
blink::WebNavigationType type,
|
|
|
|
blink::WebNavigationPolicy default_policy,
|
|
|
|
bool is_redirect) {
|
|
|
|
CefRefPtr<CefApp> application = CefContentClient::Get()->application();
|
|
|
|
if (application.get()) {
|
|
|
|
CefRefPtr<CefRenderProcessHandler> handler =
|
|
|
|
application->GetRenderProcessHandler();
|
|
|
|
if (handler.get()) {
|
|
|
|
CefRefPtr<CefBrowserImpl> browserPtr =
|
|
|
|
CefBrowserImpl::GetBrowserForMainFrame(frame->top());
|
|
|
|
if (browserPtr.get()) {
|
|
|
|
CefRefPtr<CefFrameImpl> framePtr = browserPtr->GetWebFrameImpl(frame);
|
|
|
|
CefRefPtr<CefRequest> requestPtr(CefRequest::Create());
|
|
|
|
CefRequestImpl* requestImpl =
|
|
|
|
static_cast<CefRequestImpl*>(requestPtr.get());
|
|
|
|
requestImpl->Set(request);
|
|
|
|
requestImpl->SetReadOnly(true);
|
|
|
|
|
|
|
|
cef_navigation_type_t navigation_type = NAVIGATION_OTHER;
|
|
|
|
switch (type) {
|
|
|
|
case blink::WebNavigationTypeLinkClicked:
|
|
|
|
navigation_type = NAVIGATION_LINK_CLICKED;
|
|
|
|
break;
|
|
|
|
case blink::WebNavigationTypeFormSubmitted:
|
|
|
|
navigation_type = NAVIGATION_FORM_SUBMITTED;
|
|
|
|
break;
|
|
|
|
case blink::WebNavigationTypeBackForward:
|
|
|
|
navigation_type = NAVIGATION_BACK_FORWARD;
|
|
|
|
break;
|
|
|
|
case blink::WebNavigationTypeReload:
|
|
|
|
navigation_type = NAVIGATION_RELOAD;
|
|
|
|
break;
|
|
|
|
case blink::WebNavigationTypeFormResubmitted:
|
|
|
|
navigation_type = NAVIGATION_FORM_RESUBMITTED;
|
|
|
|
break;
|
|
|
|
case blink::WebNavigationTypeOther:
|
|
|
|
navigation_type = NAVIGATION_OTHER;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (handler->OnBeforeNavigation(browserPtr.get(), framePtr.get(),
|
|
|
|
requestPtr.get(), navigation_type,
|
|
|
|
is_redirect)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
content::BrowserPluginDelegate*
|
|
|
|
CefContentRendererClient::CreateBrowserPluginDelegate(
|
|
|
|
content::RenderFrame* render_frame,
|
|
|
|
const std::string& mime_type,
|
|
|
|
const GURL& original_url) {
|
|
|
|
DCHECK(extensions::ExtensionsEnabled());
|
|
|
|
if (mime_type == content::kBrowserPluginMimeType) {
|
|
|
|
return new extensions::ExtensionsGuestViewContainer(render_frame);
|
|
|
|
} else {
|
|
|
|
return new extensions::MimeHandlerViewContainer(
|
|
|
|
render_frame, mime_type, original_url);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-31 13:28:07 +02:00
|
|
|
void CefContentRendererClient::AddKeySystems(
|
|
|
|
std::vector<media::KeySystemInfo>* key_systems) {
|
|
|
|
AddCefKeySystems(key_systems);
|
|
|
|
}
|
|
|
|
|
2013-02-02 01:21:59 +01:00
|
|
|
void CefContentRendererClient::WillDestroyCurrentMessageLoop() {
|
|
|
|
base::AutoLock lock_scope(single_process_cleanup_lock_);
|
|
|
|
single_process_cleanup_complete_ = true;
|
|
|
|
}
|
|
|
|
|
2015-09-09 16:05:39 +02:00
|
|
|
// static
|
2015-07-16 23:40:01 +02:00
|
|
|
bool CefContentRendererClient::IsExtensionOrSharedModuleWhitelisted(
|
|
|
|
const GURL& url, const std::set<std::string>& whitelist) {
|
|
|
|
DCHECK(extensions::ExtensionsEnabled());
|
|
|
|
const extensions::ExtensionSet* extension_set =
|
2015-08-26 00:33:31 +02:00
|
|
|
extensions::RendererExtensionRegistry::Get()->GetMainThreadExtensionSet();
|
2015-07-16 23:40:01 +02:00
|
|
|
return chrome::IsExtensionOrSharedModuleWhitelisted(url, extension_set,
|
|
|
|
whitelist);
|
|
|
|
}
|
|
|
|
|
2015-09-09 16:05:39 +02:00
|
|
|
// static
|
|
|
|
blink::WebPlugin* CefContentRendererClient::CreatePlugin(
|
|
|
|
content::RenderFrame* render_frame,
|
|
|
|
blink::WebLocalFrame* frame,
|
|
|
|
const blink::WebPluginParams& original_params,
|
|
|
|
const CefViewHostMsg_GetPluginInfo_Output& output) {
|
|
|
|
const content::WebPluginInfo& info = output.plugin;
|
|
|
|
const std::string& actual_mime_type = output.actual_mime_type;
|
|
|
|
const base::string16& group_name = output.group_name;
|
|
|
|
const std::string& identifier = output.group_identifier;
|
|
|
|
CefViewHostMsg_GetPluginInfo_Status status = output.status;
|
|
|
|
GURL url(original_params.url);
|
|
|
|
std::string orig_mime_type = original_params.mimeType.utf8();
|
|
|
|
CefPluginPlaceholder* placeholder = NULL;
|
|
|
|
|
|
|
|
// If the browser plugin is to be enabled, this should be handled by the
|
|
|
|
// renderer, so the code won't reach here due to the early exit in
|
|
|
|
// OverrideCreatePlugin.
|
|
|
|
if (status == CefViewHostMsg_GetPluginInfo_Status::kNotFound ||
|
|
|
|
orig_mime_type == content::kBrowserPluginMimeType) {
|
|
|
|
placeholder = CefPluginPlaceholder::CreateLoadableMissingPlugin(
|
|
|
|
render_frame, frame, original_params);
|
|
|
|
} else {
|
|
|
|
// TODO(bauerb): This should be in content/.
|
|
|
|
blink::WebPluginParams params(original_params);
|
|
|
|
for (size_t i = 0; i < info.mime_types.size(); ++i) {
|
|
|
|
if (info.mime_types[i].mime_type == actual_mime_type) {
|
|
|
|
AppendParams(info.mime_types[i].additional_param_names,
|
|
|
|
info.mime_types[i].additional_param_values,
|
|
|
|
¶ms.attributeNames, ¶ms.attributeValues);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (params.mimeType.isNull() && (actual_mime_type.size() > 0)) {
|
|
|
|
// Webkit might say that mime type is null while we already know the
|
|
|
|
// actual mime type via CefViewHostMsg_GetPluginInfo. In that case
|
|
|
|
// we should use what we know since WebpluginDelegateProxy does some
|
|
|
|
// specific initializations based on this information.
|
|
|
|
params.mimeType = blink::WebString::fromUTF8(actual_mime_type.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
auto create_blocked_plugin =
|
|
|
|
[&render_frame, &frame, ¶ms, &info, &identifier, &group_name](
|
|
|
|
int template_id, const base::string16& message) {
|
|
|
|
return CefPluginPlaceholder::CreateBlockedPlugin(
|
|
|
|
render_frame, frame, params, info, identifier, group_name,
|
|
|
|
template_id, message, PlaceholderPosterInfo());
|
|
|
|
};
|
|
|
|
switch (status) {
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kNotFound: {
|
|
|
|
NOTREACHED();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kAllowed:
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kPlayImportantContent: {
|
|
|
|
// Delay loading plugins if prerendering.
|
|
|
|
// TODO(mmenke): In the case of prerendering, feed into
|
|
|
|
// CefContentRendererClient::CreatePlugin instead, to
|
|
|
|
// reduce the chance of future regressions.
|
|
|
|
bool is_prerendering = false;
|
|
|
|
bool power_saver_enabled =
|
|
|
|
status ==
|
|
|
|
CefViewHostMsg_GetPluginInfo_Status::kPlayImportantContent;
|
|
|
|
bool blocked_for_background_tab =
|
|
|
|
render_frame->IsHidden() && power_saver_enabled;
|
|
|
|
|
|
|
|
PlaceholderPosterInfo poster_info;
|
|
|
|
if (power_saver_enabled) {
|
|
|
|
poster_info.poster_attribute =
|
|
|
|
GetPluginInstancePosterAttribute(params);
|
|
|
|
poster_info.base_url = frame->document().url();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blocked_for_background_tab || is_prerendering ||
|
|
|
|
!poster_info.poster_attribute.empty()) {
|
|
|
|
placeholder = CefPluginPlaceholder::CreateBlockedPlugin(
|
|
|
|
render_frame, frame, params, info, identifier, group_name,
|
|
|
|
poster_info.poster_attribute.empty() ? IDR_BLOCKED_PLUGIN_HTML
|
|
|
|
: IDR_PLUGIN_POSTER_HTML,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, group_name),
|
|
|
|
poster_info);
|
|
|
|
placeholder->set_blocked_for_background_tab(
|
|
|
|
blocked_for_background_tab);
|
|
|
|
placeholder->set_blocked_for_prerendering(is_prerendering);
|
|
|
|
placeholder->set_power_saver_enabled(power_saver_enabled);
|
|
|
|
placeholder->AllowLoading();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
scoped_ptr<content::PluginInstanceThrottler> throttler;
|
|
|
|
if (power_saver_enabled) {
|
|
|
|
throttler = content::PluginInstanceThrottler::Create();
|
|
|
|
// PluginPreroller manages its own lifetime.
|
|
|
|
new CefPluginPreroller(
|
|
|
|
render_frame, frame, params, info, identifier, group_name,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, group_name),
|
|
|
|
throttler.get());
|
|
|
|
}
|
|
|
|
|
|
|
|
return render_frame->CreatePlugin(frame, info, params,
|
|
|
|
throttler.Pass());
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kNPAPINotSupported: {
|
|
|
|
content::RenderThread::Get()->RecordAction(
|
|
|
|
base::UserMetricsAction("Plugin_NPAPINotSupported"));
|
|
|
|
placeholder = create_blocked_plugin(
|
|
|
|
IDR_BLOCKED_PLUGIN_HTML,
|
|
|
|
l10n_util::GetStringUTF16(IDS_PLUGIN_NOT_SUPPORTED_METRO));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kDisabled: {
|
|
|
|
// Intentionally using the blocked plugin resources instead of the
|
|
|
|
// disabled plugin resources. This provides better messaging (no link to
|
|
|
|
// chrome://plugins) and adds testing support.
|
|
|
|
placeholder = create_blocked_plugin(
|
|
|
|
IDR_BLOCKED_PLUGIN_HTML,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED_BY_POLICY,
|
|
|
|
group_name));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kOutdatedBlocked: {
|
|
|
|
NOTREACHED() << "Plugin installation is not supported.";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kOutdatedDisallowed: {
|
|
|
|
placeholder = create_blocked_plugin(
|
|
|
|
IDR_BLOCKED_PLUGIN_HTML,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_OUTDATED, group_name));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kUnauthorized: {
|
|
|
|
placeholder = create_blocked_plugin(
|
|
|
|
IDR_BLOCKED_PLUGIN_HTML,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_NOT_AUTHORIZED, group_name));
|
|
|
|
placeholder->AllowLoading();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kBlocked: {
|
|
|
|
placeholder = create_blocked_plugin(
|
|
|
|
IDR_BLOCKED_PLUGIN_HTML,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED, group_name));
|
|
|
|
placeholder->AllowLoading();
|
|
|
|
content::RenderThread::Get()->RecordAction(
|
|
|
|
base::UserMetricsAction("Plugin_Blocked"));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case CefViewHostMsg_GetPluginInfo_Status::kBlockedByPolicy: {
|
|
|
|
placeholder = create_blocked_plugin(
|
|
|
|
IDR_BLOCKED_PLUGIN_HTML,
|
|
|
|
l10n_util::GetStringFUTF16(IDS_PLUGIN_BLOCKED_BY_POLICY,
|
|
|
|
group_name));
|
|
|
|
content::RenderThread::Get()->RecordAction(
|
|
|
|
base::UserMetricsAction("Plugin_BlockedByPolicy"));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
placeholder->SetStatus(status);
|
|
|
|
return placeholder->plugin();
|
|
|
|
}
|
|
|
|
|
2014-01-02 23:41:11 +01:00
|
|
|
void CefContentRendererClient::BrowserCreated(
|
|
|
|
content::RenderView* render_view,
|
|
|
|
content::RenderFrame* render_frame) {
|
|
|
|
// Retrieve the browser information synchronously. This will also register
|
|
|
|
// the routing ids with the browser info object in the browser process.
|
|
|
|
CefProcessHostMsg_GetNewBrowserInfo_Params params;
|
|
|
|
content::RenderThread::Get()->Send(
|
|
|
|
new CefProcessHostMsg_GetNewBrowserInfo(
|
|
|
|
render_view->GetRoutingID(),
|
|
|
|
render_frame->GetRoutingID(),
|
|
|
|
¶ms));
|
|
|
|
DCHECK_GT(params.browser_id, 0);
|
|
|
|
|
2015-07-16 23:40:01 +02:00
|
|
|
if (params.is_mime_handler_view) {
|
|
|
|
// Don't create a CefBrowser for mime handler views.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-01-02 23:41:11 +01:00
|
|
|
// Don't create another browser object if one already exists for the view.
|
2014-09-27 01:48:19 +02:00
|
|
|
if (GetBrowserForView(render_view).get())
|
2014-01-02 23:41:11 +01:00
|
|
|
return;
|
|
|
|
|
2014-07-01 00:30:29 +02:00
|
|
|
#if defined(OS_MACOSX)
|
|
|
|
// FIXME: It would be better if this API would be a callback from the
|
|
|
|
// WebKit layer, or if it would be exposed as an WebView instance method; the
|
|
|
|
// current implementation uses a static variable, and WebKit needs to be
|
|
|
|
// patched in order to make it work for each WebView instance
|
|
|
|
render_view->GetWebView()->setUseExternalPopupMenusThisInstance(
|
|
|
|
!params.is_windowless);
|
|
|
|
#endif
|
|
|
|
|
2014-01-02 23:41:11 +01:00
|
|
|
CefRefPtr<CefBrowserImpl> browser =
|
2014-07-01 00:30:29 +02:00
|
|
|
new CefBrowserImpl(render_view, params.browser_id, params.is_popup,
|
|
|
|
params.is_windowless);
|
2014-01-02 23:41:11 +01:00
|
|
|
browsers_.insert(std::make_pair(render_view, browser));
|
|
|
|
|
|
|
|
// Notify the render process handler.
|
|
|
|
CefRefPtr<CefApp> application = CefContentClient::Get()->application();
|
|
|
|
if (application.get()) {
|
|
|
|
CefRefPtr<CefRenderProcessHandler> handler =
|
|
|
|
application->GetRenderProcessHandler();
|
|
|
|
if (handler.get())
|
|
|
|
handler->OnBrowserCreated(browser.get());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-02 01:21:59 +01:00
|
|
|
void CefContentRendererClient::RunSingleProcessCleanupOnUIThread() {
|
|
|
|
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
|
|
|
|
|
|
|
// Clean up the single existing RenderProcessHost.
|
|
|
|
content::RenderProcessHost* host = NULL;
|
|
|
|
content::RenderProcessHost::iterator iterator(
|
|
|
|
content::RenderProcessHost::AllHostsIterator());
|
|
|
|
if (!iterator.IsAtEnd()) {
|
|
|
|
host = iterator.GetCurrentValue();
|
|
|
|
host->Cleanup();
|
|
|
|
iterator.Advance();
|
|
|
|
DCHECK(iterator.IsAtEnd());
|
|
|
|
}
|
|
|
|
DCHECK(host);
|
|
|
|
|
|
|
|
// Clear the run_renderer_in_process() flag to avoid a DCHECK in the
|
|
|
|
// RenderProcessHost destructor.
|
|
|
|
content::RenderProcessHost::SetRunRendererInProcess(false);
|
|
|
|
|
|
|
|
// Deletion of the RenderProcessHost object will stop the render thread and
|
|
|
|
// result in a call to WillDestroyCurrentMessageLoop.
|
|
|
|
// Cleanup() will cause deletion to be posted as a task on the UI thread but
|
|
|
|
// this task will only execute when running in multi-threaded message loop
|
|
|
|
// mode (because otherwise the UI message loop has already stopped). Therefore
|
|
|
|
// we need to explicitly delete the object when not running in this mode.
|
2013-09-03 20:06:25 +02:00
|
|
|
if (!CefContext::Get()->settings().multi_threaded_message_loop)
|
2013-02-02 01:21:59 +01:00
|
|
|
delete host;
|
|
|
|
}
|