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

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

Issue 170733004: Avoid sync IPCs for FileSystem API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added missing early exit failure Created 6 years, 9 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/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 "chrome/renderer/extensions/dispatcher.h" 12 #include "chrome/renderer/extensions/dispatcher.h"
13 #include "content/public/renderer/document_state.h" 13 #include "content/public/renderer/document_state.h"
14 #include "content/public/renderer/navigation_state.h" 14 #include "content/public/renderer/navigation_state.h"
15 #include "content/public/renderer/render_frame.h" 15 #include "content/public/renderer/render_frame.h"
16 #include "content/public/renderer/render_view.h" 16 #include "content/public/renderer/render_view.h"
17 #include "extensions/common/constants.h" 17 #include "extensions/common/constants.h"
18 #include "third_party/WebKit/public/platform/WebPermissionCallbacks.h"
18 #include "third_party/WebKit/public/platform/WebURL.h" 19 #include "third_party/WebKit/public/platform/WebURL.h"
19 #include "third_party/WebKit/public/web/WebDataSource.h" 20 #include "third_party/WebKit/public/web/WebDataSource.h"
20 #include "third_party/WebKit/public/web/WebDocument.h" 21 #include "third_party/WebKit/public/web/WebDocument.h"
21 #include "third_party/WebKit/public/web/WebFrame.h" 22 #include "third_party/WebKit/public/web/WebFrame.h"
22 #include "third_party/WebKit/public/web/WebFrameClient.h" 23 #include "third_party/WebKit/public/web/WebFrameClient.h"
23 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" 24 #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
24 #include "third_party/WebKit/public/web/WebView.h" 25 #include "third_party/WebKit/public/web/WebView.h"
25 #include "webkit/child/weburlresponse_extradata_impl.h" 26 #include "webkit/child/weburlresponse_extradata_impl.h"
26 27
27 using blink::WebDataSource; 28 using blink::WebDataSource;
28 using blink::WebDocument; 29 using blink::WebDocument;
29 using blink::WebFrame; 30 using blink::WebFrame;
30 using blink::WebFrameClient; 31 using blink::WebFrameClient;
32 using blink::WebPermissionCallbacks;
31 using blink::WebSecurityOrigin; 33 using blink::WebSecurityOrigin;
32 using blink::WebString; 34 using blink::WebString;
33 using blink::WebURL; 35 using blink::WebURL;
34 using blink::WebView; 36 using blink::WebView;
35 using content::DocumentState; 37 using content::DocumentState;
36 using content::NavigationState; 38 using content::NavigationState;
37 using extensions::APIPermission; 39 using extensions::APIPermission;
38 40
39 namespace { 41 namespace {
40 42
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 content::RenderFrame* render_frame, 148 content::RenderFrame* render_frame,
147 extensions::Dispatcher* extension_dispatcher) 149 extensions::Dispatcher* extension_dispatcher)
148 : content::RenderFrameObserver(render_frame), 150 : content::RenderFrameObserver(render_frame),
149 content::RenderFrameObserverTracker<ContentSettingsObserver>( 151 content::RenderFrameObserverTracker<ContentSettingsObserver>(
150 render_frame), 152 render_frame),
151 extension_dispatcher_(extension_dispatcher), 153 extension_dispatcher_(extension_dispatcher),
152 allow_displaying_insecure_content_(false), 154 allow_displaying_insecure_content_(false),
153 allow_running_insecure_content_(false), 155 allow_running_insecure_content_(false),
154 content_setting_rules_(NULL), 156 content_setting_rules_(NULL),
155 is_interstitial_page_(false), 157 is_interstitial_page_(false),
156 npapi_plugins_blocked_(false) { 158 npapi_plugins_blocked_(false),
159 current_request_id_(0) {
157 ClearBlockedContentSettings(); 160 ClearBlockedContentSettings();
158 render_frame->GetWebFrame()->setPermissionClient(this); 161 render_frame->GetWebFrame()->setPermissionClient(this);
159 } 162 }
160 163
161 ContentSettingsObserver::~ContentSettingsObserver() { 164 ContentSettingsObserver::~ContentSettingsObserver() {
162 } 165 }
163 166
164 void ContentSettingsObserver::SetContentSettingRules( 167 void ContentSettingsObserver::SetContentSettingRules(
165 const RendererContentSettingRules* content_setting_rules) { 168 const RendererContentSettingRules* content_setting_rules) {
166 content_setting_rules_ = content_setting_rules; 169 content_setting_rules_ = content_setting_rules;
(...skipping 20 matching lines...) Expand all
187 bool ContentSettingsObserver::OnMessageReceived(const IPC::Message& message) { 190 bool ContentSettingsObserver::OnMessageReceived(const IPC::Message& message) {
188 bool handled = true; 191 bool handled = true;
189 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) 192 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message)
190 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAsInterstitial, OnSetAsInterstitial) 193 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAsInterstitial, OnSetAsInterstitial)
191 IPC_MESSAGE_HANDLER(ChromeViewMsg_NPAPINotSupported, OnNPAPINotSupported) 194 IPC_MESSAGE_HANDLER(ChromeViewMsg_NPAPINotSupported, OnNPAPINotSupported)
192 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowDisplayingInsecureContent, 195 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowDisplayingInsecureContent,
193 OnSetAllowDisplayingInsecureContent) 196 OnSetAllowDisplayingInsecureContent)
194 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent, 197 IPC_MESSAGE_HANDLER(ChromeViewMsg_SetAllowRunningInsecureContent,
195 OnSetAllowRunningInsecureContent) 198 OnSetAllowRunningInsecureContent)
196 IPC_MESSAGE_HANDLER(ChromeViewMsg_ReloadFrame, OnReloadFrame); 199 IPC_MESSAGE_HANDLER(ChromeViewMsg_ReloadFrame, OnReloadFrame);
200 IPC_MESSAGE_HANDLER(ChromeViewMsg_RequestFileSystemAccessResponse,
201 OnRequestFileSystemAccessResponse)
197 IPC_MESSAGE_UNHANDLED(handled = false) 202 IPC_MESSAGE_UNHANDLED(handled = false)
198 IPC_END_MESSAGE_MAP() 203 IPC_END_MESSAGE_MAP()
199 if (handled) 204 if (handled)
200 return true; 205 return true;
201 206
202 // Don't swallow LoadBlockedPlugins messages, as they're sent to every 207 // Don't swallow LoadBlockedPlugins messages, as they're sent to every
203 // blocked plugin. 208 // blocked plugin.
204 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) 209 IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message)
205 IPC_MESSAGE_HANDLER(ChromeViewMsg_LoadBlockedPlugins, OnLoadBlockedPlugins) 210 IPC_MESSAGE_HANDLER(ChromeViewMsg_LoadBlockedPlugins, OnLoadBlockedPlugins)
206 IPC_END_MESSAGE_MAP() 211 IPC_END_MESSAGE_MAP()
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 frame->top()->document().securityOrigin().isUnique()) 259 frame->top()->document().securityOrigin().isUnique())
255 return false; 260 return false;
256 261
257 bool result = false; 262 bool result = false;
258 Send(new ChromeViewHostMsg_AllowFileSystem( 263 Send(new ChromeViewHostMsg_AllowFileSystem(
259 routing_id(), GURL(frame->document().securityOrigin().toString()), 264 routing_id(), GURL(frame->document().securityOrigin().toString()),
260 GURL(frame->top()->document().securityOrigin().toString()), &result)); 265 GURL(frame->top()->document().securityOrigin().toString()), &result));
261 return result; 266 return result;
262 } 267 }
263 268
269 void ContentSettingsObserver::requestFileSystemAccess(
270 WebFrame* frame, const WebPermissionCallbacks& callbacks) {
271 ++current_request_id_;
272 std::pair<PermissionRequestMap::iterator, bool> insert_result =
273 permission_requests_.insert(
274 std::make_pair(current_request_id_, callbacks));
275
276 // Verify there are no duplicate insertions.
277 DCHECK(insert_result.second);
278
279 if (frame->document().securityOrigin().isUnique() ||
280 frame->top()->document().securityOrigin().isUnique()) {
281 insert_result.first->second.doDeny();
282 permission_requests_.erase(insert_result.first);
kinuko 2014/03/07 08:22:29 I feel this could be checked before you insert the
283 return;
284 }
285
286 Send(new ChromeViewHostMsg_RequestFileSystemAccess(
287 routing_id(),
288 current_request_id_,
289 GURL(frame->document().securityOrigin().toString()),
290 GURL(frame->top()->document().securityOrigin().toString())));
291 }
292
264 bool ContentSettingsObserver::allowImage(WebFrame* frame, 293 bool ContentSettingsObserver::allowImage(WebFrame* frame,
265 bool enabled_per_settings, 294 bool enabled_per_settings,
266 const WebURL& image_url) { 295 const WebURL& image_url) {
267 bool allow = enabled_per_settings; 296 bool allow = enabled_per_settings;
268 if (enabled_per_settings) { 297 if (enabled_per_settings) {
269 if (is_interstitial_page_) 298 if (is_interstitial_page_)
270 return true; 299 return true;
271 if (IsWhitelistedForContentSettings(frame)) 300 if (IsWhitelistedForContentSettings(frame))
272 return true; 301 return true;
273 302
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 allow_running_insecure_content_ = allow; 611 allow_running_insecure_content_ = allow;
583 OnSetAllowDisplayingInsecureContent(allow); 612 OnSetAllowDisplayingInsecureContent(allow);
584 } 613 }
585 614
586 void ContentSettingsObserver::OnReloadFrame() { 615 void ContentSettingsObserver::OnReloadFrame() {
587 DCHECK(!render_frame()->GetWebFrame()->parent()) << 616 DCHECK(!render_frame()->GetWebFrame()->parent()) <<
588 "Should only be called on the main frame"; 617 "Should only be called on the main frame";
589 render_frame()->GetWebFrame()->reload(); 618 render_frame()->GetWebFrame()->reload();
590 } 619 }
591 620
621 void ContentSettingsObserver::OnRequestFileSystemAccessResponse(int request_id,
622 bool allowed) {
623 PermissionRequestMap::iterator it = permission_requests_.find(request_id);
624 if (it == permission_requests_.end())
625 return;
626
627 WebPermissionCallbacks callbacks = it->second;
628 permission_requests_.erase(it);
629
630 if (allowed) {
631 callbacks.doAllow();
632 return;
633 }
634 callbacks.doDeny();
635 }
636
592 void ContentSettingsObserver::ClearBlockedContentSettings() { 637 void ContentSettingsObserver::ClearBlockedContentSettings() {
593 for (size_t i = 0; i < arraysize(content_blocked_); ++i) 638 for (size_t i = 0; i < arraysize(content_blocked_); ++i)
594 content_blocked_[i] = false; 639 content_blocked_[i] = false;
595 cached_storage_permissions_.clear(); 640 cached_storage_permissions_.clear();
596 cached_script_permissions_.clear(); 641 cached_script_permissions_.clear();
597 } 642 }
598 643
599 const extensions::Extension* ContentSettingsObserver::GetExtension( 644 const extensions::Extension* ContentSettingsObserver::GetExtension(
600 const WebSecurityOrigin& origin) const { 645 const WebSecurityOrigin& origin) const {
601 if (!EqualsASCII(origin.protocol(), extensions::kExtensionScheme)) 646 if (!EqualsASCII(origin.protocol(), extensions::kExtensionScheme))
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 694
650 // If the scheme is file:, an empty file name indicates a directory listing, 695 // If the scheme is file:, an empty file name indicates a directory listing,
651 // which requires JavaScript to function properly. 696 // which requires JavaScript to function properly.
652 if (EqualsASCII(origin.protocol(), content::kFileScheme)) { 697 if (EqualsASCII(origin.protocol(), content::kFileScheme)) {
653 return document_url.SchemeIs(content::kFileScheme) && 698 return document_url.SchemeIs(content::kFileScheme) &&
654 document_url.ExtractFileName().empty(); 699 document_url.ExtractFileName().empty();
655 } 700 }
656 701
657 return false; 702 return false;
658 } 703 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698