1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_specific_content_settings.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_appcache_helper.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_database_helper.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/browsing_data_indexed_db_helper.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_local_storage_helper.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/cookies_tree_model.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/cookie_monster.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool TabSpecificContentSettings::LocalSharedObjectsContainer::empty() const {
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return cookies_->GetAllCookies().empty() &&
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      appcaches_->empty() &&
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      databases_->empty() &&
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      indexed_dbs_->empty() &&
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      local_storages_->empty() &&
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      session_storages_->empty();
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool TabSpecificContentSettings::IsContentBlocked(
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ContentSettingsType content_type) const {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION)
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << "Geolocation settings handled by ContentSettingGeolocationImageModel";
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS)
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << "Notifications settings handled by "
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << "ContentSettingsNotificationsImageModel";
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (content_type == CONTENT_SETTINGS_TYPE_IMAGES ||
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT ||
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      content_type == CONTENT_SETTINGS_TYPE_PLUGINS ||
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      content_type == CONTENT_SETTINGS_TYPE_COOKIES ||
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      content_type == CONTENT_SETTINGS_TYPE_POPUPS)
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return content_blocked_[content_type];
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTREACHED();
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool TabSpecificContentSettings::IsBlockageIndicated(
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ContentSettingsType content_type) const {
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return content_blockage_indicated_to_user_[content_type];
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid TabSpecificContentSettings::SetBlockageHasBeenIndicated(
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    ContentSettingsType content_type) {
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  content_blockage_indicated_to_user_[content_type] = true;
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool TabSpecificContentSettings::IsContentAccessed(
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType content_type) const {
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This method currently only returns meaningful values for cookies.
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (content_type != CONTENT_SETTINGS_TYPE_COOKIES)
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return false;
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return content_accessed_[content_type];
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst std::set<std::string>&
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    TabSpecificContentSettings::BlockedResourcesForType(
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        ContentSettingsType content_type) const {
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (blocked_resources_[content_type].get()) {
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return *blocked_resources_[content_type];
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else {
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    static std::set<std::string> empty_set;
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return empty_set;
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::AddBlockedResource(
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType content_type,
753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string& resource_identifier) {
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!blocked_resources_[content_type].get())
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    blocked_resources_[content_type].reset(new std::set<std::string>());
783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  blocked_resources_[content_type]->insert(resource_identifier);
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::OnContentBlocked(
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ContentSettingsType type,
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const std::string& resource_identifier) {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION)
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      << "Geolocation settings handled by OnGeolocationPermissionSet";
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  content_accessed_[type] = true;
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!resource_identifier.empty())
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    AddBlockedResource(type, resource_identifier);
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!content_blocked_[type]) {
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    content_blocked_[type] = true;
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (delegate_)
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delegate_->OnContentSettingsAccessed(true);
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::OnContentAccessed(ContentSettingsType type) {
973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION)
983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      << "Geolocation settings handled by OnGeolocationPermissionSet";
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!content_accessed_[type]) {
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    content_accessed_[type] = true;
1013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (delegate_)
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      delegate_->OnContentSettingsAccessed(false);
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TabSpecificContentSettings::OnCookiesRead(
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const GURL& url,
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    const net::CookieList& cookie_list,
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    bool blocked_by_policy) {
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (cookie_list.empty())
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  LocalSharedObjectsContainer& container = blocked_by_policy ?
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      blocked_local_shared_objects_ : allowed_local_shared_objects_;
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  typedef net::CookieList::const_iterator cookie_iterator;
11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  for (cookie_iterator cookie = cookie_list.begin();
11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen       cookie != cookie_list.end(); ++cookie) {
11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    container.cookies()->SetCookieWithDetails(url,
11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->Name(),
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->Value(),
12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->Domain(),
12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->Path(),
12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->ExpiryDate(),
12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->IsSecure(),
12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                              cookie->IsHttpOnly());
12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  if (blocked_by_policy)
12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string());
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  else
12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES);
13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen}
13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid TabSpecificContentSettings::OnCookieChanged(
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const GURL& url,
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const std::string& cookie_line,
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const net::CookieOptions& options,
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    bool blocked_by_policy) {
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (blocked_by_policy) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    blocked_local_shared_objects_.cookies()->SetCookieWithOptions(
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        url, cookie_line, options);
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string());
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    allowed_local_shared_objects_.cookies()->SetCookieWithOptions(
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        url, cookie_line, options);
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::OnIndexedDBAccessed(
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& url,
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const string16& description,
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool blocked_by_policy) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (blocked_by_policy) {
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    blocked_local_shared_objects_.indexed_dbs()->AddIndexedDB(
154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        url, description);
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string());
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }else {
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    allowed_local_shared_objects_.indexed_dbs()->AddIndexedDB(
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        url, description);
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::OnLocalStorageAccessed(
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const GURL& url,
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    DOMStorageType storage_type,
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool blocked_by_policy) {
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LocalSharedObjectsContainer& container = blocked_by_policy ?
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      blocked_local_shared_objects_ : allowed_local_shared_objects_;
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  CannedBrowsingDataLocalStorageHelper* helper =
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      storage_type == DOM_STORAGE_LOCAL ?
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          container.local_storages() : container.session_storages();
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  helper->AddLocalStorage(url);
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (blocked_by_policy)
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string());
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  else
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES);
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabSpecificContentSettings::OnWebDatabaseAccessed(
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& url,
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const string16& name,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const string16& display_name,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    unsigned long estimated_size,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool blocked_by_policy) {
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (blocked_by_policy) {
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    blocked_local_shared_objects_.databases()->AddDatabase(
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        url, UTF16ToUTF8(name), UTF16ToUTF8(display_name));
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string());
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    allowed_local_shared_objects_.databases()->AddDatabase(
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        url, UTF16ToUTF8(name), UTF16ToUTF8(display_name));
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabSpecificContentSettings::OnAppCacheAccessed(
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& manifest_url, bool blocked_by_policy) {
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (blocked_by_policy) {
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    blocked_local_shared_objects_.appcaches()->AddAppCache(manifest_url);
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string());
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    allowed_local_shared_objects_.appcaches()->AddAppCache(manifest_url);
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabSpecificContentSettings::OnGeolocationPermissionSet(
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const GURL& requesting_origin,
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool allowed) {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_settings_state_.OnGeolocationPermissionSet(requesting_origin,
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                         allowed);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delegate_->OnContentSettingsAccessed(!allowed);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabSpecificContentSettings::TabSpecificContentSettings(
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Delegate* delegate, Profile* profile)
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : allowed_local_shared_objects_(profile),
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      blocked_local_shared_objects_(profile),
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      geolocation_settings_state_(profile),
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      load_plugins_link_enabled_(true),
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      delegate_(NULL) {
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ClearBlockedContentSettingsExceptForCookies();
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ClearCookieSpecificContentSettings();
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  delegate_ = delegate;
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::ClearBlockedContentSettingsExceptForCookies() {
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = 0; i < arraysize(content_blocked_); ++i) {
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (i == CONTENT_SETTINGS_TYPE_COOKIES)
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      continue;
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    blocked_resources_[i].reset();
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    content_blocked_[i] = false;
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    content_accessed_[i] = false;
236201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    content_blockage_indicated_to_user_[i] = false;
2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  load_plugins_link_enabled_ = true;
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (delegate_)
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delegate_->OnContentSettingsAccessed(false);
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::ClearCookieSpecificContentSettings() {
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  blocked_local_shared_objects_.Reset();
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  allowed_local_shared_objects_.Reset();
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  content_blocked_[CONTENT_SETTINGS_TYPE_COOKIES] = false;
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  content_accessed_[CONTENT_SETTINGS_TYPE_COOKIES] = false;
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  content_blockage_indicated_to_user_[CONTENT_SETTINGS_TYPE_COOKIES] = false;
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delegate_->OnContentSettingsAccessed(false);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabSpecificContentSettings::SetPopupsBlocked(bool blocked) {
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  content_blocked_[CONTENT_SETTINGS_TYPE_POPUPS] = blocked;
255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  content_blockage_indicated_to_user_[CONTENT_SETTINGS_TYPE_POPUPS] = false;
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (delegate_)
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delegate_->OnContentSettingsAccessed(blocked);
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabSpecificContentSettings::GeolocationDidNavigate(
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const NavigationController::LoadCommittedDetails& details) {
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  geolocation_settings_state_.DidNavigate(details);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid TabSpecificContentSettings::ClearGeolocationContentSettings() {
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  geolocation_settings_state_.ClearStateMap();
2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCookiesTreeModel* TabSpecificContentSettings::GetAllowedCookiesTreeModel() {
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return allowed_local_shared_objects_.GetCookiesTreeModel();
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCookiesTreeModel* TabSpecificContentSettings::GetBlockedCookiesTreeModel() {
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return blocked_local_shared_objects_.GetCookiesTreeModel();
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabSpecificContentSettings::LocalSharedObjectsContainer::
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LocalSharedObjectsContainer(Profile* profile)
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : cookies_(new net::CookieMonster(NULL, NULL)),
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      appcaches_(new CannedBrowsingDataAppCacheHelper(profile)),
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      databases_(new CannedBrowsingDataDatabaseHelper(profile)),
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      indexed_dbs_(new CannedBrowsingDataIndexedDBHelper(profile)),
2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      local_storages_(new CannedBrowsingDataLocalStorageHelper(profile)),
2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      session_storages_(new CannedBrowsingDataLocalStorageHelper(profile)) {
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cookies_->SetCookieableSchemes(
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::CookieMonster::kDefaultCookieableSchemes,
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::CookieMonster::kDefaultCookieableSchemesCount);
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cookies_->SetKeepExpiredCookies();
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabSpecificContentSettings::LocalSharedObjectsContainer::
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ~LocalSharedObjectsContainer() {
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid TabSpecificContentSettings::LocalSharedObjectsContainer::Reset() {
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cookies_ = new net::CookieMonster(NULL, NULL);
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cookies_->SetCookieableSchemes(
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::CookieMonster::kDefaultCookieableSchemes,
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::CookieMonster::kDefaultCookieableSchemesCount);
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cookies_->SetKeepExpiredCookies();
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  appcaches_->Reset();
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  databases_->Reset();
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  indexed_dbs_->Reset();
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  local_storages_->Reset();
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  session_storages_->Reset();
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochCookiesTreeModel*
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTabSpecificContentSettings::LocalSharedObjectsContainer::GetCookiesTreeModel() {
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return new CookiesTreeModel(cookies_,
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              databases_->Clone(),
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              local_storages_->Clone(),
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              session_storages_->Clone(),
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              appcaches_->Clone(),
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              indexed_dbs_->Clone(),
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                              true);
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
318