Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1668)

Side by Side Diff: chrome/renderer/chrome_content_renderer_client.cc

Issue 1394283003: Move more extensions code into ChromeExtensionsRendererClient. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: IWYU Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/chrome_content_renderer_client.h" 5 #include "chrome/renderer/chrome_content_renderer_client.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/debug/crash_logging.h" 8 #include "base/debug/crash_logging.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
11 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
12 #include "base/metrics/user_metrics_action.h" 12 #include "base/metrics/user_metrics_action.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_util.h" 14 #include "base/strings/string_util.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "chrome/common/channel_info.h" 17 #include "chrome/common/channel_info.h"
18 #include "chrome/common/chrome_isolated_world_ids.h" 18 #include "chrome/common/chrome_isolated_world_ids.h"
19 #include "chrome/common/chrome_paths.h" 19 #include "chrome/common/chrome_paths.h"
20 #include "chrome/common/chrome_switches.h" 20 #include "chrome/common/chrome_switches.h"
21 #include "chrome/common/crash_keys.h" 21 #include "chrome/common/crash_keys.h"
22 #include "chrome/common/extensions/extension_metrics.h"
23 #include "chrome/common/localized_error.h" 22 #include "chrome/common/localized_error.h"
24 #include "chrome/common/pepper_permission_util.h" 23 #include "chrome/common/pepper_permission_util.h"
25 #include "chrome/common/render_messages.h" 24 #include "chrome/common/render_messages.h"
26 #include "chrome/common/secure_origin_whitelist.h" 25 #include "chrome/common/secure_origin_whitelist.h"
27 #include "chrome/common/url_constants.h" 26 #include "chrome/common/url_constants.h"
28 #include "chrome/grit/generated_resources.h" 27 #include "chrome/grit/generated_resources.h"
29 #include "chrome/grit/locale_settings.h" 28 #include "chrome/grit/locale_settings.h"
30 #include "chrome/grit/renderer_resources.h" 29 #include "chrome/grit/renderer_resources.h"
31 #include "chrome/renderer/banners/app_banner_client.h" 30 #include "chrome/renderer/banners/app_banner_client.h"
32 #include "chrome/renderer/benchmarking_extension.h" 31 #include "chrome/renderer/benchmarking_extension.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 #include "ui/base/webui/jstemplate_builder.h" 102 #include "ui/base/webui/jstemplate_builder.h"
104 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 103 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
105 104
106 #if !defined(DISABLE_NACL) 105 #if !defined(DISABLE_NACL)
107 #include "components/nacl/common/nacl_constants.h" 106 #include "components/nacl/common/nacl_constants.h"
108 #include "components/nacl/renderer/nacl_helper.h" 107 #include "components/nacl/renderer/nacl_helper.h"
109 #endif 108 #endif
110 109
111 #if defined(ENABLE_EXTENSIONS) 110 #if defined(ENABLE_EXTENSIONS)
112 #include "chrome/common/extensions/chrome_extensions_client.h" 111 #include "chrome/common/extensions/chrome_extensions_client.h"
113 #include "chrome/common/extensions/extension_process_policy.h"
114 #include "chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.h"
115 #include "chrome/renderer/extensions/chrome_extensions_renderer_client.h" 112 #include "chrome/renderer/extensions/chrome_extensions_renderer_client.h"
116 #include "chrome/renderer/extensions/renderer_permissions_policy_delegate.h"
117 #include "chrome/renderer/extensions/resource_request_policy.h"
118 #include "chrome/renderer/media/cast_ipc_dispatcher.h"
119 #include "extensions/common/extension.h"
120 #include "extensions/common/extension_set.h"
121 #include "extensions/common/extension_urls.h" 113 #include "extensions/common/extension_urls.h"
122 #include "extensions/common/switches.h" 114 #include "extensions/common/switches.h"
123 #include "extensions/renderer/dispatcher.h" 115 #include "extensions/renderer/dispatcher.h"
124 #include "extensions/renderer/extension_frame_helper.h"
125 #include "extensions/renderer/extension_helper.h"
126 #include "extensions/renderer/extensions_render_frame_observer.h"
127 #include "extensions/renderer/guest_view/extensions_guest_view_container.h"
128 #include "extensions/renderer/guest_view/extensions_guest_view_container_dispatc her.h"
129 #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_con tainer.h"
130 #include "extensions/renderer/renderer_extension_registry.h" 116 #include "extensions/renderer/renderer_extension_registry.h"
131 #include "extensions/renderer/script_context.h"
132 #endif 117 #endif
133 118
134 #if defined(ENABLE_IPC_FUZZER) 119 #if defined(ENABLE_IPC_FUZZER)
135 #include "chrome/common/external_ipc_dumper.h" 120 #include "chrome/common/external_ipc_dumper.h"
136 #endif 121 #endif
137 122
138 #if defined(ENABLE_PLUGINS) 123 #if defined(ENABLE_PLUGINS)
139 #include "chrome/renderer/plugins/chrome_plugin_placeholder.h" 124 #include "chrome/renderer/plugins/chrome_plugin_placeholder.h"
140 #endif 125 #endif
141 126
(...skipping 13 matching lines...) Expand all
155 140
156 #if defined(ENABLE_WEBRTC) 141 #if defined(ENABLE_WEBRTC)
157 #include "chrome/renderer/media/webrtc_logging_message_filter.h" 142 #include "chrome/renderer/media/webrtc_logging_message_filter.h"
158 #endif 143 #endif
159 144
160 using autofill::AutofillAgent; 145 using autofill::AutofillAgent;
161 using autofill::PasswordAutofillAgent; 146 using autofill::PasswordAutofillAgent;
162 using autofill::PasswordGenerationAgent; 147 using autofill::PasswordGenerationAgent;
163 using base::ASCIIToUTF16; 148 using base::ASCIIToUTF16;
164 using base::UserMetricsAction; 149 using base::UserMetricsAction;
165 using content::PluginInstanceThrottler;
166 using content::RenderFrame;
167 using content::RenderThread;
168 using content::WebPluginInfo;
169 using extensions::Extension;
170 using blink::WebCache; 150 using blink::WebCache;
171 using blink::WebConsoleMessage; 151 using blink::WebConsoleMessage;
172 using blink::WebDataSource; 152 using blink::WebDataSource;
173 using blink::WebDocument; 153 using blink::WebDocument;
174 using blink::WebLocalFrame; 154 using blink::WebLocalFrame;
175 using blink::WebPlugin; 155 using blink::WebPlugin;
176 using blink::WebPluginParams; 156 using blink::WebPluginParams;
177 using blink::WebSecurityOrigin; 157 using blink::WebSecurityOrigin;
178 using blink::WebSecurityPolicy; 158 using blink::WebSecurityPolicy;
179 using blink::WebString; 159 using blink::WebString;
180 using blink::WebURL; 160 using blink::WebURL;
181 using blink::WebURLError; 161 using blink::WebURLError;
182 using blink::WebURLRequest; 162 using blink::WebURLRequest;
183 using blink::WebURLResponse; 163 using blink::WebURLResponse;
184 using blink::WebVector; 164 using blink::WebVector;
165 using content::PluginInstanceThrottler;
166 using content::RenderFrame;
167 using content::RenderThread;
168 using content::WebPluginInfo;
169 using extensions::Extension;
185 170
186 namespace { 171 namespace {
187 172
188 ChromeContentRendererClient* g_current_client;
189
190 // Whitelist PPAPI for Android Runtime for Chromium. (See crbug.com/383937) 173 // Whitelist PPAPI for Android Runtime for Chromium. (See crbug.com/383937)
191 #if defined(ENABLE_PLUGINS) 174 #if defined(ENABLE_PLUGINS)
192 const char* const kPredefinedAllowedCameraDeviceOrigins[] = { 175 const char* const kPredefinedAllowedCameraDeviceOrigins[] = {
193 "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", 176 "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F",
194 "4EB74897CB187C7633357C2FE832E0AD6A44883A" 177 "4EB74897CB187C7633357C2FE832E0AD6A44883A"
195 }; 178 };
196 179
197 const char* const kPredefinedAllowedCompositorOrigins[] = { 180 const char* const kPredefinedAllowedCompositorOrigins[] = {
198 "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F", 181 "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F",
199 "4EB74897CB187C7633357C2FE832E0AD6A44883A" 182 "4EB74897CB187C7633357C2FE832E0AD6A44883A"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 }; 249 };
267 250
268 bool SpellCheckReplacer::Visit(content::RenderView* render_view) { 251 bool SpellCheckReplacer::Visit(content::RenderView* render_view) {
269 SpellCheckProvider* provider = SpellCheckProvider::Get(render_view); 252 SpellCheckProvider* provider = SpellCheckProvider::Get(render_view);
270 DCHECK(provider); 253 DCHECK(provider);
271 provider->set_spellcheck(spellcheck_); 254 provider->set_spellcheck(spellcheck_);
272 return true; 255 return true;
273 } 256 }
274 #endif 257 #endif
275 258
276 #if defined(ENABLE_EXTENSIONS)
277 void IsGuestViewApiAvailableToScriptContext(
278 bool* api_is_available,
279 extensions::ScriptContext* context) {
280 if (context->GetAvailability("guestViewInternal").is_available()) {
281 *api_is_available = true;
282 }
283 }
284 #endif
285
286 #if defined(ENABLE_PLUGINS) 259 #if defined(ENABLE_PLUGINS)
287 // Presence of the poster param within plugin object tags. 260 // Presence of the poster param within plugin object tags.
288 // These numeric values are used in UMA logs; do not change them. 261 // These numeric values are used in UMA logs; do not change them.
289 enum PosterParamPresence { 262 enum PosterParamPresence {
290 POSTER_PRESENCE_NO_PARAM_PPS_DISABLED = 0, 263 POSTER_PRESENCE_NO_PARAM_PPS_DISABLED = 0,
291 POSTER_PRESENCE_NO_PARAM_PPS_ENABLED = 1, 264 POSTER_PRESENCE_NO_PARAM_PPS_ENABLED = 1,
292 POSTER_PRESENCE_PARAM_EXISTS_PPS_DISABLED = 2, 265 POSTER_PRESENCE_PARAM_EXISTS_PPS_DISABLED = 2,
293 POSTER_PRESENCE_PARAM_EXISTS_PPS_ENABLED = 3, 266 POSTER_PRESENCE_PARAM_EXISTS_PPS_ENABLED = 3,
294 POSTER_PRESENCE_NUM_ITEMS 267 POSTER_PRESENCE_NUM_ITEMS
295 }; 268 };
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 } 335 }
363 336
364 const base::Closure continue_loading_cb_; 337 const base::Closure continue_loading_cb_;
365 338
366 DISALLOW_COPY_AND_ASSIGN(MediaLoadDeferrer); 339 DISALLOW_COPY_AND_ASSIGN(MediaLoadDeferrer);
367 }; 340 };
368 341
369 } // namespace 342 } // namespace
370 343
371 ChromeContentRendererClient::ChromeContentRendererClient() { 344 ChromeContentRendererClient::ChromeContentRendererClient() {
372 g_current_client = this;
373
374 #if defined(ENABLE_EXTENSIONS) 345 #if defined(ENABLE_EXTENSIONS)
375 extensions::ExtensionsClient::Set( 346 extensions::ExtensionsClient::Set(
376 extensions::ChromeExtensionsClient::GetInstance()); 347 extensions::ChromeExtensionsClient::GetInstance());
377 extensions::ExtensionsRendererClient::Set( 348 extensions::ExtensionsRendererClient::Set(
378 ChromeExtensionsRendererClient::GetInstance()); 349 ChromeExtensionsRendererClient::GetInstance());
379 #endif 350 #endif
380 #if defined(ENABLE_PLUGINS) 351 #if defined(ENABLE_PLUGINS)
381 for (size_t i = 0; i < arraysize(kPredefinedAllowedCameraDeviceOrigins); ++i) 352 for (size_t i = 0; i < arraysize(kPredefinedAllowedCameraDeviceOrigins); ++i)
382 allowed_camera_device_origins_.insert( 353 allowed_camera_device_origins_.insert(
383 kPredefinedAllowedCameraDeviceOrigins[i]); 354 kPredefinedAllowedCameraDeviceOrigins[i]);
384 for (size_t i = 0; i < arraysize(kPredefinedAllowedCompositorOrigins); ++i) 355 for (size_t i = 0; i < arraysize(kPredefinedAllowedCompositorOrigins); ++i)
385 allowed_compositor_origins_.insert(kPredefinedAllowedCompositorOrigins[i]); 356 allowed_compositor_origins_.insert(kPredefinedAllowedCompositorOrigins[i]);
386 #endif 357 #endif
387 } 358 }
388 359
389 ChromeContentRendererClient::~ChromeContentRendererClient() { 360 ChromeContentRendererClient::~ChromeContentRendererClient() {
390 g_current_client = NULL;
391 } 361 }
392 362
393 void ChromeContentRendererClient::RenderThreadStarted() { 363 void ChromeContentRendererClient::RenderThreadStarted() {
394 RenderThread* thread = RenderThread::Get(); 364 RenderThread* thread = RenderThread::Get();
395 365
396 chrome_observer_.reset(new ChromeRenderProcessObserver()); 366 chrome_observer_.reset(new ChromeRenderProcessObserver());
397 web_cache_observer_.reset(new web_cache::WebCacheRenderProcessObserver()); 367 web_cache_observer_.reset(new web_cache::WebCacheRenderProcessObserver());
398 368
399 #if defined(ENABLE_EXTENSIONS) 369 #if defined(ENABLE_EXTENSIONS)
400 extension_dispatcher_delegate_.reset( 370 ChromeExtensionsRendererClient::GetInstance()->RenderThreadStarted();
401 new ChromeExtensionsDispatcherDelegate());
402 // ChromeRenderViewTest::SetUp() creates its own ExtensionDispatcher and
403 // injects it using SetExtensionDispatcher(). Don't overwrite it.
404 if (!extension_dispatcher_) {
405 extension_dispatcher_.reset(
406 new extensions::Dispatcher(extension_dispatcher_delegate_.get()));
407 }
408 permissions_policy_delegate_.reset(
409 new extensions::RendererPermissionsPolicyDelegate(
410 extension_dispatcher_.get()));
411 resource_request_policy_.reset(
412 new extensions::ResourceRequestPolicy(extension_dispatcher_.get()));
413 guest_view_container_dispatcher_.reset(
414 new extensions::ExtensionsGuestViewContainerDispatcher());
415 #endif 371 #endif
416 372
417 prescient_networking_dispatcher_.reset( 373 prescient_networking_dispatcher_.reset(
418 new network_hints::PrescientNetworkingDispatcher()); 374 new network_hints::PrescientNetworkingDispatcher());
419 #if defined(ENABLE_SPELLCHECK) 375 #if defined(ENABLE_SPELLCHECK)
420 // ChromeRenderViewTest::SetUp() creates a Spellcheck and injects it using 376 // ChromeRenderViewTest::SetUp() creates a Spellcheck and injects it using
421 // SetSpellcheck(). Don't overwrite it. 377 // SetSpellcheck(). Don't overwrite it.
422 if (!spellcheck_) { 378 if (!spellcheck_) {
423 spellcheck_.reset(new SpellCheck()); 379 spellcheck_.reset(new SpellCheck());
424 thread->AddObserver(spellcheck_.get()); 380 thread->AddObserver(spellcheck_.get());
425 } 381 }
426 #endif 382 #endif
427 visited_link_slave_.reset(new visitedlink::VisitedLinkSlave()); 383 visited_link_slave_.reset(new visitedlink::VisitedLinkSlave());
428 #if defined(FULL_SAFE_BROWSING) 384 #if defined(FULL_SAFE_BROWSING)
429 phishing_classifier_.reset(safe_browsing::PhishingClassifierFilter::Create()); 385 phishing_classifier_.reset(safe_browsing::PhishingClassifierFilter::Create());
430 #endif 386 #endif
431 prerender_dispatcher_.reset(new prerender::PrerenderDispatcher()); 387 prerender_dispatcher_.reset(new prerender::PrerenderDispatcher());
432 #if defined(ENABLE_WEBRTC) 388 #if defined(ENABLE_WEBRTC)
433 webrtc_logging_message_filter_ = new WebRtcLoggingMessageFilter( 389 webrtc_logging_message_filter_ = new WebRtcLoggingMessageFilter(
434 RenderThread::Get()->GetIOMessageLoopProxy()); 390 thread->GetIOMessageLoopProxy());
435 #endif 391 #endif
436 392
437 thread->AddObserver(chrome_observer_.get()); 393 thread->AddObserver(chrome_observer_.get());
438 thread->AddObserver(web_cache_observer_.get()); 394 thread->AddObserver(web_cache_observer_.get());
439 #if defined(ENABLE_EXTENSIONS)
440 thread->AddObserver(extension_dispatcher_.get());
441 thread->AddObserver(guest_view_container_dispatcher_.get());
442 #endif
443 #if defined(FULL_SAFE_BROWSING) 395 #if defined(FULL_SAFE_BROWSING)
444 thread->AddObserver(phishing_classifier_.get()); 396 thread->AddObserver(phishing_classifier_.get());
445 #endif 397 #endif
446 thread->AddObserver(visited_link_slave_.get()); 398 thread->AddObserver(visited_link_slave_.get());
447 thread->AddObserver(prerender_dispatcher_.get()); 399 thread->AddObserver(prerender_dispatcher_.get());
448 thread->AddObserver(SearchBouncer::GetInstance()); 400 thread->AddObserver(SearchBouncer::GetInstance());
449 401
450 #if defined(ENABLE_WEBRTC) 402 #if defined(ENABLE_WEBRTC)
451 thread->AddFilter(webrtc_logging_message_filter_.get()); 403 thread->AddFilter(webrtc_logging_message_filter_.get());
452 #endif 404 #endif
453 #if defined(ENABLE_EXTENSIONS)
454 thread->AddFilter(new CastIPCDispatcher(
455 RenderThread::Get()->GetIOMessageLoopProxy()));
456 #endif
457 405
458 thread->RegisterExtension(extensions_v8::ExternalExtension::Get()); 406 thread->RegisterExtension(extensions_v8::ExternalExtension::Get());
459 thread->RegisterExtension(extensions_v8::LoadTimesExtension::Get()); 407 thread->RegisterExtension(extensions_v8::LoadTimesExtension::Get());
460 408
461 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); 409 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
462 if (command_line->HasSwitch(switches::kEnableBenchmarking)) 410 if (command_line->HasSwitch(switches::kEnableBenchmarking))
463 thread->RegisterExtension(extensions_v8::BenchmarkingExtension::Get()); 411 thread->RegisterExtension(extensions_v8::BenchmarkingExtension::Get());
464 if (command_line->HasSwitch(switches::kEnableNetBenchmarking)) 412 if (command_line->HasSwitch(switches::kEnableNetBenchmarking))
465 thread->RegisterExtension(extensions_v8::NetBenchmarkingExtension::Get()); 413 thread->RegisterExtension(extensions_v8::NetBenchmarkingExtension::Get());
466 if (command_line->HasSwitch(switches::kInstantProcess)) 414 if (command_line->HasSwitch(switches::kInstantProcess))
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 469
522 void ChromeContentRendererClient::RenderFrameCreated( 470 void ChromeContentRendererClient::RenderFrameCreated(
523 content::RenderFrame* render_frame) { 471 content::RenderFrame* render_frame) {
524 new ChromeRenderFrameObserver(render_frame); 472 new ChromeRenderFrameObserver(render_frame);
525 473
526 bool should_whitelist_for_content_settings = 474 bool should_whitelist_for_content_settings =
527 base::CommandLine::ForCurrentProcess()->HasSwitch( 475 base::CommandLine::ForCurrentProcess()->HasSwitch(
528 switches::kInstantProcess); 476 switches::kInstantProcess);
529 extensions::Dispatcher* ext_dispatcher = NULL; 477 extensions::Dispatcher* ext_dispatcher = NULL;
530 #if defined(ENABLE_EXTENSIONS) 478 #if defined(ENABLE_EXTENSIONS)
531 ext_dispatcher = extension_dispatcher_.get(); 479 ext_dispatcher =
480 ChromeExtensionsRendererClient::GetInstance()->extension_dispatcher();
532 #endif 481 #endif
533 ContentSettingsObserver* content_settings = new ContentSettingsObserver( 482 ContentSettingsObserver* content_settings = new ContentSettingsObserver(
534 render_frame, ext_dispatcher, should_whitelist_for_content_settings); 483 render_frame, ext_dispatcher, should_whitelist_for_content_settings);
535 if (chrome_observer_.get()) { 484 if (chrome_observer_.get()) {
536 content_settings->SetContentSettingRules( 485 content_settings->SetContentSettingRules(
537 chrome_observer_->content_setting_rules()); 486 chrome_observer_->content_setting_rules());
538 } 487 }
539 488
540 #if defined(ENABLE_EXTENSIONS) 489 #if defined(ENABLE_EXTENSIONS)
541 new extensions::ExtensionsRenderFrameObserver(render_frame); 490 ChromeExtensionsRendererClient::GetInstance()->RenderFrameCreated(
542 new extensions::ExtensionFrameHelper(render_frame, ext_dispatcher); 491 render_frame);
543 ext_dispatcher->OnRenderFrameCreated(render_frame);
544 #endif 492 #endif
545 493
546 #if defined(ENABLE_PLUGINS) 494 #if defined(ENABLE_PLUGINS)
547 new PepperHelper(render_frame); 495 new PepperHelper(render_frame);
548 #endif 496 #endif
549 497
550 #if !defined(DISABLE_NACL) 498 #if !defined(DISABLE_NACL)
551 new nacl::NaClHelper(render_frame); 499 new nacl::NaClHelper(render_frame);
552 #endif 500 #endif
553 501
(...skipping 21 matching lines...) Expand all
575 PasswordAutofillAgent* password_autofill_agent = 523 PasswordAutofillAgent* password_autofill_agent =
576 new PasswordAutofillAgent(render_frame); 524 new PasswordAutofillAgent(render_frame);
577 PasswordGenerationAgent* password_generation_agent = 525 PasswordGenerationAgent* password_generation_agent =
578 new PasswordGenerationAgent(render_frame, password_autofill_agent); 526 new PasswordGenerationAgent(render_frame, password_autofill_agent);
579 new AutofillAgent(render_frame, password_autofill_agent, 527 new AutofillAgent(render_frame, password_autofill_agent,
580 password_generation_agent); 528 password_generation_agent);
581 } 529 }
582 530
583 void ChromeContentRendererClient::RenderViewCreated( 531 void ChromeContentRendererClient::RenderViewCreated(
584 content::RenderView* render_view) { 532 content::RenderView* render_view) {
585
586 #if defined(ENABLE_EXTENSIONS) 533 #if defined(ENABLE_EXTENSIONS)
587 new extensions::ExtensionHelper(render_view, extension_dispatcher_.get()); 534 ChromeExtensionsRendererClient::GetInstance()->RenderViewCreated(render_view);
588 #endif 535 #endif
589 new PageLoadHistograms(render_view); 536 new PageLoadHistograms(render_view);
590 #if defined(ENABLE_PRINTING) 537 #if defined(ENABLE_PRINTING)
591 new printing::PrintWebViewHelper( 538 new printing::PrintWebViewHelper(
592 render_view, 539 render_view,
593 scoped_ptr<printing::PrintWebViewHelper::Delegate>( 540 scoped_ptr<printing::PrintWebViewHelper::Delegate>(
594 new ChromePrintWebViewHelperDelegate())); 541 new ChromePrintWebViewHelperDelegate()));
595 #endif 542 #endif
596 #if defined(ENABLE_SPELLCHECK) 543 #if defined(ENABLE_SPELLCHECK)
597 new SpellCheckProvider(render_view, spellcheck_.get()); 544 new SpellCheckProvider(render_view, spellcheck_.get());
(...skipping 16 matching lines...) Expand all
614 SkBitmap* ChromeContentRendererClient::GetSadPluginBitmap() { 561 SkBitmap* ChromeContentRendererClient::GetSadPluginBitmap() {
615 return const_cast<SkBitmap*>(ResourceBundle::GetSharedInstance(). 562 return const_cast<SkBitmap*>(ResourceBundle::GetSharedInstance().
616 GetImageNamed(IDR_SAD_PLUGIN).ToSkBitmap()); 563 GetImageNamed(IDR_SAD_PLUGIN).ToSkBitmap());
617 } 564 }
618 565
619 SkBitmap* ChromeContentRendererClient::GetSadWebViewBitmap() { 566 SkBitmap* ChromeContentRendererClient::GetSadWebViewBitmap() {
620 return const_cast<SkBitmap*>(ResourceBundle::GetSharedInstance(). 567 return const_cast<SkBitmap*>(ResourceBundle::GetSharedInstance().
621 GetImageNamed(IDR_SAD_WEBVIEW).ToSkBitmap()); 568 GetImageNamed(IDR_SAD_WEBVIEW).ToSkBitmap());
622 } 569 }
623 570
624 #if defined(ENABLE_EXTENSIONS)
625 const Extension* ChromeContentRendererClient::GetExtensionByOrigin(
626 const WebSecurityOrigin& origin) const {
627 if (!base::EqualsASCII(base::StringPiece16(origin.protocol()),
628 extensions::kExtensionScheme))
629 return NULL;
630
631 const std::string extension_id = origin.host().utf8().data();
632 return extensions::RendererExtensionRegistry::Get()->GetByID(extension_id);
633 }
634 #endif
635
636 bool ChromeContentRendererClient::OverrideCreatePlugin( 571 bool ChromeContentRendererClient::OverrideCreatePlugin(
637 content::RenderFrame* render_frame, 572 content::RenderFrame* render_frame,
638 blink::WebLocalFrame* frame, 573 blink::WebLocalFrame* frame,
639 const WebPluginParams& params, 574 const WebPluginParams& params,
640 WebPlugin** plugin) { 575 WebPlugin** plugin) {
641 std::string orig_mime_type = params.mimeType.utf8(); 576 std::string orig_mime_type = params.mimeType.utf8();
642 #if defined(ENABLE_EXTENSIONS) 577 #if defined(ENABLE_EXTENSIONS)
643 if (orig_mime_type == content::kBrowserPluginMimeType) { 578 if (!ChromeExtensionsRendererClient::GetInstance()->OverrideCreatePlugin(
644 bool guest_view_api_available = false; 579 render_frame, params)) {
645 extension_dispatcher_->script_context_set().ForEach( 580 return false;
646 render_frame, base::Bind(&IsGuestViewApiAvailableToScriptContext,
647 &guest_view_api_available));
648 if (guest_view_api_available)
649 return false;
650 } 581 }
651 #endif 582 #endif
652 583
653 GURL url(params.url); 584 GURL url(params.url);
654 #if defined(ENABLE_PLUGINS) 585 #if defined(ENABLE_PLUGINS)
655 ChromeViewHostMsg_GetPluginInfo_Output output; 586 ChromeViewHostMsg_GetPluginInfo_Output output;
656 WebString top_origin = frame->top()->securityOrigin().toString(); 587 WebString top_origin = frame->top()->securityOrigin().toString();
657 render_frame->Send(new ChromeViewHostMsg_GetPluginInfo( 588 render_frame->Send(new ChromeViewHostMsg_GetPluginInfo(
658 render_frame->GetRoutingID(), url, GURL(top_origin), orig_mime_type, 589 render_frame->GetRoutingID(), url, GURL(top_origin), orig_mime_type,
659 &output)); 590 &output));
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
1183 AllowTimerSuspensionWhenProcessBackgrounded() { 1114 AllowTimerSuspensionWhenProcessBackgrounded() {
1184 #if defined(OS_ANDROID) 1115 #if defined(OS_ANDROID)
1185 return true; 1116 return true;
1186 #else 1117 #else
1187 return false; 1118 return false;
1188 #endif 1119 #endif
1189 } 1120 }
1190 1121
1191 bool ChromeContentRendererClient::AllowPopup() { 1122 bool ChromeContentRendererClient::AllowPopup() {
1192 #if defined(ENABLE_EXTENSIONS) 1123 #if defined(ENABLE_EXTENSIONS)
1193 extensions::ScriptContext* current_context = 1124 return ChromeExtensionsRendererClient::GetInstance()->AllowPopup();
1194 extension_dispatcher_->script_context_set().GetCurrent(); 1125 #else
1195 if (!current_context || !current_context->extension()) 1126 return false;
1196 return false;
1197 // See http://crbug.com/117446 for the subtlety of this check.
1198 switch (current_context->context_type()) {
1199 case extensions::Feature::UNSPECIFIED_CONTEXT:
1200 case extensions::Feature::WEB_PAGE_CONTEXT:
1201 case extensions::Feature::UNBLESSED_EXTENSION_CONTEXT:
1202 case extensions::Feature::WEBUI_CONTEXT:
1203 case extensions::Feature::SERVICE_WORKER_CONTEXT:
1204 return false;
1205 case extensions::Feature::BLESSED_EXTENSION_CONTEXT:
1206 case extensions::Feature::CONTENT_SCRIPT_CONTEXT:
1207 return true;
1208 case extensions::Feature::BLESSED_WEB_PAGE_CONTEXT:
1209 return !current_context->web_frame()->parent();
1210 }
1211 NOTREACHED();
1212 #endif 1127 #endif
1213 return false;
1214 } 1128 }
1215 1129
1216 bool ChromeContentRendererClient::ShouldFork(blink::WebLocalFrame* frame, 1130 bool ChromeContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
1217 const GURL& url, 1131 const GURL& url,
1218 const std::string& http_method, 1132 const std::string& http_method,
1219 bool is_initial_navigation, 1133 bool is_initial_navigation,
1220 bool is_server_redirect, 1134 bool is_server_redirect,
1221 bool* send_referrer) { 1135 bool* send_referrer) {
1222 DCHECK(!frame->parent()); 1136 DCHECK(!frame->parent());
1223 1137
(...skipping 20 matching lines...) Expand all
1244 // to swap in the prerendered page on the browser process. If the prerendered 1158 // to swap in the prerendered page on the browser process. If the prerendered
1245 // page no longer exists by the time the OpenURL IPC is handled, a normal 1159 // page no longer exists by the time the OpenURL IPC is handled, a normal
1246 // navigation is attempted. 1160 // navigation is attempted.
1247 if (prerender_dispatcher_.get() && 1161 if (prerender_dispatcher_.get() &&
1248 prerender_dispatcher_->IsPrerenderURL(url)) { 1162 prerender_dispatcher_->IsPrerenderURL(url)) {
1249 *send_referrer = true; 1163 *send_referrer = true;
1250 return true; 1164 return true;
1251 } 1165 }
1252 1166
1253 #if defined(ENABLE_EXTENSIONS) 1167 #if defined(ENABLE_EXTENSIONS)
1254 const extensions::RendererExtensionRegistry* extension_registry = 1168 bool should_fork = ChromeExtensionsRendererClient::ShouldFork(
1255 extensions::RendererExtensionRegistry::Get(); 1169 frame, url, is_initial_navigation, is_server_redirect, send_referrer);
1256 1170 if (should_fork)
1257 // Determine if the new URL is an extension (excluding bookmark apps).
1258 const Extension* new_url_extension = extensions::GetNonBookmarkAppExtension(
1259 *extension_registry->GetMainThreadExtensionSet(), url);
1260 bool is_extension_url = !!new_url_extension;
1261
1262 // If the navigation would cross an app extent boundary, we also need
1263 // to defer to the browser to ensure process isolation. This is not necessary
1264 // for server redirects, which will be transferred to a new process by the
1265 // browser process when they are ready to commit. It is necessary for client
1266 // redirects, which won't be transferred in the same way.
1267 if (!is_server_redirect &&
1268 CrossesExtensionExtents(frame, url, is_extension_url,
1269 is_initial_navigation)) {
1270 // Include the referrer in this case since we're going from a hosted web
1271 // page. (the packaged case is handled previously by the extension
1272 // navigation test)
1273 *send_referrer = true;
1274
1275 const Extension* extension =
1276 extension_registry->GetExtensionOrAppByURL(url);
1277 if (extension && extension->is_app()) {
1278 extensions::RecordAppLaunchType(
1279 extension_misc::APP_LAUNCH_CONTENT_NAVIGATION, extension->GetType());
1280 }
1281 return true; 1171 return true;
1282 }
1283
1284 // If this is a reload, check whether it has the wrong process type. We
1285 // should send it to the browser if it's an extension URL (e.g., hosted app)
1286 // in a normal process, or if it's a process for an extension that has been
1287 // uninstalled. Without --site-per-process mode, we never fork processes for
1288 // subframes, so this check only makes sense for top-level frames.
1289 // TODO(alexmos,nasko): Figure out how this check should work when reloading
1290 // subframes in --site-per-process mode.
1291 if (!frame->parent() && frame->document().url() == url) {
1292 if (is_extension_url != IsStandaloneExtensionProcess())
1293 return true;
1294 }
1295 #endif // defined(ENABLE_EXTENSIONS) 1172 #endif // defined(ENABLE_EXTENSIONS)
1296 1173
1297 return false; 1174 return false;
1298 } 1175 }
1299 1176
1300 bool ChromeContentRendererClient::WillSendRequest( 1177 bool ChromeContentRendererClient::WillSendRequest(
1301 blink::WebFrame* frame, 1178 blink::WebFrame* frame,
1302 ui::PageTransition transition_type, 1179 ui::PageTransition transition_type,
1303 const GURL& url, 1180 const GURL& url,
1304 const GURL& first_party_for_cookies, 1181 const GURL& first_party_for_cookies,
1305 GURL* new_url) { 1182 GURL* new_url) {
1306 // Check whether the request should be allowed. If not allowed, we reset the 1183 // Check whether the request should be allowed. If not allowed, we reset the
1307 // URL to something invalid to prevent the request and cause an error. 1184 // URL to something invalid to prevent the request and cause an error.
1308 #if defined(ENABLE_EXTENSIONS) 1185 #if defined(ENABLE_EXTENSIONS)
1309 if (url.SchemeIs(extensions::kExtensionScheme) && 1186 if (ChromeExtensionsRendererClient::GetInstance()->WillSendRequest(
1310 !resource_request_policy_->CanRequestResource(url, frame, 1187 frame, transition_type, url, new_url)) {
1311 transition_type)) {
1312 *new_url = GURL(chrome::kExtensionInvalidRequestURL);
1313 return true;
1314 }
1315
1316 if (url.SchemeIs(extensions::kExtensionResourceScheme) &&
1317 !resource_request_policy_->CanRequestExtensionResourceScheme(url,
1318 frame)) {
1319 *new_url = GURL(chrome::kExtensionResourceInvalidRequestURL);
1320 return true; 1188 return true;
1321 } 1189 }
1322 #endif 1190 #endif
1323 1191
1324 const content::RenderView* render_view = 1192 const content::RenderView* render_view =
1325 content::RenderView::FromWebView(frame->view()); 1193 content::RenderView::FromWebView(frame->view());
1326 SearchBox* search_box = SearchBox::Get(render_view); 1194 SearchBox* search_box = SearchBox::Get(render_view);
1327 if (search_box && url.SchemeIs(chrome::kChromeSearchScheme)) { 1195 if (search_box && url.SchemeIs(chrome::kChromeSearchScheme)) {
1328 SearchBox::ImageSourceType type = SearchBox::NONE; 1196 SearchBox::ImageSourceType type = SearchBox::NONE;
1329 if (url.host() == chrome::kChromeUIFaviconHost) 1197 if (url.host() == chrome::kChromeUIFaviconHost)
1330 type = SearchBox::FAVICON; 1198 type = SearchBox::FAVICON;
1331 else if (url.host() == chrome::kChromeUILargeIconHost) 1199 else if (url.host() == chrome::kChromeUILargeIconHost)
1332 type = SearchBox::LARGE_ICON; 1200 type = SearchBox::LARGE_ICON;
1333 else if (url.host() == chrome::kChromeUIFallbackIconHost) 1201 else if (url.host() == chrome::kChromeUIFallbackIconHost)
1334 type = SearchBox::FALLBACK_ICON; 1202 type = SearchBox::FALLBACK_ICON;
1335 else if (url.host() == chrome::kChromeUIThumbnailHost) 1203 else if (url.host() == chrome::kChromeUIThumbnailHost)
1336 type = SearchBox::THUMB; 1204 type = SearchBox::THUMB;
1205
1337 if (type != SearchBox::NONE) 1206 if (type != SearchBox::NONE)
1338 return search_box->GenerateImageURLFromTransientURL(url, type, new_url); 1207 return search_box->GenerateImageURLFromTransientURL(url, type, new_url);
1339 } 1208 }
1340 1209
1341 return false; 1210 return false;
1342 } 1211 }
1343 1212
1344 unsigned long long ChromeContentRendererClient::VisitedLinkHash( 1213 unsigned long long ChromeContentRendererClient::VisitedLinkHash(
1345 const char* canonical_url, size_t length) { 1214 const char* canonical_url, size_t length) {
1346 return visited_link_slave_->ComputeURLFingerprint(canonical_url, length); 1215 return visited_link_slave_->ComputeURLFingerprint(canonical_url, length);
(...skipping 11 matching lines...) Expand all
1358 bool ChromeContentRendererClient::ShouldOverridePageVisibilityState( 1227 bool ChromeContentRendererClient::ShouldOverridePageVisibilityState(
1359 const content::RenderFrame* render_frame, 1228 const content::RenderFrame* render_frame,
1360 blink::WebPageVisibilityState* override_state) { 1229 blink::WebPageVisibilityState* override_state) {
1361 if (!prerender::PrerenderHelper::IsPrerendering(render_frame)) 1230 if (!prerender::PrerenderHelper::IsPrerendering(render_frame))
1362 return false; 1231 return false;
1363 1232
1364 *override_state = blink::WebPageVisibilityStatePrerender; 1233 *override_state = blink::WebPageVisibilityStatePrerender;
1365 return true; 1234 return true;
1366 } 1235 }
1367 1236
1368 #if defined(ENABLE_EXTENSIONS)
1369 void ChromeContentRendererClient::SetExtensionDispatcherForTest(
1370 extensions::Dispatcher* extension_dispatcher) {
1371 extension_dispatcher_.reset(extension_dispatcher);
1372 permissions_policy_delegate_.reset(
1373 new extensions::RendererPermissionsPolicyDelegate(
1374 extension_dispatcher_.get()));
1375 RenderThread::Get()->RegisterExtension(
1376 extensions::SafeBuiltins::CreateV8Extension());
1377 }
1378
1379 extensions::Dispatcher*
1380 ChromeContentRendererClient::GetExtensionDispatcherForTest() {
1381 return extension_dispatcher_.get();
1382 }
1383
1384 bool ChromeContentRendererClient::CrossesExtensionExtents(
1385 blink::WebLocalFrame* frame,
1386 const GURL& new_url,
1387 bool is_extension_url,
1388 bool is_initial_navigation) {
1389 DCHECK(!frame->parent());
1390 GURL old_url(frame->document().url());
1391
1392 extensions::RendererExtensionRegistry* extension_registry =
1393 extensions::RendererExtensionRegistry::Get();
1394
1395 // If old_url is still empty and this is an initial navigation, then this is
1396 // a window.open operation. We should look at the opener URL. Note that the
1397 // opener is a local frame in this case.
1398 if (is_initial_navigation && old_url.is_empty() && frame->opener()) {
1399 WebLocalFrame* opener_frame = frame->opener()->toWebLocalFrame();
1400
1401 // If we're about to open a normal web page from a same-origin opener stuck
1402 // in an extension process, we want to keep it in process to allow the
1403 // opener to script it.
1404 WebDocument opener_document = opener_frame->document();
1405 WebSecurityOrigin opener_origin = opener_document.securityOrigin();
1406 bool opener_is_extension_url = !opener_origin.isUnique() &&
1407 extension_registry->GetExtensionOrAppByURL(
1408 opener_document.url()) != NULL;
1409 if (!is_extension_url &&
1410 !opener_is_extension_url &&
1411 IsStandaloneExtensionProcess() &&
1412 opener_origin.canRequest(WebURL(new_url)))
1413 return false;
1414
1415 // In all other cases, we want to compare against the URL that determines
1416 // the type of process. In default Chrome, that's the URL of the opener's
1417 // top frame and not the opener frame itself. In --site-per-process, we
1418 // can use the opener frame itself.
1419 // TODO(nick): Either wire this up to SiteIsolationPolicy, or to state on
1420 // |opener_frame|/its ancestors.
1421 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1422 switches::kSitePerProcess) ||
1423 base::CommandLine::ForCurrentProcess()->HasSwitch(
1424 switches::kIsolateExtensions))
1425 old_url = opener_frame->document().url();
1426 else
1427 old_url = opener_frame->top()->document().url();
1428 }
1429
1430 // Only consider keeping non-app URLs in an app process if this window
1431 // has an opener (in which case it might be an OAuth popup that tries to
1432 // script an iframe within the app).
1433 bool should_consider_workaround = !!frame->opener();
1434
1435 return extensions::CrossesExtensionProcessBoundary(
1436 *extension_registry->GetMainThreadExtensionSet(), old_url, new_url,
1437 should_consider_workaround);
1438 }
1439 #endif // defined(ENABLE_EXTENSIONS)
1440
1441 #if defined(ENABLE_SPELLCHECK) 1237 #if defined(ENABLE_SPELLCHECK)
1442 void ChromeContentRendererClient::SetSpellcheck(SpellCheck* spellcheck) { 1238 void ChromeContentRendererClient::SetSpellcheck(SpellCheck* spellcheck) {
1443 RenderThread* thread = RenderThread::Get(); 1239 RenderThread* thread = RenderThread::Get();
1444 if (spellcheck_.get() && thread) 1240 if (spellcheck_.get() && thread)
1445 thread->RemoveObserver(spellcheck_.get()); 1241 thread->RemoveObserver(spellcheck_.get());
1446 spellcheck_.reset(spellcheck); 1242 spellcheck_.reset(spellcheck);
1447 SpellCheckReplacer replacer(spellcheck_.get()); 1243 SpellCheckReplacer replacer(spellcheck_.get());
1448 content::RenderView::ForEach(&replacer); 1244 content::RenderView::ForEach(&replacer);
1449 if (thread) 1245 if (thread)
1450 thread->AddObserver(spellcheck_.get()); 1246 thread->AddObserver(spellcheck_.get());
1451 } 1247 }
1452 #endif 1248 #endif
1453 1249
1454 // static
1455 bool ChromeContentRendererClient::WasWebRequestUsedBySomeExtensions() {
1456 #if defined(ENABLE_EXTENSIONS)
1457 return g_current_client->extension_dispatcher_
1458 ->WasWebRequestUsedBySomeExtensions();
1459 #else
1460 return false;
1461 #endif
1462 }
1463
1464 const void* ChromeContentRendererClient::CreatePPAPIInterface( 1250 const void* ChromeContentRendererClient::CreatePPAPIInterface(
1465 const std::string& interface_name) { 1251 const std::string& interface_name) {
1466 #if defined(ENABLE_PLUGINS) && !defined(DISABLE_NACL) 1252 #if defined(ENABLE_PLUGINS) && !defined(DISABLE_NACL)
1467 if (interface_name == PPB_NACL_PRIVATE_INTERFACE) 1253 if (interface_name == PPB_NACL_PRIVATE_INTERFACE)
1468 return nacl::GetNaClPrivateInterface(); 1254 return nacl::GetNaClPrivateInterface();
1469 #endif 1255 #endif
1470 return NULL; 1256 return NULL;
1471 } 1257 }
1472 1258
1473 bool ChromeContentRendererClient::IsExternalPepperPlugin( 1259 bool ChromeContentRendererClient::IsExternalPepperPlugin(
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 return false; 1389 return false;
1604 #endif 1390 #endif
1605 } 1391 }
1606 1392
1607 content::BrowserPluginDelegate* 1393 content::BrowserPluginDelegate*
1608 ChromeContentRendererClient::CreateBrowserPluginDelegate( 1394 ChromeContentRendererClient::CreateBrowserPluginDelegate(
1609 content::RenderFrame* render_frame, 1395 content::RenderFrame* render_frame,
1610 const std::string& mime_type, 1396 const std::string& mime_type,
1611 const GURL& original_url) { 1397 const GURL& original_url) {
1612 #if defined(ENABLE_EXTENSIONS) 1398 #if defined(ENABLE_EXTENSIONS)
1613 if (mime_type == content::kBrowserPluginMimeType) { 1399 return ChromeExtensionsRendererClient::CreateBrowserPluginDelegate(
1614 return new extensions::ExtensionsGuestViewContainer(render_frame); 1400 render_frame, mime_type, original_url);
1615 } else {
1616 return new extensions::MimeHandlerViewContainer(
1617 render_frame, mime_type, original_url);
1618 }
1619 #else 1401 #else
1620 return NULL; 1402 return nullptr;
1621 #endif 1403 #endif
1622 } 1404 }
1623 1405
1624 void ChromeContentRendererClient::RecordRappor(const std::string& metric, 1406 void ChromeContentRendererClient::RecordRappor(const std::string& metric,
1625 const std::string& sample) { 1407 const std::string& sample) {
1626 RenderThread::Get()->Send(new ChromeViewHostMsg_RecordRappor(metric, sample)); 1408 RenderThread::Get()->Send(new ChromeViewHostMsg_RecordRappor(metric, sample));
1627 } 1409 }
1628 1410
1629 void ChromeContentRendererClient::RecordRapporURL(const std::string& metric, 1411 void ChromeContentRendererClient::RecordRapporURL(const std::string& metric,
1630 const GURL& url) { 1412 const GURL& url) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 // chrome.system.network.getNetworkInterfaces provides the same 1458 // chrome.system.network.getNetworkInterfaces provides the same
1677 // information. Also, the enforcement of sending and binding UDP is already done 1459 // information. Also, the enforcement of sending and binding UDP is already done
1678 // by chrome extension permission model. 1460 // by chrome extension permission model.
1679 bool ChromeContentRendererClient::ShouldEnforceWebRTCRoutingPreferences() { 1461 bool ChromeContentRendererClient::ShouldEnforceWebRTCRoutingPreferences() {
1680 #if defined(ENABLE_EXTENSIONS) 1462 #if defined(ENABLE_EXTENSIONS)
1681 return !IsStandaloneExtensionProcess(); 1463 return !IsStandaloneExtensionProcess();
1682 #else 1464 #else
1683 return true; 1465 return true;
1684 #endif 1466 #endif
1685 } 1467 }
OLDNEW
« no previous file with comments | « chrome/renderer/chrome_content_renderer_client.h ('k') | chrome/renderer/extensions/chrome_extensions_renderer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698