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 #include "chrome/browser/ui/webui/options/cookies_view_handler.h" 6 7 #include <string> 8 9 #include "base/bind.h" 10 #include "base/bind_helpers.h" 11 #include "base/strings/utf_string_conversions.h" 12 #include "base/values.h" 13 #include "chrome/browser/browsing_data/browsing_data_appcache_helper.h" 14 #include "chrome/browser/browsing_data/browsing_data_cookie_helper.h" 15 #include "chrome/browser/browsing_data/browsing_data_database_helper.h" 16 #include "chrome/browser/browsing_data/browsing_data_file_system_helper.h" 17 #include "chrome/browser/browsing_data/browsing_data_flash_lso_helper.h" 18 #include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h" 19 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" 20 #include "chrome/browser/browsing_data/browsing_data_quota_helper.h" 21 #include "chrome/browser/browsing_data/browsing_data_server_bound_cert_helper.h" 22 #include "chrome/browser/profiles/profile.h" 23 #include "chrome/browser/ui/webui/cookies_tree_model_util.h" 24 #include "content/public/browser/browser_context.h" 25 #include "content/public/browser/render_process_host.h" 26 #include "content/public/browser/site_instance.h" 27 #include "content/public/browser/storage_partition.h" 28 #include "content/public/browser/web_ui.h" 29 #include "grit/generated_resources.h" 30 #include "ui/base/l10n/l10n_util.h" 31 32 namespace fileapi { 33 class FileSystemContext; 34 } 35 36 namespace options { 37 38 CookiesViewHandler::CookiesViewHandler() 39 : batch_update_(false), 40 model_util_(new CookiesTreeModelUtil) { 41 } 42 43 CookiesViewHandler::~CookiesViewHandler() { 44 } 45 46 void CookiesViewHandler::GetLocalizedValues( 47 DictionaryValue* localized_strings) { 48 DCHECK(localized_strings); 49 50 static OptionsStringResource resources[] = { 51 { "label_cookie_name", IDS_COOKIES_COOKIE_NAME_LABEL }, 52 { "label_cookie_content", IDS_COOKIES_COOKIE_CONTENT_LABEL }, 53 { "label_cookie_domain", IDS_COOKIES_COOKIE_DOMAIN_LABEL }, 54 { "label_cookie_path", IDS_COOKIES_COOKIE_PATH_LABEL }, 55 { "label_cookie_send_for", IDS_COOKIES_COOKIE_SENDFOR_LABEL }, 56 { "label_cookie_accessible_to_script", 57 IDS_COOKIES_COOKIE_ACCESSIBLE_TO_SCRIPT_LABEL }, 58 { "label_cookie_created", IDS_COOKIES_COOKIE_CREATED_LABEL }, 59 { "label_cookie_expires", IDS_COOKIES_COOKIE_EXPIRES_LABEL }, 60 { "label_webdb_desc", IDS_COOKIES_WEB_DATABASE_DESCRIPTION_LABEL }, 61 { "label_local_storage_size", 62 IDS_COOKIES_LOCAL_STORAGE_SIZE_ON_DISK_LABEL }, 63 { "label_local_storage_last_modified", 64 IDS_COOKIES_LOCAL_STORAGE_LAST_MODIFIED_LABEL }, 65 { "label_local_storage_origin", IDS_COOKIES_LOCAL_STORAGE_ORIGIN_LABEL }, 66 { "label_indexed_db_size", IDS_COOKIES_LOCAL_STORAGE_SIZE_ON_DISK_LABEL }, 67 { "label_indexed_db_last_modified", 68 IDS_COOKIES_LOCAL_STORAGE_LAST_MODIFIED_LABEL }, 69 { "label_indexed_db_origin", IDS_COOKIES_LOCAL_STORAGE_ORIGIN_LABEL }, 70 { "label_app_cache_manifest", 71 IDS_COOKIES_APPLICATION_CACHE_MANIFEST_LABEL }, 72 { "label_cookie_last_accessed", IDS_COOKIES_LAST_ACCESSED_LABEL }, 73 { "cookie_domain", IDS_COOKIES_DOMAIN_COLUMN_HEADER }, 74 { "cookie_local_data", IDS_COOKIES_DATA_COLUMN_HEADER }, 75 { "cookie_singular", IDS_COOKIES_SINGLE_COOKIE }, 76 { "cookie_plural", IDS_COOKIES_PLURAL_COOKIES }, 77 { "cookie_database_storage", IDS_COOKIES_DATABASE_STORAGE }, 78 { "cookie_indexed_db", IDS_COOKIES_INDEXED_DB }, 79 { "cookie_local_storage", IDS_COOKIES_LOCAL_STORAGE }, 80 { "cookie_app_cache", IDS_COOKIES_APPLICATION_CACHE }, 81 { "cookie_flash_lso", IDS_COOKIES_FLASH_LSO }, 82 { "search_cookies", IDS_COOKIES_SEARCH_COOKIES }, 83 { "remove_cookie", IDS_COOKIES_REMOVE_LABEL }, 84 { "remove_all_cookie", IDS_COOKIES_REMOVE_ALL_LABEL }, 85 { "cookie_file_system", IDS_COOKIES_FILE_SYSTEM }, 86 { "label_file_system_origin", IDS_COOKIES_LOCAL_STORAGE_ORIGIN_LABEL }, 87 { "label_file_system_temporary_usage", 88 IDS_COOKIES_FILE_SYSTEM_TEMPORARY_USAGE_LABEL }, 89 { "label_file_system_persistent_usage", 90 IDS_COOKIES_FILE_SYSTEM_PERSISTENT_USAGE_LABEL }, 91 { "cookie_server_bound_cert", IDS_COOKIES_SERVER_BOUND_CERT }, 92 { "label_server_bound_cert_server_id", 93 IDS_COOKIES_SERVER_BOUND_CERT_ORIGIN_LABEL }, 94 { "label_server_bound_cert_type", 95 IDS_COOKIES_SERVER_BOUND_CERT_TYPE_LABEL }, 96 { "label_server_bound_cert_created", 97 IDS_COOKIES_SERVER_BOUND_CERT_CREATED_LABEL }, 98 { "label_server_bound_cert_expires", 99 IDS_COOKIES_SERVER_BOUND_CERT_EXPIRES_LABEL }, 100 { "label_protected_by_apps", 101 IDS_GEOLOCATION_SET_BY_HOVER }, // TODO(bauerb): Use a better string 102 }; 103 104 RegisterStrings(localized_strings, resources, arraysize(resources)); 105 RegisterTitle(localized_strings, "cookiesViewPage", 106 IDS_COOKIES_WEBSITE_PERMISSIONS_WINDOW_TITLE); 107 } 108 109 void CookiesViewHandler::RegisterMessages() { 110 web_ui()->RegisterMessageCallback("updateCookieSearchResults", 111 base::Bind(&CookiesViewHandler::UpdateSearchResults, 112 base::Unretained(this))); 113 web_ui()->RegisterMessageCallback("removeAllCookies", 114 base::Bind(&CookiesViewHandler::RemoveAll, 115 base::Unretained(this))); 116 web_ui()->RegisterMessageCallback("removeCookie", 117 base::Bind(&CookiesViewHandler::Remove, 118 base::Unretained(this))); 119 web_ui()->RegisterMessageCallback("loadCookie", 120 base::Bind(&CookiesViewHandler::LoadChildren, 121 base::Unretained(this))); 122 web_ui()->RegisterMessageCallback("reloadCookies", 123 base::Bind(&CookiesViewHandler::ReloadCookies, 124 base::Unretained(this))); 125 } 126 127 void CookiesViewHandler::TreeNodesAdded(ui::TreeModel* model, 128 ui::TreeModelNode* parent, 129 int start, 130 int count) { 131 // Skip if there is a batch update in progress. 132 if (batch_update_) 133 return; 134 135 CookiesTreeModel* tree_model = static_cast<CookiesTreeModel*>(model); 136 CookieTreeNode* parent_node = tree_model->AsNode(parent); 137 138 ListValue* children = new ListValue; 139 model_util_->GetChildNodeList(parent_node, start, count, children); 140 141 ListValue args; 142 args.Append(parent == tree_model->GetRoot() ? 143 Value::CreateNullValue() : 144 new base::StringValue(model_util_->GetTreeNodeId(parent_node))); 145 args.Append(new base::FundamentalValue(start)); 146 args.Append(children); 147 web_ui()->CallJavascriptFunction("CookiesView.onTreeItemAdded", args); 148 } 149 150 void CookiesViewHandler::TreeNodesRemoved(ui::TreeModel* model, 151 ui::TreeModelNode* parent, 152 int start, 153 int count) { 154 // Skip if there is a batch update in progress. 155 if (batch_update_) 156 return; 157 158 CookiesTreeModel* tree_model = static_cast<CookiesTreeModel*>(model); 159 160 ListValue args; 161 args.Append(parent == tree_model->GetRoot() ? 162 Value::CreateNullValue() : 163 new base::StringValue(model_util_->GetTreeNodeId( 164 tree_model->AsNode(parent)))); 165 args.Append(new base::FundamentalValue(start)); 166 args.Append(new base::FundamentalValue(count)); 167 web_ui()->CallJavascriptFunction("CookiesView.onTreeItemRemoved", args); 168 } 169 170 void CookiesViewHandler::TreeModelBeginBatch(CookiesTreeModel* model) { 171 DCHECK(!batch_update_); // There should be no nested batch begin. 172 batch_update_ = true; 173 } 174 175 void CookiesViewHandler::TreeModelEndBatch(CookiesTreeModel* model) { 176 DCHECK(batch_update_); 177 batch_update_ = false; 178 179 SendChildren(model->GetRoot()); 180 } 181 182 void CookiesViewHandler::EnsureCookiesTreeModelCreated() { 183 if (!cookies_tree_model_.get()) { 184 Profile* profile = Profile::FromWebUI(web_ui()); 185 content::StoragePartition* storage_partition = 186 content::BrowserContext::GetDefaultStoragePartition(profile); 187 content::IndexedDBContext* indexed_db_context = 188 storage_partition->GetIndexedDBContext(); 189 fileapi::FileSystemContext* file_system_context = 190 storage_partition->GetFileSystemContext(); 191 LocalDataContainer* container = new LocalDataContainer( 192 new BrowsingDataCookieHelper(profile->GetRequestContext()), 193 new BrowsingDataDatabaseHelper(profile), 194 new BrowsingDataLocalStorageHelper(profile), 195 NULL, 196 new BrowsingDataAppCacheHelper(profile), 197 BrowsingDataIndexedDBHelper::Create(indexed_db_context), 198 BrowsingDataFileSystemHelper::Create(file_system_context), 199 BrowsingDataQuotaHelper::Create(profile), 200 BrowsingDataServerBoundCertHelper::Create(profile), 201 BrowsingDataFlashLSOHelper::Create(profile)); 202 cookies_tree_model_.reset( 203 new CookiesTreeModel(container, 204 profile->GetExtensionSpecialStoragePolicy(), 205 false)); 206 cookies_tree_model_->AddCookiesTreeObserver(this); 207 } 208 } 209 210 void CookiesViewHandler::UpdateSearchResults(const ListValue* args) { 211 string16 query; 212 if (!args->GetString(0, &query)) 213 return; 214 215 EnsureCookiesTreeModelCreated(); 216 217 cookies_tree_model_->UpdateSearchResults(query); 218 } 219 220 void CookiesViewHandler::RemoveAll(const ListValue* args) { 221 EnsureCookiesTreeModelCreated(); 222 cookies_tree_model_->DeleteAllStoredObjects(); 223 } 224 225 void CookiesViewHandler::Remove(const ListValue* args) { 226 std::string node_path; 227 if (!args->GetString(0, &node_path)) 228 return; 229 230 EnsureCookiesTreeModelCreated(); 231 232 const CookieTreeNode* node = model_util_->GetTreeNodeFromPath( 233 cookies_tree_model_->GetRoot(), node_path); 234 if (node) 235 cookies_tree_model_->DeleteCookieNode(const_cast<CookieTreeNode*>(node)); 236 } 237 238 void CookiesViewHandler::LoadChildren(const ListValue* args) { 239 std::string node_path; 240 if (!args->GetString(0, &node_path)) 241 return; 242 243 EnsureCookiesTreeModelCreated(); 244 245 const CookieTreeNode* node = model_util_->GetTreeNodeFromPath( 246 cookies_tree_model_->GetRoot(), node_path); 247 if (node) 248 SendChildren(node); 249 } 250 251 void CookiesViewHandler::SendChildren(const CookieTreeNode* parent) { 252 ListValue* children = new ListValue; 253 model_util_->GetChildNodeList(parent, 0, parent->child_count(), 254 children); 255 256 ListValue args; 257 args.Append(parent == cookies_tree_model_->GetRoot() ? 258 Value::CreateNullValue() : 259 new base::StringValue(model_util_->GetTreeNodeId(parent))); 260 args.Append(children); 261 262 web_ui()->CallJavascriptFunction("CookiesView.loadChildren", args); 263 } 264 265 void CookiesViewHandler::ReloadCookies(const base::ListValue* args) { 266 cookies_tree_model_.reset(); 267 268 EnsureCookiesTreeModelCreated(); 269 } 270 271 } // namespace options 272