OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/bookmarks/bookmark_extension_helpers.h" | 5 #include "chrome/browser/bookmarks/bookmark_extension_helpers.h" |
6 | 6 |
| 7 #include <vector> |
7 #include <math.h> // For floor() | 8 #include <math.h> // For floor() |
8 | 9 |
9 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| 11 #include "base/utf_string_conversions.h" |
10 #include "base/values.h" | 12 #include "base/values.h" |
11 #include "chrome/browser/bookmarks/bookmark_extension_api_constants.h" | 13 #include "chrome/browser/bookmarks/bookmark_extension_api_constants.h" |
12 #include "chrome/browser/bookmarks/bookmark_model.h" | 14 #include "chrome/browser/bookmarks/bookmark_model.h" |
| 15 #include "chrome/common/extensions/api/bookmarks.h" |
| 16 |
| 17 using extensions::api::bookmarks::BookmarkTreeNode; |
13 | 18 |
14 namespace keys = bookmark_extension_api_constants; | 19 namespace keys = bookmark_extension_api_constants; |
15 | 20 |
16 namespace { | 21 namespace { |
17 | 22 |
18 void AddNode(const BookmarkNode* node, | 23 void AddNode(const BookmarkNode* node, |
| 24 std::vector<linked_ptr<BookmarkTreeNode> >* nodes, |
| 25 bool recurse, |
| 26 bool only_folders) { |
| 27 if (node->IsVisible()) { |
| 28 linked_ptr<BookmarkTreeNode> new_node( |
| 29 bookmark_extension_helpers::GetBookmarkTreeNode(node, |
| 30 recurse, |
| 31 only_folders)); |
| 32 nodes->push_back(new_node); |
| 33 } |
| 34 } |
| 35 |
| 36 // TODO(mwrosen): Remove this function once chrome.experimental.bookmarkManager |
| 37 // is refactored to use the JSON schema compiler. |
| 38 void AddNode(const BookmarkNode* node, |
19 base::ListValue* list, | 39 base::ListValue* list, |
20 bool recurse, | 40 bool recurse, |
21 bool only_folders) { | 41 bool only_folders) { |
22 if (node->IsVisible()) { | 42 if (node->IsVisible()) { |
23 base::DictionaryValue* dict = bookmark_extension_helpers::GetNodeDictionary( | 43 base::DictionaryValue* dict = bookmark_extension_helpers::GetNodeDictionary( |
24 node, recurse, only_folders); | 44 node, recurse, only_folders); |
25 list->Append(dict); | 45 list->Append(dict); |
26 } | 46 } |
27 } | 47 } |
28 | 48 |
29 } // namespace | 49 } // namespace |
30 | 50 |
31 namespace bookmark_extension_helpers { | 51 namespace bookmark_extension_helpers { |
32 | 52 |
| 53 BookmarkTreeNode* GetBookmarkTreeNode(const BookmarkNode* node, |
| 54 bool recurse, |
| 55 bool only_folders) { |
| 56 BookmarkTreeNode* bookmark_tree_node = new BookmarkTreeNode; |
| 57 |
| 58 bookmark_tree_node->id = base::Int64ToString(node->id()); |
| 59 |
| 60 const BookmarkNode* parent = node->parent(); |
| 61 if (parent) { |
| 62 bookmark_tree_node->parent_id.reset(new std::string( |
| 63 base::Int64ToString(parent->id()))); |
| 64 bookmark_tree_node->index.reset(new int(parent->GetIndexOf(node))); |
| 65 } |
| 66 |
| 67 if (!node->is_folder()) { |
| 68 bookmark_tree_node->url.reset(new std::string(node->url().spec())); |
| 69 } else { |
| 70 // Javascript Date wants milliseconds since the epoch, ToDoubleT is seconds. |
| 71 base::Time t = node->date_folder_modified(); |
| 72 if (!t.is_null()) |
| 73 bookmark_tree_node->date_group_modified.reset( |
| 74 new double(floor(t.ToDoubleT() * 1000))); |
| 75 } |
| 76 |
| 77 bookmark_tree_node->title = UTF16ToUTF8(node->GetTitle()); |
| 78 if (!node->date_added().is_null()) { |
| 79 // Javascript Date wants milliseconds since the epoch, ToDoubleT is seconds. |
| 80 bookmark_tree_node->date_added.reset( |
| 81 new double(floor(node->date_added().ToDoubleT() * 1000))); |
| 82 } |
| 83 |
| 84 if (recurse && node->is_folder()) { |
| 85 std::vector<linked_ptr<BookmarkTreeNode> > children; |
| 86 for (int i = 0; i < node->child_count(); ++i) { |
| 87 const BookmarkNode* child = node->GetChild(i); |
| 88 if (child->IsVisible() && (!only_folders || child->is_folder())) { |
| 89 linked_ptr<BookmarkTreeNode> child_node( |
| 90 GetBookmarkTreeNode(child, true, only_folders)); |
| 91 children.push_back(child_node); |
| 92 } |
| 93 } |
| 94 bookmark_tree_node->children.reset( |
| 95 new std::vector<linked_ptr<BookmarkTreeNode> >(children)); |
| 96 } |
| 97 return bookmark_tree_node; |
| 98 } |
| 99 |
33 base::DictionaryValue* GetNodeDictionary(const BookmarkNode* node, | 100 base::DictionaryValue* GetNodeDictionary(const BookmarkNode* node, |
34 bool recurse, | 101 bool recurse, |
35 bool only_folders) { | 102 bool only_folders) { |
36 base::DictionaryValue* dict = new base::DictionaryValue; | 103 base::DictionaryValue* dict = new base::DictionaryValue; |
37 dict->SetString(keys::kIdKey, base::Int64ToString(node->id())); | 104 dict->SetString(keys::kIdKey, base::Int64ToString(node->id())); |
38 | 105 |
39 const BookmarkNode* parent = node->parent(); | 106 const BookmarkNode* parent = node->parent(); |
40 if (parent) { | 107 if (parent) { |
41 dict->SetString(keys::kParentIdKey, base::Int64ToString(parent->id())); | 108 dict->SetString(keys::kParentIdKey, base::Int64ToString(parent->id())); |
42 dict->SetInteger(keys::kIndexKey, parent->GetIndexOf(node)); | 109 dict->SetInteger(keys::kIndexKey, parent->GetIndexOf(node)); |
(...skipping 23 matching lines...) Expand all Loading... |
66 if (child->IsVisible() && (!only_folders || child->is_folder())) { | 133 if (child->IsVisible() && (!only_folders || child->is_folder())) { |
67 DictionaryValue* dict = GetNodeDictionary(child, true, only_folders); | 134 DictionaryValue* dict = GetNodeDictionary(child, true, only_folders); |
68 children->Append(dict); | 135 children->Append(dict); |
69 } | 136 } |
70 } | 137 } |
71 dict->Set(keys::kChildrenKey, children); | 138 dict->Set(keys::kChildrenKey, children); |
72 } | 139 } |
73 return dict; | 140 return dict; |
74 } | 141 } |
75 | 142 |
| 143 void AddNode(const BookmarkNode* node, |
| 144 std::vector<linked_ptr<BookmarkTreeNode> >* nodes, |
| 145 bool recurse) { |
| 146 return ::AddNode(node, nodes, recurse, false); |
| 147 } |
| 148 |
| 149 void AddNodeFoldersOnly(const BookmarkNode* node, |
| 150 std::vector<linked_ptr<BookmarkTreeNode> >* nodes, |
| 151 bool recurse) { |
| 152 return ::AddNode(node, nodes, recurse, true); |
| 153 } |
| 154 |
76 void AddNode(const BookmarkNode* node, base::ListValue* list, bool recurse) { | 155 void AddNode(const BookmarkNode* node, base::ListValue* list, bool recurse) { |
77 return ::AddNode(node, list, recurse, false); | 156 return ::AddNode(node, list, recurse, false); |
78 } | 157 } |
79 | 158 |
80 void AddNodeFoldersOnly(const BookmarkNode* node, | 159 void AddNodeFoldersOnly(const BookmarkNode* node, |
81 base::ListValue* list, | 160 base::ListValue* list, |
82 bool recurse) { | 161 bool recurse) { |
83 return ::AddNode(node, list, recurse, true); | 162 return ::AddNode(node, list, recurse, true); |
84 } | 163 } |
85 | 164 |
(...skipping 14 matching lines...) Expand all Loading... |
100 *error = keys::kFolderNotEmptyError; | 179 *error = keys::kFolderNotEmptyError; |
101 return false; | 180 return false; |
102 } | 181 } |
103 | 182 |
104 const BookmarkNode* parent = node->parent(); | 183 const BookmarkNode* parent = node->parent(); |
105 model->Remove(parent, parent->GetIndexOf(node)); | 184 model->Remove(parent, parent->GetIndexOf(node)); |
106 return true; | 185 return true; |
107 } | 186 } |
108 | 187 |
109 } // namespace bookmark_extension_helpers | 188 } // namespace bookmark_extension_helpers |
OLD | NEW |