| 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 "chrome/common/render_messages.h" | 7 #include "chrome/common/render_messages.h" |
| 8 #include "chrome/common/ssl_insecure_content.h" | 8 #include "chrome/common/ssl_insecure_content.h" |
| 9 #include "content/public/common/url_constants.h" | 9 #include "content/public/common/url_constants.h" |
| 10 #include "content/public/renderer/document_state.h" | 10 #include "content/public/renderer/document_state.h" |
| 11 #include "content/public/renderer/render_frame.h" | 11 #include "content/public/renderer/render_frame.h" |
| 12 #include "content/public/renderer/render_view.h" | 12 #include "content/public/renderer/render_view.h" |
| 13 #include "extensions/features/features.h" | 13 #include "extensions/features/features.h" |
| 14 #include "services/service_manager/public/cpp/interface_registry.h" |
| 14 #include "third_party/WebKit/public/platform/URLConversion.h" | 15 #include "third_party/WebKit/public/platform/URLConversion.h" |
| 15 #include "third_party/WebKit/public/platform/WebContentSettingCallbacks.h" | 16 #include "third_party/WebKit/public/platform/WebContentSettingCallbacks.h" |
| 16 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 17 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
| 17 #include "third_party/WebKit/public/platform/WebURL.h" | 18 #include "third_party/WebKit/public/platform/WebURL.h" |
| 18 #include "third_party/WebKit/public/web/WebDataSource.h" | 19 #include "third_party/WebKit/public/web/WebDataSource.h" |
| 19 #include "third_party/WebKit/public/web/WebDocument.h" | 20 #include "third_party/WebKit/public/web/WebDocument.h" |
| 20 #include "third_party/WebKit/public/web/WebFrameClient.h" | 21 #include "third_party/WebKit/public/web/WebFrameClient.h" |
| 21 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 22 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 22 #include "third_party/WebKit/public/web/WebView.h" | 23 #include "third_party/WebKit/public/web/WebView.h" |
| 23 #include "url/origin.h" | 24 #include "url/origin.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 extension_dispatcher_(extension_dispatcher), | 98 extension_dispatcher_(extension_dispatcher), |
| 98 #endif | 99 #endif |
| 99 allow_running_insecure_content_(false), | 100 allow_running_insecure_content_(false), |
| 100 content_setting_rules_(NULL), | 101 content_setting_rules_(NULL), |
| 101 is_interstitial_page_(false), | 102 is_interstitial_page_(false), |
| 102 current_request_id_(0), | 103 current_request_id_(0), |
| 103 should_whitelist_(should_whitelist) { | 104 should_whitelist_(should_whitelist) { |
| 104 ClearBlockedContentSettings(); | 105 ClearBlockedContentSettings(); |
| 105 render_frame->GetWebFrame()->setContentSettingsClient(this); | 106 render_frame->GetWebFrame()->setContentSettingsClient(this); |
| 106 | 107 |
| 108 render_frame->GetInterfaceRegistry()->AddInterface( |
| 109 base::Bind(&ContentSettingsObserver::OnInsecureContentRendererRequest, |
| 110 base::Unretained(this))); |
| 111 |
| 107 content::RenderFrame* main_frame = | 112 content::RenderFrame* main_frame = |
| 108 render_frame->GetRenderView()->GetMainRenderFrame(); | 113 render_frame->GetRenderView()->GetMainRenderFrame(); |
| 109 // TODO(nasko): The main frame is not guaranteed to be in the same process | 114 // TODO(nasko): The main frame is not guaranteed to be in the same process |
| 110 // with this frame with --site-per-process. This code needs to be updated | 115 // with this frame with --site-per-process. This code needs to be updated |
| 111 // to handle this case. See https://crbug.com/496670. | 116 // to handle this case. See https://crbug.com/496670. |
| 112 if (main_frame && main_frame != render_frame) { | 117 if (main_frame && main_frame != render_frame) { |
| 113 // Copy all the settings from the main render frame to avoid race conditions | 118 // Copy all the settings from the main render frame to avoid race conditions |
| 114 // when initializing this data. See https://crbug.com/333308. | 119 // when initializing this data. See https://crbug.com/333308. |
| 115 ContentSettingsObserver* parent = ContentSettingsObserver::Get(main_frame); | 120 ContentSettingsObserver* parent = ContentSettingsObserver::Get(main_frame); |
| 116 allow_running_insecure_content_ = parent->allow_running_insecure_content_; | 121 allow_running_insecure_content_ = parent->allow_running_insecure_content_; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 blocked = true; | 156 blocked = true; |
| 152 Send(new ChromeViewHostMsg_ContentBlocked(routing_id(), settings_type, | 157 Send(new ChromeViewHostMsg_ContentBlocked(routing_id(), settings_type, |
| 153 details)); | 158 details)); |
| 154 } | 159 } |
| 155 } | 160 } |
| 156 | 161 |
| 157 bool ContentSettingsObserver::OnMessageReceived(const IPC::Message& message) { | 162 bool ContentSettingsObserver::OnMessageReceived(const IPC::Message& message) { |
| 158 bool handled = true; | 163 bool handled = true; |
| 159 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) | 164 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) |
| 160 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAsInterstitial, OnSetAsInterstitial) | 165 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAsInterstitial, OnSetAsInterstitial) |
| 161 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent, | |
| 162 OnSetAllowRunningInsecureContent) | |
| 163 IPC_MESSAGE_HANDLER(ChromeViewMsg_ReloadFrame, OnReloadFrame); | |
| 164 IPC_MESSAGE_HANDLER(ChromeViewMsg_RequestFileSystemAccessAsyncResponse, | 166 IPC_MESSAGE_HANDLER(ChromeViewMsg_RequestFileSystemAccessAsyncResponse, |
| 165 OnRequestFileSystemAccessAsyncResponse) | 167 OnRequestFileSystemAccessAsyncResponse) |
| 166 IPC_MESSAGE_UNHANDLED(handled = false) | 168 IPC_MESSAGE_UNHANDLED(handled = false) |
| 167 IPC_END_MESSAGE_MAP() | 169 IPC_END_MESSAGE_MAP() |
| 168 if (handled) | 170 if (handled) |
| 169 return true; | 171 return true; |
| 170 | 172 |
| 171 // Don't swallow LoadBlockedPlugins messages, as they're sent to every | 173 // Don't swallow LoadBlockedPlugins messages, as they're sent to every |
| 172 // blocked plugin. | 174 // blocked plugin. |
| 173 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) | 175 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 198 // If we start failing this DCHECK, please makes sure we don't regress | 200 // If we start failing this DCHECK, please makes sure we don't regress |
| 199 // this bug: http://code.google.com/p/chromium/issues/detail?id=79304 | 201 // this bug: http://code.google.com/p/chromium/issues/detail?id=79304 |
| 200 DCHECK(frame->document().getSecurityOrigin().toString() == "null" || | 202 DCHECK(frame->document().getSecurityOrigin().toString() == "null" || |
| 201 !url.SchemeIs(url::kDataScheme)); | 203 !url.SchemeIs(url::kDataScheme)); |
| 202 } | 204 } |
| 203 | 205 |
| 204 void ContentSettingsObserver::OnDestruct() { | 206 void ContentSettingsObserver::OnDestruct() { |
| 205 delete this; | 207 delete this; |
| 206 } | 208 } |
| 207 | 209 |
| 210 void ContentSettingsObserver::SetAllowRunningInsecureContent( |
| 211 bool allow, |
| 212 bool reload_frame) { |
| 213 allow_running_insecure_content_ = allow; |
| 214 if (reload_frame) { |
| 215 DCHECK(!render_frame()->GetWebFrame()->parent()) |
| 216 << "Should only be called on the main frame"; |
| 217 render_frame()->GetWebFrame()->reload( |
| 218 blink::WebFrameLoadType::ReloadMainResource); |
| 219 } |
| 220 } |
| 221 |
| 222 void ContentSettingsObserver::OnInsecureContentRendererRequest( |
| 223 chrome::mojom::InsecureContentRendererRequest request) { |
| 224 insecure_content_renderer_bindings_.AddBinding(this, std::move(request)); |
| 225 } |
| 226 |
| 208 bool ContentSettingsObserver::allowDatabase(const WebString& name, | 227 bool ContentSettingsObserver::allowDatabase(const WebString& name, |
| 209 const WebString& display_name, | 228 const WebString& display_name, |
| 210 unsigned estimated_size) { | 229 unsigned estimated_size) { |
| 211 WebFrame* frame = render_frame()->GetWebFrame(); | 230 WebFrame* frame = render_frame()->GetWebFrame(); |
| 212 if (frame->getSecurityOrigin().isUnique() || | 231 if (frame->getSecurityOrigin().isUnique() || |
| 213 frame->top()->getSecurityOrigin().isUnique()) | 232 frame->top()->getSecurityOrigin().isUnique()) |
| 214 return false; | 233 return false; |
| 215 | 234 |
| 216 bool result = false; | 235 bool result = false; |
| 217 Send(new ChromeViewHostMsg_AllowDatabase( | 236 Send(new ChromeViewHostMsg_AllowDatabase( |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 | 446 |
| 428 void ContentSettingsObserver::OnLoadBlockedPlugins( | 447 void ContentSettingsObserver::OnLoadBlockedPlugins( |
| 429 const std::string& identifier) { | 448 const std::string& identifier) { |
| 430 temporarily_allowed_plugins_.insert(identifier); | 449 temporarily_allowed_plugins_.insert(identifier); |
| 431 } | 450 } |
| 432 | 451 |
| 433 void ContentSettingsObserver::OnSetAsInterstitial() { | 452 void ContentSettingsObserver::OnSetAsInterstitial() { |
| 434 is_interstitial_page_ = true; | 453 is_interstitial_page_ = true; |
| 435 } | 454 } |
| 436 | 455 |
| 437 void ContentSettingsObserver::OnSetAllowRunningInsecureContent(bool allow) { | |
| 438 allow_running_insecure_content_ = allow; | |
| 439 } | |
| 440 | |
| 441 void ContentSettingsObserver::OnReloadFrame() { | |
| 442 DCHECK(!render_frame()->GetWebFrame()->parent()) << | |
| 443 "Should only be called on the main frame"; | |
| 444 render_frame()->GetWebFrame()->reload( | |
| 445 blink::WebFrameLoadType::ReloadMainResource); | |
| 446 } | |
| 447 | |
| 448 void ContentSettingsObserver::OnRequestFileSystemAccessAsyncResponse( | 456 void ContentSettingsObserver::OnRequestFileSystemAccessAsyncResponse( |
| 449 int request_id, | 457 int request_id, |
| 450 bool allowed) { | 458 bool allowed) { |
| 451 PermissionRequestMap::iterator it = permission_requests_.find(request_id); | 459 PermissionRequestMap::iterator it = permission_requests_.find(request_id); |
| 452 if (it == permission_requests_.end()) | 460 if (it == permission_requests_.end()) |
| 453 return; | 461 return; |
| 454 | 462 |
| 455 WebContentSettingCallbacks callbacks = it->second; | 463 WebContentSettingCallbacks callbacks = it->second; |
| 456 permission_requests_.erase(it); | 464 permission_requests_.erase(it); |
| 457 | 465 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 #endif | 538 #endif |
| 531 | 539 |
| 532 // If the scheme is file:, an empty file name indicates a directory listing, | 540 // If the scheme is file:, an empty file name indicates a directory listing, |
| 533 // which requires JavaScript to function properly. | 541 // which requires JavaScript to function properly. |
| 534 if (protocol == url::kFileScheme && | 542 if (protocol == url::kFileScheme && |
| 535 document_url.protocolIs(url::kFileScheme)) { | 543 document_url.protocolIs(url::kFileScheme)) { |
| 536 return GURL(document_url).ExtractFileName().empty(); | 544 return GURL(document_url).ExtractFileName().empty(); |
| 537 } | 545 } |
| 538 return false; | 546 return false; |
| 539 } | 547 } |
| OLD | NEW |