OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/webui/options/cookies_view_handler.h" | 5 #include "chrome/browser/ui/webui/options/cookies_view_handler.h" |
6 | 6 |
7 #include "base/i18n/time_formatting.h" | |
8 #include "base/string_number_conversions.h" | |
9 #include "base/string_split.h" | |
10 #include "base/string_util.h" | |
11 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
12 #include "base/values.h" | 8 #include "base/values.h" |
13 #include "chrome/browser/browsing_data_appcache_helper.h" | 9 #include "chrome/browser/browsing_data_appcache_helper.h" |
14 #include "chrome/browser/browsing_data_database_helper.h" | 10 #include "chrome/browser/browsing_data_database_helper.h" |
15 #include "chrome/browser/browsing_data_indexed_db_helper.h" | 11 #include "chrome/browser/browsing_data_indexed_db_helper.h" |
16 #include "chrome/browser/browsing_data_local_storage_helper.h" | 12 #include "chrome/browser/browsing_data_local_storage_helper.h" |
17 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
| 14 #include "chrome/browser/ui/webui/cookies_tree_model_util.h" |
18 #include "grit/generated_resources.h" | 15 #include "grit/generated_resources.h" |
19 #include "net/base/cookie_monster.h" | |
20 #include "ui/base/l10n/l10n_util.h" | 16 #include "ui/base/l10n/l10n_util.h" |
21 | 17 |
22 namespace { | 18 namespace { |
23 | 19 |
24 static const char kKeyId[] = "id"; | |
25 static const char kKeyTitle[] = "title"; | |
26 static const char kKeyIcon[] = "icon"; | |
27 static const char kKeyType[] = "type"; | |
28 static const char kKeyHasChildren[] = "hasChildren"; | |
29 | |
30 static const char kKeyName[] = "name"; | |
31 static const char kKeyContent[] = "content"; | |
32 static const char kKeyDomain[] = "domain"; | |
33 static const char kKeyPath[] = "path"; | |
34 static const char kKeySendFor[] = "sendfor"; | |
35 static const char kKeyAccessibleToScript[] = "accessibleToScript"; | |
36 static const char kKeyDesc[] = "desc"; | |
37 static const char kKeySize[] = "size"; | |
38 static const char kKeyOrigin[] = "origin"; | |
39 static const char kKeyManifest[] = "manifest"; | |
40 | |
41 static const char kKeyAccessed[] = "accessed"; | |
42 static const char kKeyCreated[] = "created"; | |
43 static const char kKeyExpires[] = "expires"; | |
44 static const char kKeyModified[] = "modified"; | |
45 | |
46 // Encodes a pointer value into a hex string. | |
47 std::string PointerToHexString(const void* pointer) { | |
48 return base::HexEncode(&pointer, sizeof(pointer)); | |
49 } | |
50 | |
51 // Decodes a pointer from a hex string. | |
52 void* HexStringToPointer(const std::string& str) { | |
53 std::vector<uint8> buffer; | |
54 if (!base::HexStringToBytes(str, &buffer) || | |
55 buffer.size() != sizeof(void*)) { | |
56 return NULL; | |
57 } | |
58 | |
59 return *reinterpret_cast<void**>(&buffer[0]); | |
60 } | |
61 | |
62 // Populate given |dict| with cookie tree node properties. | |
63 void GetCookieTreeNodeDictionary(const CookieTreeNode& node, | |
64 DictionaryValue* dict) { | |
65 // Use node's address as an id for WebUI to look it up. | |
66 dict->SetString(kKeyId, PointerToHexString(&node)); | |
67 dict->SetString(kKeyTitle, node.GetTitle()); | |
68 dict->SetBoolean(kKeyHasChildren, !!node.GetChildCount()); | |
69 | |
70 switch (node.GetDetailedInfo().node_type) { | |
71 case CookieTreeNode::DetailedInfo::TYPE_ORIGIN: { | |
72 dict->SetString(kKeyType, "origin"); | |
73 #if defined(OS_MACOSX) | |
74 dict->SetString(kKeyIcon, "chrome://theme/IDR_BOOKMARK_BAR_FOLDER"); | |
75 #endif | |
76 break; | |
77 } | |
78 case CookieTreeNode::DetailedInfo::TYPE_COOKIE: { | |
79 dict->SetString(kKeyType, "cookie"); | |
80 dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_ICON"); | |
81 | |
82 const net::CookieMonster::CanonicalCookie& cookie = | |
83 *node.GetDetailedInfo().cookie; | |
84 | |
85 dict->SetString(kKeyName, cookie.Name()); | |
86 dict->SetString(kKeyContent, cookie.Value()); | |
87 dict->SetString(kKeyDomain, cookie.Domain()); | |
88 dict->SetString(kKeyPath, cookie.Path()); | |
89 dict->SetString(kKeySendFor, cookie.IsSecure() ? | |
90 l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_SENDFOR_SECURE) : | |
91 l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_SENDFOR_ANY)); | |
92 std::string accessible = cookie.IsHttpOnly() ? | |
93 l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_ACCESSIBLE_TO_SCRIPT_NO) : | |
94 l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_ACCESSIBLE_TO_SCRIPT_YES); | |
95 dict->SetString(kKeyAccessibleToScript, accessible); | |
96 dict->SetString(kKeyCreated, UTF16ToUTF8( | |
97 base::TimeFormatFriendlyDateAndTime(cookie.CreationDate()))); | |
98 dict->SetString(kKeyExpires, cookie.DoesExpire() ? UTF16ToUTF8( | |
99 base::TimeFormatFriendlyDateAndTime(cookie.ExpiryDate())) : | |
100 l10n_util::GetStringUTF8(IDS_COOKIES_COOKIE_EXPIRES_SESSION)); | |
101 | |
102 break; | |
103 } | |
104 case CookieTreeNode::DetailedInfo::TYPE_DATABASE: { | |
105 dict->SetString(kKeyType, "database"); | |
106 dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON"); | |
107 | |
108 const BrowsingDataDatabaseHelper::DatabaseInfo& database_info = | |
109 *node.GetDetailedInfo().database_info; | |
110 | |
111 dict->SetString(kKeyName, database_info.database_name.empty() ? | |
112 l10n_util::GetStringUTF8(IDS_COOKIES_WEB_DATABASE_UNNAMED_NAME) : | |
113 database_info.database_name); | |
114 dict->SetString(kKeyDesc, database_info.description); | |
115 dict->SetString(kKeySize, | |
116 FormatBytes(database_info.size, | |
117 GetByteDisplayUnits(database_info.size), | |
118 true)); | |
119 dict->SetString(kKeyModified, UTF16ToUTF8( | |
120 base::TimeFormatFriendlyDateAndTime(database_info.last_modified))); | |
121 | |
122 break; | |
123 } | |
124 case CookieTreeNode::DetailedInfo::TYPE_LOCAL_STORAGE: { | |
125 dict->SetString(kKeyType, "local_storage"); | |
126 dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON"); | |
127 | |
128 const BrowsingDataLocalStorageHelper::LocalStorageInfo& | |
129 local_storage_info = *node.GetDetailedInfo().local_storage_info; | |
130 | |
131 dict->SetString(kKeyOrigin, local_storage_info.origin); | |
132 dict->SetString(kKeySize, | |
133 FormatBytes(local_storage_info.size, | |
134 GetByteDisplayUnits(local_storage_info.size), | |
135 true)); | |
136 dict->SetString(kKeyModified, UTF16ToUTF8( | |
137 base::TimeFormatFriendlyDateAndTime( | |
138 local_storage_info.last_modified))); | |
139 | |
140 break; | |
141 } | |
142 case CookieTreeNode::DetailedInfo::TYPE_APPCACHE: { | |
143 dict->SetString(kKeyType, "app_cache"); | |
144 dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON"); | |
145 | |
146 const appcache::AppCacheInfo& appcache_info = | |
147 *node.GetDetailedInfo().appcache_info; | |
148 | |
149 dict->SetString(kKeyManifest, appcache_info.manifest_url.spec()); | |
150 dict->SetString(kKeySize, | |
151 FormatBytes(appcache_info.size, | |
152 GetByteDisplayUnits(appcache_info.size), | |
153 true)); | |
154 dict->SetString(kKeyCreated, UTF16ToUTF8( | |
155 base::TimeFormatFriendlyDateAndTime(appcache_info.creation_time))); | |
156 dict->SetString(kKeyAccessed, UTF16ToUTF8( | |
157 base::TimeFormatFriendlyDateAndTime(appcache_info.last_access_time))); | |
158 | |
159 break; | |
160 } | |
161 case CookieTreeNode::DetailedInfo::TYPE_INDEXED_DB: { | |
162 dict->SetString(kKeyType, "indexed_db"); | |
163 dict->SetString(kKeyIcon, "chrome://theme/IDR_COOKIE_STORAGE_ICON"); | |
164 | |
165 const BrowsingDataIndexedDBHelper::IndexedDBInfo& indexed_db_info = | |
166 *node.GetDetailedInfo().indexed_db_info; | |
167 | |
168 dict->SetString(kKeyOrigin, indexed_db_info.origin); | |
169 dict->SetString(kKeySize, | |
170 FormatBytes(indexed_db_info.size, | |
171 GetByteDisplayUnits(indexed_db_info.size), | |
172 true)); | |
173 dict->SetString(kKeyModified, UTF16ToUTF8( | |
174 base::TimeFormatFriendlyDateAndTime(indexed_db_info.last_modified))); | |
175 | |
176 break; | |
177 } | |
178 default: | |
179 #if defined(OS_MACOSX) | |
180 dict->SetString(kKeyIcon, "chrome://theme/IDR_BOOKMARK_BAR_FOLDER"); | |
181 #endif | |
182 break; | |
183 } | |
184 } | |
185 | |
186 // Append the children nodes of |parent| in specified range to |nodes| list. | |
187 void GetChildNodeList(CookieTreeNode* parent, int start, int count, | |
188 ListValue* nodes) { | |
189 for (int i = 0; i < count; ++i) { | |
190 DictionaryValue* dict = new DictionaryValue; | |
191 CookieTreeNode* child = parent->GetChild(start + i); | |
192 GetCookieTreeNodeDictionary(*child, dict); | |
193 nodes->Append(dict); | |
194 } | |
195 } | |
196 | |
197 // TODO(xiyuan): Remove this function when strings are updated. | 20 // TODO(xiyuan): Remove this function when strings are updated. |
198 // Remove "&" in button label for WebUI. | 21 // Remove "&" in button label for WebUI. |
199 string16 CleanButtonLabel(const string16& text) { | 22 string16 CleanButtonLabel(const string16& text) { |
200 string16 out(text); | 23 string16 out(text); |
201 ReplaceFirstSubstringAfterOffset(&out, 0, ASCIIToUTF16("&"), string16()); | 24 ReplaceFirstSubstringAfterOffset(&out, 0, ASCIIToUTF16("&"), string16()); |
202 return out; | 25 return out; |
203 } | 26 } |
204 | 27 |
205 } // namespace | 28 } // namespace |
206 | 29 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 } | 94 } |
272 | 95 |
273 void CookiesViewHandler::TreeNodesAdded(ui::TreeModel* model, | 96 void CookiesViewHandler::TreeNodesAdded(ui::TreeModel* model, |
274 ui::TreeModelNode* parent, | 97 ui::TreeModelNode* parent, |
275 int start, | 98 int start, |
276 int count) { | 99 int count) { |
277 // Skip if there is a batch update in progress. | 100 // Skip if there is a batch update in progress. |
278 if (batch_update_) | 101 if (batch_update_) |
279 return; | 102 return; |
280 | 103 |
| 104 CookieTreeNode* parent_node = cookies_tree_model_->AsNode(parent); |
| 105 |
281 ListValue* children = new ListValue; | 106 ListValue* children = new ListValue; |
282 GetChildNodeList(cookies_tree_model_->AsNode(parent), start, count, children); | 107 cookies_tree_model_util::GetChildNodeList(parent_node, start, count, |
| 108 children); |
283 | 109 |
284 ListValue args; | 110 ListValue args; |
285 args.Append(parent == cookies_tree_model_->GetRoot() ? | 111 args.Append(parent == cookies_tree_model_->GetRoot() ? |
286 Value::CreateNullValue() : | 112 Value::CreateNullValue() : |
287 Value::CreateStringValue(PointerToHexString(parent))); | 113 Value::CreateStringValue( |
| 114 cookies_tree_model_util::GetTreeNodeId(parent_node))); |
288 args.Append(Value::CreateIntegerValue(start)); | 115 args.Append(Value::CreateIntegerValue(start)); |
289 args.Append(children); | 116 args.Append(children); |
290 web_ui_->CallJavascriptFunction(L"CookiesView.onTreeItemAdded", args); | 117 web_ui_->CallJavascriptFunction(L"CookiesView.onTreeItemAdded", args); |
291 } | 118 } |
292 | 119 |
293 void CookiesViewHandler::TreeNodesRemoved(ui::TreeModel* model, | 120 void CookiesViewHandler::TreeNodesRemoved(ui::TreeModel* model, |
294 ui::TreeModelNode* parent, | 121 ui::TreeModelNode* parent, |
295 int start, | 122 int start, |
296 int count) { | 123 int count) { |
297 // Skip if there is a batch update in progress. | 124 // Skip if there is a batch update in progress. |
298 if (batch_update_) | 125 if (batch_update_) |
299 return; | 126 return; |
300 | 127 |
301 ListValue args; | 128 ListValue args; |
302 args.Append(parent == cookies_tree_model_->GetRoot() ? | 129 args.Append(parent == cookies_tree_model_->GetRoot() ? |
303 Value::CreateNullValue() : | 130 Value::CreateNullValue() : |
304 Value::CreateStringValue(PointerToHexString(parent))); | 131 Value::CreateStringValue(cookies_tree_model_util::GetTreeNodeId( |
| 132 cookies_tree_model_->AsNode(parent)))); |
305 args.Append(Value::CreateIntegerValue(start)); | 133 args.Append(Value::CreateIntegerValue(start)); |
306 args.Append(Value::CreateIntegerValue(count)); | 134 args.Append(Value::CreateIntegerValue(count)); |
307 web_ui_->CallJavascriptFunction(L"CookiesView.onTreeItemRemoved", args); | 135 web_ui_->CallJavascriptFunction(L"CookiesView.onTreeItemRemoved", args); |
308 } | 136 } |
309 | 137 |
310 void CookiesViewHandler::TreeModelBeginBatch(CookiesTreeModel* model) { | 138 void CookiesViewHandler::TreeModelBeginBatch(CookiesTreeModel* model) { |
311 DCHECK(!batch_update_); // There should be no nested batch begin. | 139 DCHECK(!batch_update_); // There should be no nested batch begin. |
312 batch_update_ = true; | 140 batch_update_ = true; |
313 } | 141 } |
314 | 142 |
(...skipping 28 matching lines...) Expand all Loading... |
343 void CookiesViewHandler::RemoveAll(const ListValue* args) { | 171 void CookiesViewHandler::RemoveAll(const ListValue* args) { |
344 cookies_tree_model_->DeleteAllStoredObjects(); | 172 cookies_tree_model_->DeleteAllStoredObjects(); |
345 } | 173 } |
346 | 174 |
347 void CookiesViewHandler::Remove(const ListValue* args) { | 175 void CookiesViewHandler::Remove(const ListValue* args) { |
348 std::string node_path; | 176 std::string node_path; |
349 if (!args->GetString(0, &node_path)){ | 177 if (!args->GetString(0, &node_path)){ |
350 return; | 178 return; |
351 } | 179 } |
352 | 180 |
353 CookieTreeNode* node = GetTreeNodeFromPath(node_path); | 181 CookieTreeNode* node = cookies_tree_model_util::GetTreeNodeFromPath( |
| 182 cookies_tree_model_->GetRoot(), node_path); |
354 if (node) | 183 if (node) |
355 cookies_tree_model_->DeleteCookieNode(node); | 184 cookies_tree_model_->DeleteCookieNode(node); |
356 } | 185 } |
357 | 186 |
358 void CookiesViewHandler::LoadChildren(const ListValue* args) { | 187 void CookiesViewHandler::LoadChildren(const ListValue* args) { |
359 std::string node_path; | 188 std::string node_path; |
360 if (!args->GetString(0, &node_path)){ | 189 if (!args->GetString(0, &node_path)){ |
361 return; | 190 return; |
362 } | 191 } |
363 | 192 |
364 CookieTreeNode* node = GetTreeNodeFromPath(node_path); | 193 CookieTreeNode* node = cookies_tree_model_util::GetTreeNodeFromPath( |
| 194 cookies_tree_model_->GetRoot(), node_path); |
365 if (node) | 195 if (node) |
366 SendChildren(node); | 196 SendChildren(node); |
367 } | 197 } |
368 | 198 |
369 CookieTreeNode* CookiesViewHandler::GetTreeNodeFromPath( | |
370 const std::string& path) { | |
371 std::vector<std::string> node_ids; | |
372 base::SplitString(path, ',', &node_ids); | |
373 | |
374 CookieTreeNode* child = NULL; | |
375 CookieTreeNode* parent = cookies_tree_model_->GetRoot(); | |
376 int child_index = -1; | |
377 | |
378 // Validate the tree path and get the node pointer. | |
379 for (size_t i = 0; i < node_ids.size(); ++i) { | |
380 child = reinterpret_cast<CookieTreeNode*>( | |
381 HexStringToPointer(node_ids[i])); | |
382 | |
383 child_index = parent->IndexOfChild(child); | |
384 if (child_index == -1) | |
385 break; | |
386 | |
387 parent = child; | |
388 } | |
389 | |
390 return child_index >= 0 ? child : NULL; | |
391 } | |
392 | |
393 void CookiesViewHandler::SendChildren(CookieTreeNode* parent) { | 199 void CookiesViewHandler::SendChildren(CookieTreeNode* parent) { |
394 ListValue* children = new ListValue; | 200 ListValue* children = new ListValue; |
395 GetChildNodeList(parent, 0, parent->GetChildCount(), children); | 201 cookies_tree_model_util::GetChildNodeList(parent, 0, parent->GetChildCount(), |
| 202 children); |
396 | 203 |
397 ListValue args; | 204 ListValue args; |
398 args.Append(parent == cookies_tree_model_->GetRoot() ? | 205 args.Append(parent == cookies_tree_model_->GetRoot() ? |
399 Value::CreateNullValue() : | 206 Value::CreateNullValue() : |
400 Value::CreateStringValue(PointerToHexString(parent))); | 207 Value::CreateStringValue(cookies_tree_model_util::GetTreeNodeId(parent))); |
401 args.Append(children); | 208 args.Append(children); |
402 | 209 |
403 web_ui_->CallJavascriptFunction(L"CookiesView.loadChildren", args); | 210 web_ui_->CallJavascriptFunction(L"CookiesView.loadChildren", args); |
404 } | 211 } |
OLD | NEW |