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.
5 #ifndef CHROME_BROWSER_CONTENT_SETTINGS_TAB_SPECIFIC_CONTENT_SETTINGS_H_
6 #define CHROME_BROWSER_CONTENT_SETTINGS_TAB_SPECIFIC_CONTENT_SETTINGS_H_
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_observer.h"
16 #include "chrome/browser/content_settings/content_settings_usages_state.h"
17 #include "chrome/browser/content_settings/local_shared_objects_container.h"
18 #include "chrome/browser/media/media_stream_devices_controller.h"
19 #include "chrome/common/content_settings.h"
20 #include "chrome/common/custom_handlers/protocol_handler.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"
27 class CookiesTreeModel
;
28 class HostContentSettingsMap
;
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
> {
48 enum MicrophoneCameraState
{
49 MICROPHONE_CAMERA_NOT_ACCESSED
= 0,
52 MICROPHONE_CAMERA_ACCESSED
,
55 MICROPHONE_CAMERA_BLOCKED
,
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
{
63 explicit SiteDataObserver(
64 TabSpecificContentSettings
* tab_specific_content_settings
);
65 virtual ~SiteDataObserver();
67 // Called whenever site data is accessed.
68 virtual void OnSiteDataAccessed() = 0;
70 TabSpecificContentSettings
* tab_specific_content_settings() {
71 return tab_specific_content_settings_
;
74 // Called when the TabSpecificContentSettings is destroyed; nulls out
75 // the local reference.
76 void ContentSettingsDestroyed();
79 TabSpecificContentSettings
* tab_specific_content_settings_
;
81 DISALLOW_COPY_AND_ASSIGN(SiteDataObserver
);
84 virtual ~TabSpecificContentSettings();
86 // Returns the object given a render view's id.
87 static TabSpecificContentSettings
* Get(int render_process_id
,
90 // Returns the object given a render frame's id.
91 static TabSpecificContentSettings
* GetForFrame(int render_process_id
,
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
,
106 const GURL
& first_party_url
,
107 const net::CookieList
& cookie_list
,
108 bool blocked_by_policy
,
109 bool is_for_blocking_resource
);
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
115 static void CookieChanged(int render_process_id
,
118 const GURL
& first_party_url
,
119 const std::string
& cookie_line
,
120 const net::CookieOptions
& options
,
121 bool blocked_by_policy
);
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
127 static void WebDatabaseAccessed(int render_process_id
,
130 const base::string16
& name
,
131 const base::string16
& display_name
,
132 bool blocked_by_policy
);
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
138 static void DOMStorageAccessed(int render_process_id
,
142 bool blocked_by_policy
);
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
148 static void IndexedDBAccessed(int render_process_id
,
151 const base::string16
& description
,
152 bool blocked_by_policy
);
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
158 static void FileSystemAccessed(int render_process_id
,
161 bool blocked_by_policy
);
163 // Resets the |content_blocked_| and |content_allowed_| arrays, except for
164 // CONTENT_SETTINGS_TYPE_COOKIES related information.
165 void ClearBlockedContentSettingsExceptForCookies();
167 // Resets all cookies related information.
168 void ClearCookieSpecificContentSettings();
170 // Clears the Geolocation settings.
171 void ClearGeolocationContentSettings();
173 // Clears the MIDI settings.
174 void ClearMidiContentSettings();
176 // Changes the |content_blocked_| entry for popups.
177 void SetPopupsBlocked(bool blocked
);
179 // Changes the |content_blocked_| entry for downloads.
180 void SetDownloadsBlocked(bool blocked
);
182 // Updates Geolocation settings on navigation.
183 void GeolocationDidNavigate(
184 const content::LoadCommittedDetails
& details
);
186 // Updates MIDI settings on navigation.
187 void MidiDidNavigate(const content::LoadCommittedDetails
& details
);
189 // Returns whether a particular kind of content has been blocked for this
191 bool IsContentBlocked(ContentSettingsType content_type
) const;
193 // Returns true if content blockage was indicated to the user.
194 bool IsBlockageIndicated(ContentSettingsType content_type
) const;
196 void SetBlockageHasBeenIndicated(ContentSettingsType content_type
);
198 // Returns whether a particular kind of content has been allowed. Currently
199 // only tracks cookies.
200 bool IsContentAllowed(ContentSettingsType content_type
) const;
202 const GURL
& media_stream_access_origin() const {
203 return media_stream_access_origin_
;
206 const std::string
& media_stream_requested_audio_device() const {
207 return media_stream_requested_audio_device_
;
210 const std::string
& media_stream_requested_video_device() const {
211 return media_stream_requested_video_device_
;
214 // Returns the state of the camera and microphone usage.
215 MicrophoneCameraState
GetMicrophoneCameraState() const;
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_
;
223 // Returns the ContentSettingsUsageState that controls the MIDI usage on
225 const ContentSettingsUsagesState
& midi_usages_state() const {
226 return midi_usages_state_
;
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
;
234 const ProtocolHandler
& pending_protocol_handler() const {
235 return pending_protocol_handler_
;
238 void ClearPendingProtocolHandler() {
239 pending_protocol_handler_
= ProtocolHandler::EmptyProtocolHandler();
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
;
248 const ProtocolHandler
& previous_protocol_handler() const {
249 return previous_protocol_handler_
;
252 // Set whether the setting for the pending handler is DEFAULT (ignore),
254 void set_pending_protocol_handler_setting(ContentSetting setting
) {
255 pending_protocol_handler_setting_
= setting
;
258 ContentSetting
pending_protocol_handler_setting() const {
259 return pending_protocol_handler_setting_
;
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_
;
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_
;
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
;
280 // Called to indicate whether access to the Pepper broker was allowed or
282 void SetPepperBrokerAllowed(bool allowed
);
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
,
297 bool is_iframe_srcdoc
) OVERRIDE
;
298 virtual void AppCacheAccessed(const GURL
& manifest_url
,
299 bool blocked_by_policy
) OVERRIDE
;
301 // Message handlers. Public for testing.
302 void OnContentBlocked(ContentSettingsType type
);
303 void OnContentAllowed(ContentSettingsType type
);
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
,
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
,
330 #if defined(OS_ANDROID)
331 void OnProtectedMediaIdentifierPermissionSet(const GURL
& requesting_frame
,
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
);
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
);
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
);
351 // Removes the given |SiteDataObserver|.
352 void RemoveSiteDataObserver(SiteDataObserver
* observer
);
355 explicit TabSpecificContentSettings(content::WebContents
* tab
);
356 friend class content::WebContentsUserData
<TabSpecificContentSettings
>;
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
;
365 // Notifies all registered |SiteDataObserver|s.
366 void NotifySiteDataObservers();
368 // All currently registered |SiteDataObserver|s.
369 ObserverList
<SiteDataObserver
> observer_list_
;
371 // Stores which content setting types actually have blocked content.
372 bool content_blocked_
[CONTENT_SETTINGS_NUM_TYPES
];
374 // Stores if the blocked content was messaged to the user.
375 bool content_blockage_indicated_to_user_
[CONTENT_SETTINGS_NUM_TYPES
];
377 // Stores which content setting types actually were allowed.
378 bool content_allowed_
[CONTENT_SETTINGS_NUM_TYPES
];
380 // The profile of the tab.
383 // Stores the blocked/allowed cookies.
384 LocalSharedObjectsContainer allowed_local_shared_objects_
;
385 LocalSharedObjectsContainer blocked_local_shared_objects_
;
387 // Manages information about Geolocation API usage in this page.
388 ContentSettingsUsagesState geolocation_usages_state_
;
390 // Manages information about MIDI usages in this page.
391 ContentSettingsUsagesState midi_usages_state_
;
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_
;
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_
;
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_
;
408 // Stores whether the user can load blocked plugins on this page.
409 bool load_plugins_link_enabled_
;
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_
;
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_
;
421 // Observer to watch for content settings changed.
422 ScopedObserver
<HostContentSettingsMap
, content_settings::Observer
> observer_
;
424 DISALLOW_COPY_AND_ASSIGN(TabSpecificContentSettings
);
427 #endif // CHROME_BROWSER_CONTENT_SETTINGS_TAB_SPECIFIC_CONTENT_SETTINGS_H_