Index: chrome/browser/tab_contents/tab_specific_content_settings.cc |
diff --git a/chrome/browser/tab_contents/tab_specific_content_settings.cc b/chrome/browser/tab_contents/tab_specific_content_settings.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..891debdc70729d8f9bf9a0c0d0276c375f4e8e1a |
--- /dev/null |
+++ b/chrome/browser/tab_contents/tab_specific_content_settings.cc |
@@ -0,0 +1,128 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/tab_contents/tab_specific_content_settings.h" |
+ |
+#include "base/utf_string_conversions.h" |
+ |
+bool TabSpecificContentSettings::IsContentBlocked( |
+ ContentSettingsType content_type) const { |
+ DCHECK(content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION) |
+ << "Geolocation settings handled by ContentSettingGeolocationImageModel"; |
+ DCHECK(content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) |
+ << "Notifications settings handled by " |
+ << "ContentSettingsNotificationsImageModel"; |
+ |
+ if (content_type == CONTENT_SETTINGS_TYPE_IMAGES || |
+ content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT || |
+ content_type == CONTENT_SETTINGS_TYPE_PLUGINS || |
+ content_type == CONTENT_SETTINGS_TYPE_COOKIES || |
+ content_type == CONTENT_SETTINGS_TYPE_POPUPS) |
+ return content_blocked_[content_type]; |
+ |
+ NOTREACHED(); |
+ return false; |
+} |
+ |
+void TabSpecificContentSettings::OnContentBlocked(ContentSettingsType type) { |
+ DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION) |
+ << "Geolocation settings handled by OnGeolocationPermissionSet"; |
+ content_blocked_[type] = true; |
+ if (delegate_) |
+ delegate_->OnContentSettingsChange(); |
+} |
+ |
+void TabSpecificContentSettings::OnCookieAccessed( |
+ const GURL& url, const std::string& cookie_line, bool blocked_by_policy) { |
+ net::CookieOptions options; |
+ options.set_include_httponly(); |
+ if (blocked_by_policy) { |
+ blocked_local_shared_objects_.cookies()->SetCookieWithOptions( |
+ url, cookie_line, options); |
+ OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); |
+ } else { |
+ allowed_local_shared_objects_.cookies()->SetCookieWithOptions( |
+ url, cookie_line, options); |
+ } |
+} |
+ |
+void TabSpecificContentSettings::OnLocalStorageAccessed( |
+ const GURL& url, bool blocked_by_policy) { |
+ if (blocked_by_policy) { |
+ blocked_local_shared_objects_.local_storages()->AddLocalStorage(url); |
+ OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); |
+ } else { |
+ allowed_local_shared_objects_.local_storages()->AddLocalStorage(url); |
+ } |
+} |
+ |
+void TabSpecificContentSettings::OnWebDatabaseAccessed( |
+ const GURL& url, |
+ const string16& name, |
+ const string16& display_name, |
+ unsigned long estimated_size, |
+ bool blocked_by_policy) { |
+ if (blocked_by_policy) { |
+ blocked_local_shared_objects_.databases()->AddDatabase( |
+ url, UTF16ToUTF8(name), UTF16ToUTF8(display_name)); |
+ OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES); |
+ } else { |
+ allowed_local_shared_objects_.databases()->AddDatabase( |
+ url, UTF16ToUTF8(name), UTF16ToUTF8(display_name)); |
+ } |
+} |
+ |
+void TabSpecificContentSettings::OnGeolocationPermissionSet( |
+ const GURL& requesting_origin, |
+ bool allowed) { |
+ geolocation_settings_state_.OnGeolocationPermissionSet(requesting_origin, |
+ allowed); |
+ if (delegate_) |
+ delegate_->OnContentSettingsChange(); |
+} |
+ |
+TabSpecificContentSettings::TabSpecificContentSettings( |
+ Delegate* delegate, Profile* profile) |
+ : allowed_local_shared_objects_(profile), |
+ blocked_local_shared_objects_(profile), |
+ geolocation_settings_state_(profile), |
+ delegate_(NULL) { |
+ ClearBlockedContentSettings(); |
+ delegate_ = delegate; |
+} |
+ |
+void TabSpecificContentSettings::ClearBlockedContentSettings() { |
+ for (size_t i = 0; i < arraysize(content_blocked_); ++i) |
+ content_blocked_[i] = false; |
+ blocked_local_shared_objects_.Reset(); |
+ allowed_local_shared_objects_.Reset(); |
+ if (delegate_) |
+ delegate_->OnContentSettingsChange(); |
+} |
+ |
+void TabSpecificContentSettings::SetPopupsBlocked(bool blocked) { |
+ content_blocked_[CONTENT_SETTINGS_TYPE_POPUPS] = blocked; |
+ if (delegate_) |
+ delegate_->OnContentSettingsChange(); |
+} |
+ |
+void TabSpecificContentSettings::GeolocationDidNavigate( |
+ const NavigationController::LoadCommittedDetails& details) { |
+ geolocation_settings_state_.DidNavigate(details); |
+} |
+ |
+TabSpecificContentSettings::LocalSharedObjectsContainer:: |
+ LocalSharedObjectsContainer(Profile* profile) |
+ : cookies_(new net::CookieMonster(NULL, NULL)), |
+ appcaches_(new CannedBrowsingDataAppCacheHelper(profile)), |
+ databases_(new CannedBrowsingDataDatabaseHelper(profile)), |
+ local_storages_(new CannedBrowsingDataLocalStorageHelper(profile)) { |
+} |
+ |
+void TabSpecificContentSettings::LocalSharedObjectsContainer::Reset() { |
+ cookies_->DeleteAll(false); |
+ appcaches_->Reset(); |
+ databases_->Reset(); |
+ local_storages_->Reset(); |
+} |