15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_RENDERER_CONTENT_SETTINGS_OBSERVER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_RENDERER_CONTENT_SETTINGS_OBSERVER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/content_settings/core/common/content_settings_types.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer_tracker.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPermissionClient.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebFrame; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebSecurityOrigin; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebURL; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions { 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Dispatcher; 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Extension; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Handles blocking content per content settings for each RenderFrame. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingsObserver 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : public content::RenderFrameObserver, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public content::RenderFrameObserverTracker<ContentSettingsObserver>, 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public blink::WebPermissionClient { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ContentSettingsObserver(content::RenderFrame* render_frame, 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::Dispatcher* extension_dispatcher); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ContentSettingsObserver(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the content setting rules which back |AllowImage()|, |AllowScript()|, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and |AllowScriptFromSource()|. |content_setting_rules| must outlive this 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |ContentSettingsObserver|. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetContentSettingRules( 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RendererContentSettingRules* content_setting_rules); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsPluginTemporarilyAllowed(const std::string& identifier); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends an IPC notification that the specified content type was blocked. 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void DidBlockContentType(ContentSettingsType settings_type); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // blink::WebPermissionClient implementation. 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual bool allowDatabase(const blink::WebString& name, 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const blink::WebString& display_name, 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unsigned long estimated_size) OVERRIDE; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void requestFileSystemAccessAsync( 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const blink::WebPermissionCallbacks& callbacks) OVERRIDE; 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual bool allowImage(bool enabled_per_settings, 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const blink::WebURL& image_url) OVERRIDE; 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual bool allowIndexedDB(const blink::WebString& name, 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const blink::WebSecurityOrigin& origin) OVERRIDE; 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowPlugins(bool enabled_per_settings) OVERRIDE; 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowScript(bool enabled_per_settings) OVERRIDE; 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual bool allowScriptFromSource(bool enabled_per_settings, 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const blink::WebURL& script_url) OVERRIDE; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowStorage(bool local) OVERRIDE; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowReadFromClipboard(bool default_value) OVERRIDE; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowWriteToClipboard(bool default_value) OVERRIDE; 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowMutationEvents(bool default_value) OVERRIDE; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool allowPushState() OVERRIDE; 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void didNotAllowPlugins() OVERRIDE; 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void didNotAllowScript() OVERRIDE; 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual bool allowDisplayingInsecureContent( 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool allowed_per_settings, 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const blink::WebSecurityOrigin& context, 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const blink::WebURL& url) OVERRIDE; 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual bool allowRunningInsecureContent( 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool allowed_per_settings, 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const blink::WebSecurityOrigin& context, 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const blink::WebURL& url) OVERRIDE; 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This is used for cases when the NPAPI plugins malfunction if used. 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool AreNPAPIPluginsBlocked() const; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ContentSettingsObserverTest, WhitelistedSchemes); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ChromeRenderViewTest, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsInterstitialPages); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ChromeRenderViewTest, PluginsTemporarilyAllowed); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // RenderFrameObserver implementation. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void DidCommitProvisionalLoad(bool is_new_navigation) OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnLoadBlockedPlugins(const std::string& identifier); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSetAsInterstitial(); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnNPAPINotSupported(); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnSetAllowDisplayingInsecureContent(bool allow); 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnSetAllowRunningInsecureContent(bool allow); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void OnReloadFrame(); 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void OnRequestFileSystemAccessAsyncResponse(int request_id, bool allowed); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resets the |content_blocked_| array. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ClearBlockedContentSettings(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Whether the observed RenderFrame is for a platform app. 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool IsPlatformApp(); 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |origin| corresponds to an installed extension, returns that extension. 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Otherwise returns NULL. 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::Extension* GetExtension( 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebSecurityOrigin& origin) const; 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helpers. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if |frame| contains content that is white-listed for content settings. 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static bool IsWhitelistedForContentSettings(content::RenderFrame* frame); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsWhitelistedForContentSettings( 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebSecurityOrigin& origin, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& document_url); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Owned by ChromeContentRendererClient and outlive us. 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::Dispatcher* extension_dispatcher_; 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Insecure content may be permitted for the duration of this render view. 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool allow_displaying_insecure_content_; 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool allow_running_insecure_content_; 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A pointer to content setting rules stored by the renderer. Normally, the 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |RendererContentSettingRules| object is owned by 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |ChromeRenderProcessObserver|. In the tests it is owned by the caller of 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |SetContentSettingRules|. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RendererContentSettingRules* content_setting_rules_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Stores if images, scripts, and plugins have actually been blocked. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool content_blocked_[CONTENT_SETTINGS_NUM_TYPES]; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Caches the result of AllowStorage. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<GURL, bool> StoragePermissionsKey; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<StoragePermissionsKey, bool> cached_storage_permissions_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Caches the result of |AllowScript|. 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::map<blink::WebFrame*, bool> cached_script_permissions_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string> temporarily_allowed_plugins_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_interstitial_page_; 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool npapi_plugins_blocked_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int current_request_id_; 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) typedef std::map<int, blink::WebPermissionCallbacks> PermissionRequestMap; 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PermissionRequestMap permission_requests_; 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ContentSettingsObserver); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_RENDERER_CONTENT_SETTINGS_OBSERVER_H_ 160