| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/url_constants.h" | 8 #include "chrome/common/url_constants.h" |
| 9 #include "content/public/renderer/document_state.h" | 9 #include "content/public/renderer/document_state.h" |
| 10 #include "content/public/renderer/navigation_state.h" | 10 #include "content/public/renderer/navigation_state.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 using WebKit::WebFrameClient; | 22 using WebKit::WebFrameClient; |
| 23 using WebKit::WebSecurityOrigin; | 23 using WebKit::WebSecurityOrigin; |
| 24 using WebKit::WebString; | 24 using WebKit::WebString; |
| 25 using WebKit::WebURL; | 25 using WebKit::WebURL; |
| 26 using WebKit::WebView; | 26 using WebKit::WebView; |
| 27 using content::DocumentState; | 27 using content::DocumentState; |
| 28 using content::NavigationState; | 28 using content::NavigationState; |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 // True if |frame| contains content that is white-listed for content settings. | |
| 33 static bool IsWhitelistedForContentSettings(WebFrame* frame) { | |
| 34 WebSecurityOrigin origin = frame->document().securityOrigin(); | |
| 35 if (origin.isUnique()) | |
| 36 return false; // Uninitialized document? | |
| 37 | |
| 38 if (EqualsASCII(origin.protocol(), chrome::kChromeUIScheme)) | |
| 39 return true; // Browser UI elements should still work. | |
| 40 | |
| 41 if (EqualsASCII(origin.protocol(), chrome::kChromeDevToolsScheme)) | |
| 42 return true; // DevTools UI elements should still work. | |
| 43 | |
| 44 // If the scheme is ftp: or file:, an empty file name indicates a directory | |
| 45 // listing, which requires JavaScript to function properly. | |
| 46 GURL document_url = frame->document().url(); | |
| 47 const char* kDirProtocols[] = { chrome::kFtpScheme, chrome::kFileScheme }; | |
| 48 for (size_t i = 0; i < arraysize(kDirProtocols); ++i) { | |
| 49 if (EqualsASCII(origin.protocol(), kDirProtocols[i])) { | |
| 50 return document_url.SchemeIs(kDirProtocols[i]) && | |
| 51 document_url.ExtractFileName().empty(); | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 return false; | |
| 56 } | |
| 57 | |
| 58 GURL GetOriginOrURL(const WebFrame* frame) { | 32 GURL GetOriginOrURL(const WebFrame* frame) { |
| 59 WebString top_origin = frame->top()->document().securityOrigin().toString(); | 33 WebString top_origin = frame->top()->document().securityOrigin().toString(); |
| 60 // The the |top_origin| is unique ("null") e.g., for file:// URLs. Use the | 34 // The the |top_origin| is unique ("null") e.g., for file:// URLs. Use the |
| 61 // document URL as the primary URL in those cases. | 35 // document URL as the primary URL in those cases. |
| 62 if (top_origin == "null") | 36 if (top_origin == "null") |
| 63 return frame->top()->document().url(); | 37 return frame->top()->document().url(); |
| 64 return GURL(top_origin); | 38 return GURL(top_origin); |
| 65 } | 39 } |
| 66 | 40 |
| 67 ContentSetting GetContentSettingFromRules( | 41 ContentSetting GetContentSettingFromRules( |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 void ContentSettingsObserver::OnLoadBlockedPlugins() { | 275 void ContentSettingsObserver::OnLoadBlockedPlugins() { |
| 302 plugins_temporarily_allowed_ = true; | 276 plugins_temporarily_allowed_ = true; |
| 303 } | 277 } |
| 304 | 278 |
| 305 void ContentSettingsObserver::ClearBlockedContentSettings() { | 279 void ContentSettingsObserver::ClearBlockedContentSettings() { |
| 306 for (size_t i = 0; i < arraysize(content_blocked_); ++i) | 280 for (size_t i = 0; i < arraysize(content_blocked_); ++i) |
| 307 content_blocked_[i] = false; | 281 content_blocked_[i] = false; |
| 308 cached_storage_permissions_.clear(); | 282 cached_storage_permissions_.clear(); |
| 309 cached_script_permissions_.clear(); | 283 cached_script_permissions_.clear(); |
| 310 } | 284 } |
| 285 |
| 286 bool ContentSettingsObserver::IsWhitelistedForContentSettings(WebFrame* frame) { |
| 287 return IsWhitelistedForContentSettings(frame->document().securityOrigin(), |
| 288 frame->document().url()); |
| 289 } |
| 290 |
| 291 bool ContentSettingsObserver::IsWhitelistedForContentSettings( |
| 292 const WebSecurityOrigin& origin, |
| 293 const GURL& document_url) { |
| 294 if (origin.isUnique()) |
| 295 return false; // Uninitialized document? |
| 296 |
| 297 if (EqualsASCII(origin.protocol(), chrome::kChromeUIScheme)) |
| 298 return true; // Browser UI elements should still work. |
| 299 |
| 300 if (EqualsASCII(origin.protocol(), chrome::kChromeDevToolsScheme)) |
| 301 return true; // DevTools UI elements should still work. |
| 302 |
| 303 if (EqualsASCII(origin.protocol(), chrome::kExtensionScheme)) |
| 304 return true; |
| 305 |
| 306 if (EqualsASCII(origin.protocol(), chrome::kChromeInternalScheme)) |
| 307 return true; |
| 308 |
| 309 // If the scheme is ftp: or file:, an empty file name indicates a directory |
| 310 // listing, which requires JavaScript to function properly. |
| 311 const char* kDirProtocols[] = { chrome::kFtpScheme, chrome::kFileScheme }; |
| 312 for (size_t i = 0; i < arraysize(kDirProtocols); ++i) { |
| 313 if (EqualsASCII(origin.protocol(), kDirProtocols[i])) { |
| 314 return document_url.SchemeIs(kDirProtocols[i]) && |
| 315 document_url.ExtractFileName().empty(); |
| 316 } |
| 317 } |
| 318 |
| 319 return false; |
| 320 } |
| OLD | NEW |