OLD | NEW |
---|---|
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/content_settings_observer.h" | 5 #include "chrome/renderer/content_settings_observer.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "chrome/common/chrome_switches.h" | 9 #include "chrome/common/chrome_switches.h" |
10 #include "chrome/common/render_messages.h" | 10 #include "chrome/common/render_messages.h" |
11 #include "chrome/common/url_constants.h" | 11 #include "chrome/common/url_constants.h" |
12 #include "content/public/renderer/document_state.h" | 12 #include "content/public/renderer/document_state.h" |
13 #include "content/public/renderer/navigation_state.h" | 13 #include "content/public/renderer/navigation_state.h" |
14 #include "content/public/renderer/render_frame.h" | 14 #include "content/public/renderer/render_frame.h" |
15 #include "content/public/renderer/render_view.h" | 15 #include "content/public/renderer/render_view.h" |
16 #include "extensions/common/constants.h" | |
17 #include "extensions/common/extension.h" | |
18 #include "extensions/common/permissions/permissions_data.h" | |
19 #include "extensions/renderer/dispatcher.h" | |
20 #include "third_party/WebKit/public/platform/WebPermissionCallbacks.h" | 16 #include "third_party/WebKit/public/platform/WebPermissionCallbacks.h" |
21 #include "third_party/WebKit/public/platform/WebURL.h" | 17 #include "third_party/WebKit/public/platform/WebURL.h" |
22 #include "third_party/WebKit/public/web/WebDataSource.h" | 18 #include "third_party/WebKit/public/web/WebDataSource.h" |
23 #include "third_party/WebKit/public/web/WebDocument.h" | 19 #include "third_party/WebKit/public/web/WebDocument.h" |
24 #include "third_party/WebKit/public/web/WebFrame.h" | 20 #include "third_party/WebKit/public/web/WebFrame.h" |
25 #include "third_party/WebKit/public/web/WebFrameClient.h" | 21 #include "third_party/WebKit/public/web/WebFrameClient.h" |
26 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 22 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
27 #include "third_party/WebKit/public/web/WebView.h" | 23 #include "third_party/WebKit/public/web/WebView.h" |
28 | 24 |
29 #if defined(ENABLE_EXTENSIONS) | 25 #if defined(ENABLE_EXTENSIONS) |
30 #include "chrome/common/extensions/chrome_extension_messages.h" | 26 #include "chrome/common/extensions/chrome_extension_messages.h" |
27 #include "extensions/common/constants.h" | |
28 #include "extensions/common/extension.h" | |
29 #include "extensions/renderer/dispatcher.h" | |
31 #endif | 30 #endif |
32 | 31 |
33 using blink::WebDataSource; | 32 using blink::WebDataSource; |
34 using blink::WebDocument; | 33 using blink::WebDocument; |
35 using blink::WebFrame; | 34 using blink::WebFrame; |
36 using blink::WebPermissionCallbacks; | 35 using blink::WebPermissionCallbacks; |
37 using blink::WebSecurityOrigin; | 36 using blink::WebSecurityOrigin; |
38 using blink::WebString; | 37 using blink::WebString; |
39 using blink::WebURL; | 38 using blink::WebURL; |
40 using blink::WebView; | 39 using blink::WebView; |
41 using content::DocumentState; | 40 using content::DocumentState; |
42 using content::NavigationState; | 41 using content::NavigationState; |
43 using extensions::APIPermission; | |
44 | 42 |
45 namespace { | 43 namespace { |
46 | 44 |
47 enum { | 45 enum { |
48 INSECURE_CONTENT_DISPLAY = 0, | 46 INSECURE_CONTENT_DISPLAY = 0, |
49 INSECURE_CONTENT_DISPLAY_HOST_GOOGLE, | 47 INSECURE_CONTENT_DISPLAY_HOST_GOOGLE, |
50 INSECURE_CONTENT_DISPLAY_HOST_WWW_GOOGLE, | 48 INSECURE_CONTENT_DISPLAY_HOST_WWW_GOOGLE, |
51 INSECURE_CONTENT_DISPLAY_HTML, | 49 INSECURE_CONTENT_DISPLAY_HTML, |
52 INSECURE_CONTENT_RUN, | 50 INSECURE_CONTENT_RUN, |
53 INSECURE_CONTENT_RUN_HOST_GOOGLE, | 51 INSECURE_CONTENT_RUN_HOST_GOOGLE, |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
147 } | 145 } |
148 | 146 |
149 } // namespace | 147 } // namespace |
150 | 148 |
151 ContentSettingsObserver::ContentSettingsObserver( | 149 ContentSettingsObserver::ContentSettingsObserver( |
152 content::RenderFrame* render_frame, | 150 content::RenderFrame* render_frame, |
153 extensions::Dispatcher* extension_dispatcher) | 151 extensions::Dispatcher* extension_dispatcher) |
154 : content::RenderFrameObserver(render_frame), | 152 : content::RenderFrameObserver(render_frame), |
155 content::RenderFrameObserverTracker<ContentSettingsObserver>( | 153 content::RenderFrameObserverTracker<ContentSettingsObserver>( |
156 render_frame), | 154 render_frame), |
155 #if defined(ENABLE_EXTENSIONS) | |
157 extension_dispatcher_(extension_dispatcher), | 156 extension_dispatcher_(extension_dispatcher), |
157 #endif | |
158 allow_displaying_insecure_content_(false), | 158 allow_displaying_insecure_content_(false), |
159 allow_running_insecure_content_(false), | 159 allow_running_insecure_content_(false), |
160 content_setting_rules_(NULL), | 160 content_setting_rules_(NULL), |
161 is_interstitial_page_(false), | 161 is_interstitial_page_(false), |
162 npapi_plugins_blocked_(false), | 162 npapi_plugins_blocked_(false), |
163 current_request_id_(0) { | 163 current_request_id_(0) { |
164 ClearBlockedContentSettings(); | 164 ClearBlockedContentSettings(); |
165 render_frame->GetWebFrame()->setPermissionClient(this); | 165 render_frame->GetWebFrame()->setPermissionClient(this); |
166 | 166 |
167 if (render_frame->GetRenderView()->GetMainRenderFrame() != render_frame) { | 167 if (render_frame->GetRenderView()->GetMainRenderFrame() != render_frame) { |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
422 bool allowed = false; | 422 bool allowed = false; |
423 #if defined(ENABLE_EXTENSIONS) | 423 #if defined(ENABLE_EXTENSIONS) |
424 WebFrame* frame = render_frame()->GetWebFrame(); | 424 WebFrame* frame = render_frame()->GetWebFrame(); |
425 Send(new ChromeViewHostMsg_CanTriggerClipboardWrite( | 425 Send(new ChromeViewHostMsg_CanTriggerClipboardWrite( |
426 GURL(frame->document().securityOrigin().toString()), &allowed)); | 426 GURL(frame->document().securityOrigin().toString()), &allowed)); |
427 #endif | 427 #endif |
428 return allowed; | 428 return allowed; |
429 } | 429 } |
430 | 430 |
431 bool ContentSettingsObserver::allowMutationEvents(bool default_value) { | 431 bool ContentSettingsObserver::allowMutationEvents(bool default_value) { |
432 WebFrame* frame = render_frame()->GetWebFrame(); | 432 return IsPlatformApp() ? false : default_value; |
433 WebSecurityOrigin origin = frame->document().securityOrigin(); | |
434 const extensions::Extension* extension = GetExtension(origin); | |
435 if (extension && extension->is_platform_app()) | |
436 return false; | |
437 return default_value; | |
438 } | 433 } |
439 | 434 |
440 bool ContentSettingsObserver::allowPushState() { | 435 bool ContentSettingsObserver::allowPushState() { |
441 WebFrame* frame = render_frame()->GetWebFrame(); | 436 return !IsPlatformApp(); |
442 WebSecurityOrigin origin = frame->document().securityOrigin(); | |
443 const extensions::Extension* extension = GetExtension(origin); | |
444 return !extension || !extension->is_platform_app(); | |
445 } | 437 } |
446 | 438 |
447 static void SendInsecureContentSignal(int signal) { | 439 static void SendInsecureContentSignal(int signal) { |
448 UMA_HISTOGRAM_ENUMERATION("SSL.InsecureContent", signal, | 440 UMA_HISTOGRAM_ENUMERATION("SSL.InsecureContent", signal, |
449 INSECURE_CONTENT_NUM_EVENTS); | 441 INSECURE_CONTENT_NUM_EVENTS); |
450 } | 442 } |
451 | 443 |
452 bool ContentSettingsObserver::allowDisplayingInsecureContent( | 444 bool ContentSettingsObserver::allowDisplayingInsecureContent( |
453 bool allowed_per_settings, | 445 bool allowed_per_settings, |
454 const blink::WebSecurityOrigin& origin, | 446 const blink::WebSecurityOrigin& origin, |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
628 callbacks.doDeny(); | 620 callbacks.doDeny(); |
629 } | 621 } |
630 | 622 |
631 void ContentSettingsObserver::ClearBlockedContentSettings() { | 623 void ContentSettingsObserver::ClearBlockedContentSettings() { |
632 for (size_t i = 0; i < arraysize(content_blocked_); ++i) | 624 for (size_t i = 0; i < arraysize(content_blocked_); ++i) |
633 content_blocked_[i] = false; | 625 content_blocked_[i] = false; |
634 cached_storage_permissions_.clear(); | 626 cached_storage_permissions_.clear(); |
635 cached_script_permissions_.clear(); | 627 cached_script_permissions_.clear(); |
636 } | 628 } |
637 | 629 |
630 bool ContentSettingsObserver::IsPlatformApp() { | |
631 #if defined(ENABLE_EXTENSIONS) | |
632 WebFrame* frame = render_frame()->GetWebFrame(); | |
633 WebSecurityOrigin origin = frame->document().securityOrigin(); | |
634 const extensions::Extension* extension = GetExtension(origin); | |
Devlin
2014/08/12 23:16:12
Any reason to not save a couple ifdefs and just in
Lei Zhang
2014/08/12 23:18:06
It's already there and it's very obvious what it d
Devlin
2014/08/12 23:20:47
Yeah. I just think that ifdefs in general make co
| |
635 return extension && extension->is_platform_app(); | |
636 #else | |
637 return false; | |
638 #endif | |
639 } | |
640 | |
641 #if defined(ENABLE_EXTENSIONS) | |
638 const extensions::Extension* ContentSettingsObserver::GetExtension( | 642 const extensions::Extension* ContentSettingsObserver::GetExtension( |
639 const WebSecurityOrigin& origin) const { | 643 const WebSecurityOrigin& origin) const { |
640 if (!EqualsASCII(origin.protocol(), extensions::kExtensionScheme)) | 644 if (!EqualsASCII(origin.protocol(), extensions::kExtensionScheme)) |
641 return NULL; | 645 return NULL; |
642 | 646 |
643 const std::string extension_id = origin.host().utf8().data(); | 647 const std::string extension_id = origin.host().utf8().data(); |
644 if (!extension_dispatcher_->IsExtensionActive(extension_id)) | 648 if (!extension_dispatcher_->IsExtensionActive(extension_id)) |
645 return NULL; | 649 return NULL; |
646 | 650 |
647 return extension_dispatcher_->extensions()->GetByID(extension_id); | 651 return extension_dispatcher_->extensions()->GetByID(extension_id); |
648 } | 652 } |
653 #endif | |
649 | 654 |
650 bool ContentSettingsObserver::IsWhitelistedForContentSettings( | 655 bool ContentSettingsObserver::IsWhitelistedForContentSettings( |
651 content::RenderFrame* frame) { | 656 content::RenderFrame* frame) { |
652 // Whitelist Instant processes. | 657 // Whitelist Instant processes. |
653 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kInstantProcess)) | 658 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kInstantProcess)) |
654 return true; | 659 return true; |
655 | 660 |
656 // Whitelist ftp directory listings, as they require JavaScript to function | 661 // Whitelist ftp directory listings, as they require JavaScript to function |
657 // properly. | 662 // properly. |
658 if (frame->IsFTPDirectoryListing()) | 663 if (frame->IsFTPDirectoryListing()) |
(...skipping 12 matching lines...) Expand all Loading... | |
671 | 676 |
672 if (origin.isUnique()) | 677 if (origin.isUnique()) |
673 return false; // Uninitialized document? | 678 return false; // Uninitialized document? |
674 | 679 |
675 if (EqualsASCII(origin.protocol(), content::kChromeUIScheme)) | 680 if (EqualsASCII(origin.protocol(), content::kChromeUIScheme)) |
676 return true; // Browser UI elements should still work. | 681 return true; // Browser UI elements should still work. |
677 | 682 |
678 if (EqualsASCII(origin.protocol(), content::kChromeDevToolsScheme)) | 683 if (EqualsASCII(origin.protocol(), content::kChromeDevToolsScheme)) |
679 return true; // DevTools UI elements should still work. | 684 return true; // DevTools UI elements should still work. |
680 | 685 |
686 #if defined(ENABLE_EXTENSIONS) | |
681 if (EqualsASCII(origin.protocol(), extensions::kExtensionScheme)) | 687 if (EqualsASCII(origin.protocol(), extensions::kExtensionScheme)) |
682 return true; | 688 return true; |
689 #endif | |
683 | 690 |
684 // TODO(creis, fsamuel): Remove this once the concept of swapped out | 691 // TODO(creis, fsamuel): Remove this once the concept of swapped out |
685 // RenderFrames goes away. | 692 // RenderFrames goes away. |
686 if (document_url == GURL(content::kSwappedOutURL)) | 693 if (document_url == GURL(content::kSwappedOutURL)) |
687 return true; | 694 return true; |
688 | 695 |
689 // If the scheme is file:, an empty file name indicates a directory listing, | 696 // If the scheme is file:, an empty file name indicates a directory listing, |
690 // which requires JavaScript to function properly. | 697 // which requires JavaScript to function properly. |
691 if (EqualsASCII(origin.protocol(), url::kFileScheme)) { | 698 if (EqualsASCII(origin.protocol(), url::kFileScheme)) { |
692 return document_url.SchemeIs(url::kFileScheme) && | 699 return document_url.SchemeIs(url::kFileScheme) && |
693 document_url.ExtractFileName().empty(); | 700 document_url.ExtractFileName().empty(); |
694 } | 701 } |
695 | 702 |
696 return false; | 703 return false; |
697 } | 704 } |
OLD | NEW |