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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_TAB_SPECIFIC_CONTENT_SETTINGS_H_ 6 #define CHROME_BROWSER_CONTENT_SETTINGS_TAB_SPECIFIC_CONTENT_SETTINGS_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/observer_list.h" 14 #include "base/scoped_observer.h" 15 #include "chrome/browser/content_settings/content_settings_usages_state.h" 16 #include "chrome/browser/content_settings/local_shared_objects_container.h" 17 #include "chrome/browser/media/media_stream_devices_controller.h" 18 #include "chrome/common/custom_handlers/protocol_handler.h" 19 #include "components/content_settings/core/browser/content_settings_observer.h" 20 #include "components/content_settings/core/common/content_settings.h" 21 #include "components/content_settings/core/common/content_settings_types.h" 22 #include "content/public/browser/web_contents_observer.h" 23 #include "content/public/browser/web_contents_user_data.h" 24 #include "content/public/common/media_stream_request.h" 25 #include "net/cookies/canonical_cookie.h" 26 27 class CookiesTreeModel; 28 class HostContentSettingsMap; 29 class Profile; 30 31 namespace content { 32 class RenderViewHost; 33 } 34 35 namespace net { 36 class CookieOptions; 37 } 38 39 // This class manages state about permissions, content settings, cookies and 40 // site data for a specific WebContents. It tracks which content was accessed 41 // and which content was blocked. Based on this it provides information about 42 // which types of content were accessed and blocked. 43 class TabSpecificContentSettings 44 : public content::WebContentsObserver, 45 public content_settings::Observer, 46 public content::WebContentsUserData<TabSpecificContentSettings> { 47 public: 48 enum MicrophoneCameraState { 49 MICROPHONE_CAMERA_NOT_ACCESSED = 0, 50 MICROPHONE_ACCESSED, 51 CAMERA_ACCESSED, 52 MICROPHONE_CAMERA_ACCESSED, 53 MICROPHONE_BLOCKED, 54 CAMERA_BLOCKED, 55 MICROPHONE_CAMERA_BLOCKED, 56 }; 57 58 // Classes that want to be notified about site data events must implement 59 // this abstract class and add themselves as observer to the 60 // |TabSpecificContentSettings|. 61 class SiteDataObserver { 62 public: 63 explicit SiteDataObserver( 64 TabSpecificContentSettings* tab_specific_content_settings); 65 virtual ~SiteDataObserver(); 66 67 // Called whenever site data is accessed. 68 virtual void OnSiteDataAccessed() = 0; 69 70 TabSpecificContentSettings* tab_specific_content_settings() { 71 return tab_specific_content_settings_; 72 } 73 74 // Called when the TabSpecificContentSettings is destroyed; nulls out 75 // the local reference. 76 void ContentSettingsDestroyed(); 77 78 private: 79 TabSpecificContentSettings* tab_specific_content_settings_; 80 81 DISALLOW_COPY_AND_ASSIGN(SiteDataObserver); 82 }; 83 84 virtual ~TabSpecificContentSettings(); 85 86 // Returns the object given a render view's id. 87 static TabSpecificContentSettings* Get(int render_process_id, 88 int render_view_id); 89 90 // Returns the object given a render frame's id. 91 static TabSpecificContentSettings* GetForFrame(int render_process_id, 92 int render_view_id); 93 94 // Static methods called on the UI threads. 95 // Called when cookies for the given URL were read either from within the 96 // current page or while loading it. |blocked_by_policy| should be true, if 97 // reading cookies was blocked due to the user's content settings. In that 98 // case, this function should invoke OnContentBlocked. 99 // |is_for_blocking_resource| indicates whether the cookies read were for a 100 // blocking resource (eg script, css). It is only temporarily added for 101 // diagnostic purposes, per bug 353678. Will be removed again once data 102 // collection is finished. 103 static void CookiesRead(int render_process_id, 104 int render_frame_id, 105 const GURL& url, 106 const GURL& first_party_url, 107 const net::CookieList& cookie_list, 108 bool blocked_by_policy, 109 bool is_for_blocking_resource); 110 111 // Called when a specific cookie in the current page was changed. 112 // |blocked_by_policy| should be true, if the cookie was blocked due to the 113 // user's content settings. In that case, this function should invoke 114 // OnContentBlocked. 115 static void CookieChanged(int render_process_id, 116 int render_frame_id, 117 const GURL& url, 118 const GURL& first_party_url, 119 const std::string& cookie_line, 120 const net::CookieOptions& options, 121 bool blocked_by_policy); 122 123 // Called when a specific Web database in the current page was accessed. If 124 // access was blocked due to the user's content settings, 125 // |blocked_by_policy| should be true, and this function should invoke 126 // OnContentBlocked. 127 static void WebDatabaseAccessed(int render_process_id, 128 int render_frame_id, 129 const GURL& url, 130 const base::string16& name, 131 const base::string16& display_name, 132 bool blocked_by_policy); 133 134 // Called when a specific DOM storage area in the current page was 135 // accessed. If access was blocked due to the user's content settings, 136 // |blocked_by_policy| should be true, and this function should invoke 137 // OnContentBlocked. 138 static void DOMStorageAccessed(int render_process_id, 139 int render_frame_id, 140 const GURL& url, 141 bool local, 142 bool blocked_by_policy); 143 144 // Called when a specific indexed db factory in the current page was 145 // accessed. If access was blocked due to the user's content settings, 146 // |blocked_by_policy| should be true, and this function should invoke 147 // OnContentBlocked. 148 static void IndexedDBAccessed(int render_process_id, 149 int render_frame_id, 150 const GURL& url, 151 const base::string16& description, 152 bool blocked_by_policy); 153 154 // Called when a specific file system in the current page was accessed. 155 // If access was blocked due to the user's content settings, 156 // |blocked_by_policy| should be true, and this function should invoke 157 // OnContentBlocked. 158 static void FileSystemAccessed(int render_process_id, 159 int render_frame_id, 160 const GURL& url, 161 bool blocked_by_policy); 162 163 // Resets the |content_blocked_| and |content_allowed_| arrays, except for 164 // CONTENT_SETTINGS_TYPE_COOKIES related information. 165 void ClearBlockedContentSettingsExceptForCookies(); 166 167 // Resets all cookies related information. 168 void ClearCookieSpecificContentSettings(); 169 170 // Clears the Geolocation settings. 171 void ClearGeolocationContentSettings(); 172 173 // Clears the MIDI settings. 174 void ClearMidiContentSettings(); 175 176 // Changes the |content_blocked_| entry for popups. 177 void SetPopupsBlocked(bool blocked); 178 179 // Changes the |content_blocked_| entry for downloads. 180 void SetDownloadsBlocked(bool blocked); 181 182 // Updates Geolocation settings on navigation. 183 void GeolocationDidNavigate( 184 const content::LoadCommittedDetails& details); 185 186 // Updates MIDI settings on navigation. 187 void MidiDidNavigate(const content::LoadCommittedDetails& details); 188 189 // Returns whether a particular kind of content has been blocked for this 190 // page. 191 bool IsContentBlocked(ContentSettingsType content_type) const; 192 193 // Returns true if content blockage was indicated to the user. 194 bool IsBlockageIndicated(ContentSettingsType content_type) const; 195 196 void SetBlockageHasBeenIndicated(ContentSettingsType content_type); 197 198 // Returns whether a particular kind of content has been allowed. Currently 199 // only tracks cookies. 200 bool IsContentAllowed(ContentSettingsType content_type) const; 201 202 const GURL& media_stream_access_origin() const { 203 return media_stream_access_origin_; 204 } 205 206 const std::string& media_stream_requested_audio_device() const { 207 return media_stream_requested_audio_device_; 208 } 209 210 const std::string& media_stream_requested_video_device() const { 211 return media_stream_requested_video_device_; 212 } 213 214 // Returns the state of the camera and microphone usage. 215 MicrophoneCameraState GetMicrophoneCameraState() const; 216 217 // Returns the ContentSettingsUsagesState that controls the 218 // geolocation API usage on this page. 219 const ContentSettingsUsagesState& geolocation_usages_state() const { 220 return geolocation_usages_state_; 221 } 222 223 // Returns the ContentSettingsUsageState that controls the MIDI usage on 224 // this page. 225 const ContentSettingsUsagesState& midi_usages_state() const { 226 return midi_usages_state_; 227 } 228 229 // Call to indicate that there is a protocol handler pending user approval. 230 void set_pending_protocol_handler(const ProtocolHandler& handler) { 231 pending_protocol_handler_ = handler; 232 } 233 234 const ProtocolHandler& pending_protocol_handler() const { 235 return pending_protocol_handler_; 236 } 237 238 void ClearPendingProtocolHandler() { 239 pending_protocol_handler_ = ProtocolHandler::EmptyProtocolHandler(); 240 } 241 242 // Sets the previous protocol handler which will be replaced by the 243 // pending protocol handler. 244 void set_previous_protocol_handler(const ProtocolHandler& handler) { 245 previous_protocol_handler_ = handler; 246 } 247 248 const ProtocolHandler& previous_protocol_handler() const { 249 return previous_protocol_handler_; 250 } 251 252 // Set whether the setting for the pending handler is DEFAULT (ignore), 253 // ALLOW, or DENY. 254 void set_pending_protocol_handler_setting(ContentSetting setting) { 255 pending_protocol_handler_setting_ = setting; 256 } 257 258 ContentSetting pending_protocol_handler_setting() const { 259 return pending_protocol_handler_setting_; 260 } 261 262 263 // Returns a pointer to the |LocalSharedObjectsContainer| that contains all 264 // allowed local shared objects like cookies, local storage, ... . 265 const LocalSharedObjectsContainer& allowed_local_shared_objects() const { 266 return allowed_local_shared_objects_; 267 } 268 269 // Returns a pointer to the |LocalSharedObjectsContainer| that contains all 270 // blocked local shared objects like cookies, local storage, ... . 271 const LocalSharedObjectsContainer& blocked_local_shared_objects() const { 272 return blocked_local_shared_objects_; 273 } 274 275 bool load_plugins_link_enabled() { return load_plugins_link_enabled_; } 276 void set_load_plugins_link_enabled(bool enabled) { 277 load_plugins_link_enabled_ = enabled; 278 } 279 280 // Called to indicate whether access to the Pepper broker was allowed or 281 // blocked. 282 void SetPepperBrokerAllowed(bool allowed); 283 284 // content::WebContentsObserver overrides. 285 virtual void RenderFrameForInterstitialPageCreated( 286 content::RenderFrameHost* render_frame_host) OVERRIDE; 287 virtual bool OnMessageReceived( 288 const IPC::Message& message, 289 content::RenderFrameHost* render_frame_host) OVERRIDE; 290 virtual void DidNavigateMainFrame( 291 const content::LoadCommittedDetails& details, 292 const content::FrameNavigateParams& params) OVERRIDE; 293 virtual void DidStartProvisionalLoadForFrame( 294 content::RenderFrameHost* render_frame_host, 295 const GURL& validated_url, 296 bool is_error_page, 297 bool is_iframe_srcdoc) OVERRIDE; 298 virtual void AppCacheAccessed(const GURL& manifest_url, 299 bool blocked_by_policy) OVERRIDE; 300 301 // Message handlers. Public for testing. 302 void OnContentBlocked(ContentSettingsType type); 303 void OnContentAllowed(ContentSettingsType type); 304 305 // These methods are invoked on the UI thread by the static functions above. 306 // Public for testing. 307 void OnCookiesRead(const GURL& url, 308 const GURL& first_party_url, 309 const net::CookieList& cookie_list, 310 bool blocked_by_policy); 311 void OnCookieChanged(const GURL& url, 312 const GURL& first_party_url, 313 const std::string& cookie_line, 314 const net::CookieOptions& options, 315 bool blocked_by_policy); 316 void OnFileSystemAccessed(const GURL& url, 317 bool blocked_by_policy); 318 void OnIndexedDBAccessed(const GURL& url, 319 const base::string16& description, 320 bool blocked_by_policy); 321 void OnLocalStorageAccessed(const GURL& url, 322 bool local, 323 bool blocked_by_policy); 324 void OnWebDatabaseAccessed(const GURL& url, 325 const base::string16& name, 326 const base::string16& display_name, 327 bool blocked_by_policy); 328 void OnGeolocationPermissionSet(const GURL& requesting_frame, 329 bool allowed); 330 #if defined(OS_ANDROID) 331 void OnProtectedMediaIdentifierPermissionSet(const GURL& requesting_frame, 332 bool allowed); 333 #endif 334 335 // This method is called to update the status about the microphone and 336 // camera stream access. |request_permissions| contains a list of requested 337 // media stream types and the permission for each type. 338 void OnMediaStreamPermissionSet( 339 const GURL& request_origin, 340 const MediaStreamDevicesController::MediaStreamTypeSettingsMap& 341 request_permissions); 342 343 // There methods are called to update the status about MIDI access. 344 void OnMidiSysExAccessed(const GURL& reqesting_origin); 345 void OnMidiSysExAccessBlocked(const GURL& requesting_origin); 346 347 // Adds the given |SiteDataObserver|. The |observer| is notified when a 348 // locale shared object, like for example a cookie, is accessed. 349 void AddSiteDataObserver(SiteDataObserver* observer); 350 351 // Removes the given |SiteDataObserver|. 352 void RemoveSiteDataObserver(SiteDataObserver* observer); 353 354 private: 355 explicit TabSpecificContentSettings(content::WebContents* tab); 356 friend class content::WebContentsUserData<TabSpecificContentSettings>; 357 358 // content_settings::Observer implementation. 359 virtual void OnContentSettingChanged( 360 const ContentSettingsPattern& primary_pattern, 361 const ContentSettingsPattern& secondary_pattern, 362 ContentSettingsType content_type, 363 std::string resource_identifier) OVERRIDE; 364 365 // Notifies all registered |SiteDataObserver|s. 366 void NotifySiteDataObservers(); 367 368 // All currently registered |SiteDataObserver|s. 369 ObserverList<SiteDataObserver> observer_list_; 370 371 // Stores which content setting types actually have blocked content. 372 bool content_blocked_[CONTENT_SETTINGS_NUM_TYPES]; 373 374 // Stores if the blocked content was messaged to the user. 375 bool content_blockage_indicated_to_user_[CONTENT_SETTINGS_NUM_TYPES]; 376 377 // Stores which content setting types actually were allowed. 378 bool content_allowed_[CONTENT_SETTINGS_NUM_TYPES]; 379 380 // The profile of the tab. 381 Profile* profile_; 382 383 // Stores the blocked/allowed cookies. 384 LocalSharedObjectsContainer allowed_local_shared_objects_; 385 LocalSharedObjectsContainer blocked_local_shared_objects_; 386 387 // Manages information about Geolocation API usage in this page. 388 ContentSettingsUsagesState geolocation_usages_state_; 389 390 // Manages information about MIDI usages in this page. 391 ContentSettingsUsagesState midi_usages_state_; 392 393 // The pending protocol handler, if any. This can be set if 394 // registerProtocolHandler was invoked without user gesture. 395 // The |IsEmpty| method will be true if no protocol handler is 396 // pending registration. 397 ProtocolHandler pending_protocol_handler_; 398 399 // The previous protocol handler to be replaced by 400 // the pending_protocol_handler_, if there is one. Empty if 401 // there is no handler which would be replaced. 402 ProtocolHandler previous_protocol_handler_; 403 404 // The setting on the pending protocol handler registration. Persisted in case 405 // the user opens the bubble and makes changes multiple times. 406 ContentSetting pending_protocol_handler_setting_; 407 408 // Stores whether the user can load blocked plugins on this page. 409 bool load_plugins_link_enabled_; 410 411 // The origin of the media stream request. Note that we only support handling 412 // settings for one request per tab. The latest request's origin will be 413 // stored here. http://crbug.com/259794 414 GURL media_stream_access_origin_; 415 416 // The devices to be displayed in the media bubble when the media stream 417 // request is requesting certain specific devices. 418 std::string media_stream_requested_audio_device_; 419 std::string media_stream_requested_video_device_; 420 421 // Observer to watch for content settings changed. 422 ScopedObserver<HostContentSettingsMap, content_settings::Observer> observer_; 423 424 DISALLOW_COPY_AND_ASSIGN(TabSpecificContentSettings); 425 }; 426 427 #endif // CHROME_BROWSER_CONTENT_SETTINGS_TAB_SPECIFIC_CONTENT_SETTINGS_H_ 428