Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6773)

Unified Diff: chrome/browser/website_settings_model.cc

Issue 9379016: (WIP) Website Settings GTK UI (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tmp Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/website_settings_model.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/website_settings_model.cc
diff --git a/chrome/browser/website_settings_model.cc b/chrome/browser/website_settings_model.cc
index 2c2abfefad6095417039a678de02c2dc19f58ba0..36d890cdb5746a65627f3d5860a08fc2115f856d 100644
--- a/chrome/browser/website_settings_model.cc
+++ b/chrome/browser/website_settings_model.cc
@@ -9,6 +9,9 @@
#include "base/string_number_conversions.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/content_settings/host_content_settings_map.h"
+#include "chrome/browser/content_settings/local_shared_objects_container.h"
+#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ssl/ssl_error_info.h"
#include "content/public/browser/cert_store.h"
@@ -23,14 +26,271 @@
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
-WebsiteSettingsModel::WebsiteSettingsModel(Profile* profile,
+// ---
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "content/public/browser/browser_thread.h"
+#include "net/base/registry_controlled_domain.h"
+
+using content::BrowserThread;
+
+namespace {
+
+ContentSettingsType kPermissionType[] = {
+ CONTENT_SETTINGS_TYPE_POPUPS,
+ CONTENT_SETTINGS_TYPE_PLUGINS,
+ CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+ CONTENT_SETTINGS_TYPE_GEOLOCATION,
+};
+
+} // namespace
+
+class SiteData {
+ public:
+ SiteData(WebsiteSettingsModel* website_settings,
+ GURL page_url,
+ const LocalSharedObjectsContainer& local_shared_data,
+ const LocalSharedObjectsContainer& blocked_local_shared_data);
+
+ int GetAllowedLocalSharedObjectsCount() const;
+ int GetBlockedLocalSharedObjectsCount() const;
+ int GetThirdPartyCookiesCount() const;
+ int GetBlockedThirdPartyCookiesCount() const;
+
+ int GetThirdPartyDomainCount() const;
+
+ private:
+ typedef std::list<net::CookieMonster::CanonicalCookie> CookieList;
+ typedef std::list<BrowsingDataDatabaseHelper::DatabaseInfo>
+ DatabaseInfoList;
+ typedef std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>
+ LocalStorageInfoList;
+ typedef std::list<BrowsingDataLocalStorageHelper::LocalStorageInfo>
+ SessionStorageInfoList;
+ typedef std::list<BrowsingDataIndexedDBHelper::IndexedDBInfo>
+ IndexedDBInfoList;
+ typedef std::list<BrowsingDataFileSystemHelper::FileSystemInfo>
+ FileSystemInfoList;
+
+ // Callbacks for asynchrounous local data fetching
+ void OnAllowedCookiesLoaded(const net::CookieList& cookie_list);
+ void OnBlockedCookiesLoaded(const net::CookieList& cookie_list);
+ void OnAllowedDatabaseInfoLoaded(const DatabaseInfoList& database_info);
+ void OnBlockedDatabaseInfoLoaded(const DatabaseInfoList& database_info);
+
+ void NotifyListener() const;
+
+ WebsiteSettingsModel* website_settings_;
+
+ GURL page_url_;
+
+ net::CookieList allowed_cookies_list_;
+ net::CookieList blocked_cookies_list_;
+ net::CookieList allowed_third_party_cookies_;
+ net::CookieList blocked_third_party_cookies_;
+
+ DatabaseInfoList allowed_database_info_list_;
+ DatabaseInfoList blocked_database_info_list_;
+
+ int pending_callbacks_;
+
+ DISALLOW_COPY_AND_ASSIGN(SiteData);
+};
+
+SiteData::SiteData(
+ WebsiteSettingsModel* website_settings,
+ GURL page_url,
+ const LocalSharedObjectsContainer& allowed_local_shared_objects,
+ const LocalSharedObjectsContainer& blocked_local_shared_objects)
+ : website_settings_(website_settings),
+ page_url_(page_url),
+ pending_callbacks_(0) {
+
+ // 4 async calls will be made.
+ pending_callbacks_ = 4;
+
+ // Fetch cookies.
+ DCHECK(allowed_local_shared_objects.cookies());
+ allowed_local_shared_objects.cookies()->StartFetching(
+ base::Bind(&SiteData::OnAllowedCookiesLoaded,
+ base::Unretained(this)));
+ DCHECK(blocked_local_shared_objects.cookies());
+ blocked_local_shared_objects.cookies()->StartFetching(
+ base::Bind(&SiteData::OnBlockedCookiesLoaded,
+ base::Unretained(this)));
+
+ // Fetch database infos.
+ DCHECK(allowed_local_shared_objects.databases());
+ allowed_local_shared_objects.databases()->StartFetching(
+ base::Bind(&SiteData::OnAllowedDatabaseInfoLoaded,
+ base::Unretained(this)));
+ DCHECK(allowed_local_shared_objects.databases());
+ blocked_local_shared_objects.databases()->StartFetching(
+ base::Bind(&SiteData::OnBlockedDatabaseInfoLoaded,
+ base::Unretained(this)));
+/*
+ // Local Storage
+ DCHECK(allowed_local_shared_objects.local_storage_helper_);
+ local_storage_helper_->StartFetching(
+ base::Bind(&SiteData::OnLocalStorageModelInfoLoaded,
+ base::Unretained(this)));
+ if (session_storage_helper_) {
+ session_storage_helper_->StartFetching(
+ base::Bind(&SiteData::OnSessionStorageModelInfoLoaded,
+ base::Unretained(this)));
+ }
+
+ // TODO(michaeln): When all of the UI implementations have been updated, make
+ // this a required parameter.
+ if (appcache_helper_) {
+ appcache_helper_->StartFetching(
+ base::Bind(&CookiesTreeModel::OnAppCacheModelInfoLoaded,
+ base::Unretained(this)));
+ }
+
+ if (indexed_db_helper_) {
+ indexed_db_helper_->StartFetching(
+ base::Bind(&CookiesTreeModel::OnIndexedDBModelInfoLoaded,
+ base::Unretained(this)));
+ }
+
+ if (file_system_helper_) {
+ file_system_helper_->StartFetching(
+ base::Bind(&CookiesTreeModel::OnFileSystemModelInfoLoaded,
+ base::Unretained(this)));
+ }
+
+ if (quota_helper_) {
+ quota_helper_->StartFetching(
+ base::Bind(&CookiesTreeModel::OnQuotaModelInfoLoaded,
+ base::Unretained(this)));
+ */
+}
+
+int SiteData::GetAllowedLocalSharedObjectsCount() const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return allowed_cookies_list_.size() +
+ allowed_database_info_list_.size();
+}
+
+int SiteData::GetBlockedLocalSharedObjectsCount() const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return blocked_cookies_list_.size() +
+ blocked_database_info_list_.size();
+}
+
+int SiteData::GetThirdPartyCookiesCount() const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return allowed_third_party_cookies_.size();
+}
+
+int SiteData::GetBlockedThirdPartyCookiesCount() const {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return blocked_third_party_cookies_.size();
+}
+
+void SiteData::NotifyListener() const {
+ if (pending_callbacks_ == 0)
+ website_settings_->OnLocalSharedObjectsUpdated();
+}
+
+void SiteData::OnAllowedDatabaseInfoLoaded(
+ const DatabaseInfoList& database_info) {
+ allowed_database_info_list_ = database_info;
+ pending_callbacks_--;
+ NotifyListener();
+}
+
+void SiteData::OnBlockedDatabaseInfoLoaded(
+ const DatabaseInfoList& database_info) {
+ blocked_database_info_list_ = database_info;
+ pending_callbacks_--;
+ NotifyListener();
+}
+
+void SiteData::OnAllowedCookiesLoaded(const net::CookieList& cookie_list) {
+ for (net::CookieList::const_iterator cookie = cookie_list.begin();
+ cookie != cookie_list.end();
+ ++cookie) {
+ // Strip leading dot.
+ std::string domain = cookie->Domain();
+ if (domain.length() > 1 && domain[0] == '.')
+ domain = domain.substr(1);
+ // Test if the cookie is a first party cookie.
+ bool first_party_cookie =
+ net::RegistryControlledDomainService::SameDomainOrHost(
+ page_url_, GURL(std::string(chrome::kHttpScheme) +
+ chrome::kStandardSchemeSeparator + domain));
+ if (first_party_cookie)
+ allowed_cookies_list_.push_back(*cookie);
+ else
+ allowed_third_party_cookies_.push_back(*cookie);
+ }
+ pending_callbacks_--;
+ NotifyListener();
+}
+
+int SiteData::GetThirdPartyDomainCount() const {
+ std::set<std::string> domain_set;
+ for (net::CookieList::const_iterator cookie = allowed_third_party_cookies_.begin();
+ cookie != allowed_third_party_cookies_.end();
+ ++cookie) {
+ domain_set.insert(cookie->Domain());
+ LOG(ERROR) << " *** " << cookie->Domain();
+ }
+ for (net::CookieList::const_iterator cookie = blocked_third_party_cookies_.begin();
+ cookie != blocked_third_party_cookies_.end();
+ ++cookie) {
+ domain_set.insert(cookie->Domain());
+ LOG(ERROR) << " *** " << cookie->Domain();
+ }
+ return domain_set.size();
+}
+
+void SiteData::OnBlockedCookiesLoaded(const net::CookieList& cookie_list) {
+ for (net::CookieList::const_iterator cookie = cookie_list.begin();
+ cookie != cookie_list.end();
+ ++cookie) {
+ // Strip leading dot.
+ std::string domain = cookie->Domain();
+ if (domain.length() > 1 && domain[0] == '.')
+ domain = domain.substr(1);
+ // Test if the cookie is a first party cookie.
+ bool first_party_cookie =
+ net::RegistryControlledDomainService::SameDomainOrHost(
+ page_url_, GURL(std::string(chrome::kHttpScheme) +
+ chrome::kStandardSchemeSeparator + domain));
+ if (first_party_cookie)
+ blocked_cookies_list_.push_back(*cookie);
+ else
+ blocked_third_party_cookies_.push_back(*cookie);
+ }
+ pending_callbacks_--;
+ NotifyListener();
+}
+
+//
+//
+//
+WebsiteSettingsModel::WebsiteSettingsModel(WebsiteSettingsUI* ui,
+ Profile* profile,
const GURL& url,
const content::SSLStatus& ssl,
- content::CertStore* cert_store)
- : site_identity_status_(SITE_IDENTITY_STATUS_UNKNOWN),
+ content::CertStore* cert_store,
+ TabSpecificContentSettings* content_settings)
+ : ui_(ui),
+ site_url_(url),
+ site_identity_status_(SITE_IDENTITY_STATUS_UNKNOWN),
site_connection_status_(SITE_CONNECTION_STATUS_UNKNOWN),
- cert_store_(cert_store) {
+ cert_store_(cert_store),
+ content_settings_(profile->GetHostContentSettingsMap()) {
Init(profile, url, ssl);
+ site_data_.reset(new SiteData(
+ this,
+ url,
+ content_settings->allowed_local_shared_objects(),
+ content_settings->blocked_local_shared_objects()));
+
// After initialization the status about the site's connection
// and it's identity must be available.
DCHECK_NE(site_identity_status_, SITE_IDENTITY_STATUS_UNKNOWN);
@@ -40,6 +300,48 @@ WebsiteSettingsModel::WebsiteSettingsModel(Profile* profile,
WebsiteSettingsModel::~WebsiteSettingsModel() {
}
+void WebsiteSettingsModel::OnLocalSharedObjectsUpdated() {
+ ui_->Update();
+}
+
+void WebsiteSettingsModel::GetCookieInfos(CookieInfoList* cookie_info_list) {
+ cookie_info_list->clear();
+
+ WebsiteSettingsUI::CookieInfo info;
+ info.text =
+ net::RegistryControlledDomainService::GetDomainAndRegistry(site_url_);
+ info.allowed = site_data_->GetAllowedLocalSharedObjectsCount();
+ info.blocked = site_data_->GetBlockedLocalSharedObjectsCount();
+ cookie_info_list->push_back(info);
+
+ int domain_count = site_data_->GetThirdPartyDomainCount();
+ info.text = domain_count ? base::IntToString(domain_count) + " " : "";
+ if (domain_count == 1)
+ info.text += "Other site";
+ else
+ info.text += "Other sites";
+ info.allowed = site_data_->GetThirdPartyCookiesCount();
+ info.blocked = site_data_->GetBlockedThirdPartyCookiesCount();
+ cookie_info_list->push_back(info);
+}
+
+void WebsiteSettingsModel::GetPermissionInfos(
+ PermissionInfoList* permission_info_list) {
+ permission_info_list->clear();
+
+ WebsiteSettingsUI::PermissionInfo permission_info;
+ for (size_t i=0; i<arraysize(kPermissionType); ++i) {
+ ContentSettingsType type = kPermissionType[i];
+ ContentSetting setting = content_settings_->GetContentSetting(
+ site_url_, site_url_, type, "");
+ if (setting != CONTENT_SETTING_ASK) {
+ permission_info.type = type;
+ permission_info.setting = setting;
+ permission_info_list->push_back(permission_info);
+ }
+ }
+}
+
void WebsiteSettingsModel::Init(Profile* profile,
const GURL& url,
const content::SSLStatus& ssl) {
« no previous file with comments | « chrome/browser/website_settings_model.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698