#include "base/command_line.h"
#include "base/debug/crash_logging.h"
#include "base/logging.h"
+#include "base/metrics/field_trial.h"
#include "base/metrics/histogram.h"
#include "base/metrics/user_metrics_action.h"
#include "base/path_service.h"
#include "chrome/common/chrome_content_client.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/chrome_version_info.h"
#include "chrome/common/content_settings_pattern.h"
#include "chrome/common/crash_keys.h"
#include "chrome/common/extensions/chrome_extensions_client.h"
#include "chrome/common/pepper_permission_util.h"
#include "chrome/common/render_messages.h"
#include "chrome/common/url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/grit/locale_settings.h"
+#include "chrome/grit/renderer_resources.h"
#include "chrome/renderer/benchmarking_extension.h"
#include "chrome/renderer/chrome_render_frame_observer.h"
#include "chrome/renderer/chrome_render_process_observer.h"
#include "chrome/renderer/playback_extension.h"
#include "chrome/renderer/plugins/chrome_plugin_placeholder.h"
#include "chrome/renderer/plugins/plugin_uma.h"
+#include "chrome/renderer/prefetch_helper.h"
#include "chrome/renderer/prerender/prerender_dispatcher.h"
#include "chrome/renderer/prerender/prerender_helper.h"
#include "chrome/renderer/prerender/prerender_media_load_deferrer.h"
#include "components/autofill/content/renderer/autofill_agent.h"
#include "components/autofill/content/renderer/password_autofill_agent.h"
#include "components/autofill/content/renderer/password_generation_agent.h"
+#include "components/dom_distiller/core/url_constants.h"
#include "components/nacl/renderer/ppb_nacl_private_impl.h"
#include "components/plugins/renderer/mobile_youtube_plugin.h"
#include "components/signin/core/common/profile_management_switches.h"
#include "extensions/renderer/dispatcher.h"
#include "extensions/renderer/extension_helper.h"
#include "extensions/renderer/script_context.h"
-#include "grit/generated_resources.h"
-#include "grit/locale_settings.h"
-#include "grit/renderer_resources.h"
#include "ipc/ipc_sync_channel.h"
#include "net/base/net_errors.h"
#include "ppapi/c/private/ppb_nacl_private.h"
#include "ui/base/webui/jstemplate_builder.h"
#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
-#if defined(ENABLE_WEBRTC)
-#include "chrome/renderer/media/webrtc_logging_message_filter.h"
+#if !defined(DISABLE_NACL)
+#include "components/nacl/renderer/nacl_helper.h"
+#endif
+
+#if defined(ENABLE_EXTENSIONS)
+#include "chrome/renderer/extensions/chrome_extensions_render_frame_observer.h"
#endif
#if defined(ENABLE_SPELLCHECK)
#include "chrome/renderer/spellchecker/spellcheck_provider.h"
#endif
+#if defined(ENABLE_WEBRTC)
+#include "chrome/renderer/media/webrtc_logging_message_filter.h"
+#endif
+
#if defined(OS_WIN)
#include "chrome_elf/blacklist/blacklist.h"
-#endif // OS_WIN
+#endif
using autofill::AutofillAgent;
using autofill::PasswordAutofillAgent;
namespace {
-const char kWebViewTagName[] = "WEBVIEW";
-const char kAdViewTagName[] = "ADVIEW";
-
ChromeContentRendererClient* g_current_client;
+#if defined(ENABLE_PLUGINS)
+const char* const kPredefinedAllowedCompositorOrigins[] = {
+ "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see crbug.com/383937
+ "4EB74897CB187C7633357C2FE832E0AD6A44883A" // see crbug.com/383937
+};
+
+const char* const kPredefinedAllowedVideoDecodeOrigins[] = {
+ "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", // see crbug.com/383937
+ "4EB74897CB187C7633357C2FE832E0AD6A44883A" // see crbug.com/383937
+};
+#endif
+
static void AppendParams(const std::vector<base::string16>& additional_names,
const std::vector<base::string16>& additional_values,
WebVector<WebString>* existing_names,
return false;
}
+void IsGuestViewApiAvailableToScriptContext(
+ bool* api_is_available,
+ extensions::ScriptContext* context) {
+ if (context->GetAvailability("guestViewInternal").is_available()) {
+ *api_is_available = true;
+ }
+}
+
} // namespace
ChromeContentRendererClient::ChromeContentRendererClient() {
extensions::ChromeExtensionsClient::GetInstance());
extensions::ExtensionsRendererClient::Set(
ChromeExtensionsRendererClient::GetInstance());
+#if defined(ENABLE_PLUGINS)
+ for (size_t i = 0; i < arraysize(kPredefinedAllowedCompositorOrigins); ++i)
+ allowed_compositor_origins_.insert(kPredefinedAllowedCompositorOrigins[i]);
+ for (size_t i = 0; i < arraysize(kPredefinedAllowedVideoDecodeOrigins); ++i)
+ allowed_video_decode_origins_.insert(
+ kPredefinedAllowedVideoDecodeOrigins[i]);
+#endif
}
ChromeContentRendererClient::~ChromeContentRendererClient() {
thread->RegisterExtension(extensions_v8::SearchBoxExtension::Get());
if (command_line->HasSwitch(switches::kPlaybackMode) ||
- command_line->HasSwitch(switches::kRecordMode) ||
- command_line->HasSwitch(switches::kNoJsRandomness)) {
+ command_line->HasSwitch(switches::kRecordMode)) {
thread->RegisterExtension(extensions_v8::PlaybackExtension::Get());
}
// TODO(guohui): needs to forward the new-profile-management switch to
// renderer processes.
- if (switches::IsNewProfileManagement())
+ if (switches::IsEnableAccountConsistency())
thread->RegisterExtension(extensions_v8::PrincipalsExtension::Get());
// chrome:, chrome-search:, chrome-devtools:, and chrome-distiller: pages
WebString dev_tools_scheme(ASCIIToUTF16(content::kChromeDevToolsScheme));
WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(dev_tools_scheme);
- WebString dom_distiller_scheme(ASCIIToUTF16(chrome::kDomDistillerScheme));
+ WebString dom_distiller_scheme(
+ ASCIIToUTF16(dom_distiller::kDomDistillerScheme));
// TODO(nyquist): Add test to ensure this happens when the flag is set.
WebSecurityPolicy::registerURLSchemeAsDisplayIsolated(dom_distiller_scheme);
chrome_observer_->content_setting_rules());
}
+#if defined(ENABLE_EXTENSIONS)
+ new extensions::ChromeExtensionsRenderFrameObserver(render_frame);
+#endif
new extensions::ExtensionFrameHelper(render_frame,
extension_dispatcher_.get());
new PepperHelper(render_frame);
#endif
+#if !defined(DISABLE_NACL)
+ new nacl::NaClHelper(render_frame);
+#endif
+
// TODO(jam): when the frame tree moves into content and parent() works at
// RenderFrame construction, simplify this by just checking parent().
if (render_frame->GetRenderView()->GetMainRenderFrame() != render_frame) {
if (render_frame->GetRenderView()->GetMainRenderFrame() == render_frame) {
// Only attach NetErrorHelper to the main frame, since only the main frame
// should get error pages.
+ // PrefetchHelper is also needed only for main frames.
new NetErrorHelper(render_frame);
+ new prefetch::PrefetchHelper(render_frame);
}
}
content::RenderView* render_view) {
new extensions::ExtensionHelper(render_view, extension_dispatcher_.get());
new extensions::ChromeExtensionHelper(render_view);
+ extension_dispatcher_->OnRenderViewCreated(render_view);
new PageLoadHistograms(render_view);
#if defined(ENABLE_PRINTING)
new printing::PrintWebViewHelper(render_view);
WebPlugin** plugin) {
std::string orig_mime_type = params.mimeType.utf8();
if (orig_mime_type == content::kBrowserPluginMimeType) {
- WebDocument document = frame->document();
- const Extension* extension =
- GetExtensionByOrigin(document.securityOrigin());
- if (extension) {
- const extensions::APIPermission::ID perms[] = {
- extensions::APIPermission::kWebView,
- extensions::APIPermission::kAdView
- };
- for (size_t i = 0; i < arraysize(perms); ++i) {
- if (extension->HasAPIPermission(perms[i]))
- return false;
- }
- }
+ bool guest_view_api_available = false;
+ extension_dispatcher_->script_context_set().ForEach(
+ render_frame->GetRenderView(),
+ base::Bind(&IsGuestViewApiAvailableToScriptContext,
+ &guest_view_api_available));
+ if (guest_view_api_available)
+ return false;
}
ChromeViewHostMsg_GetPluginInfo_Output output;
CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableNaCl);
} else if (is_pnacl_mime_type) {
- is_nacl_unrestricted =
- !CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisablePnacl);
+ is_nacl_unrestricted = true;
}
GURL manifest_url;
GURL app_url;
IDR_BLOCKED_PLUGIN_HTML,
l10n_util::GetStringFUTF16(IDS_PLUGIN_NOT_AUTHORIZED, group_name));
placeholder->set_allow_loading(true);
- render_frame->Send(new ChromeViewHostMsg_BlockedUnauthorizedPlugin(
- render_frame->GetRoutingID(),
- group_name,
- identifier));
+ // Check to see if old infobar should be displayed.
+ std::string trial_group =
+ base::FieldTrialList::FindFullName("UnauthorizedPluginInfoBar");
+ if (plugin.type != content::WebPluginInfo::PLUGIN_TYPE_NPAPI ||
+ trial_group == "Enabled") {
+ render_frame->Send(new ChromeViewHostMsg_BlockedUnauthorizedPlugin(
+ render_frame->GetRoutingID(),
+ group_name,
+ identifier));
+ } else {
+ // Send IPC for showing blocked plugins page action.
+ observer->DidBlockContentType(content_type);
+ }
break;
}
case ChromeViewHostMsg_GetPluginInfo_Status::kClickToPlay: {
case extensions::Feature::UNSPECIFIED_CONTEXT:
case extensions::Feature::WEB_PAGE_CONTEXT:
case extensions::Feature::UNBLESSED_EXTENSION_CONTEXT:
+ case extensions::Feature::WEBUI_CONTEXT:
return false;
case extensions::Feature::BLESSED_EXTENSION_CONTEXT:
case extensions::Feature::CONTENT_SCRIPT_CONTEXT:
}
#endif
-bool ChromeContentRendererClient::IsAdblockInstalled() {
- return g_current_client->extension_dispatcher_->extensions()->Contains(
- "gighmmpiobklfepjocnamgkkbiglidom");
-}
-
-bool ChromeContentRendererClient::IsAdblockPlusInstalled() {
- return g_current_client->extension_dispatcher_->extensions()->Contains(
- "cfhdojbkjhnklbpkdaibdccddilifddb");
-}
-
-bool ChromeContentRendererClient::IsAdblockWithWebRequestInstalled() {
- return g_current_client->extension_dispatcher_delegate_
- ->IsAdblockWithWebRequestInstalled();
-}
-
-bool ChromeContentRendererClient::IsAdblockPlusWithWebRequestInstalled() {
- return g_current_client->extension_dispatcher_delegate_
- ->IsAdblockPlusWithWebRequestInstalled();
-}
-
-bool ChromeContentRendererClient::IsOtherExtensionWithWebRequestInstalled() {
+// static
+bool ChromeContentRendererClient::WasWebRequestUsedBySomeExtensions() {
return g_current_client->extension_dispatcher_delegate_
- ->IsOtherExtensionWithWebRequestInstalled();
+ ->WasWebRequestUsedBySomeExtensions();
}
const void* ChromeContentRendererClient::CreatePPAPIInterface(
return new TtsDispatcher(client);
}
-bool ChromeContentRendererClient::AllowBrowserPlugin(
- blink::WebPluginContainer* container) {
- // If this |BrowserPlugin| <object> in the |container| is not inside a
- // <webview>/<adview> shadowHost, we disable instantiating this plugin. This
- // is to discourage and prevent developers from accidentally attaching
- // <object> directly in apps.
- //
- // Note that this check below does *not* ensure any security, it is still
- // possible to bypass this check.
- // TODO(lazyboy): http://crbug.com/178663, Ensure we properly disallow
- // instantiating BrowserPlugin outside of the <webview>/<adview> shim.
- if (container->element().isNull())
- return false;
-
- if (container->element().shadowHost().isNull())
- return false;
-
- WebString tag_name = container->element().shadowHost().tagName();
- return tag_name.equals(WebString::fromUTF8(kWebViewTagName)) ||
- tag_name.equals(WebString::fromUTF8(kAdViewTagName));
-}
-
bool ChromeContentRendererClient::AllowPepperMediaStreamAPI(
const GURL& url) {
#if !defined(OS_ANDROID)
blink::WebFrame* frame) {
return new WorkerPermissionClientProxy(render_frame, frame);
}
+
+bool ChromeContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() {
+#if defined(ENABLE_PLUGINS)
+ // Allow access for tests.
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnablePepperTesting)) {
+ return true;
+ }
+
+ chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
+ // Allow dev channel APIs to be used on "Canary", "Dev", and "Unknown"
+ // releases of Chrome. Permitting "Unknown" allows these APIs to be used on
+ // Chromium builds as well.
+ return channel <= chrome::VersionInfo::CHANNEL_DEV;
+#else
+ return false;
+#endif
+}
+
+bool ChromeContentRendererClient::IsPluginAllowedToUseCompositorAPI(
+ const GURL& url) {
+#if defined(ENABLE_PLUGINS)
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnablePepperTesting))
+ return true;
+ if (IsExtensionOrSharedModuleWhitelisted(url, allowed_compositor_origins_))
+ return true;
+
+ chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
+ return channel <= chrome::VersionInfo::CHANNEL_DEV;
+#else
+ return false;
+#endif
+}
+
+bool ChromeContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI(
+ const GURL& url) {
+#if defined(ENABLE_PLUGINS)
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnablePepperTesting))
+ return true;
+
+ if (IsExtensionOrSharedModuleWhitelisted(url, allowed_video_decode_origins_))
+ return true;
+
+ chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
+ return channel <= chrome::VersionInfo::CHANNEL_DEV;
+#else
+ return false;
+#endif
+}