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 <math.h> // For floor() | 7 #include <math.h> // For floor() |
| 8 #include <vector> |
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 |
| 78 bookmark_tree_node->title = UTF16ToUTF8(node->GetTitle()); |
| 79 if (!node->date_added().is_null()) { |
| 80 // Javascript Date wants milliseconds since the epoch, ToDoubleT is seconds. |
| 81 bookmark_tree_node->date_added.reset( |
| 82 new double(floor(node->date_added().ToDoubleT() * 1000))); |
| 83 } |
| 84 |
| 85 if (recurse && node->is_folder()) { |
| 86 std::vector<linked_ptr<BookmarkTreeNode> > children; |
| 87 for (int i = 0; i < node->child_count(); ++i) { |
| 88 const BookmarkNode* child = node->GetChild(i); |
| 89 if (child->IsVisible() && (!only_folders || child->is_folder())) { |
| 90 linked_ptr<BookmarkTreeNode> child_node( |
| 91 GetBookmarkTreeNode(child, true, only_folders)); |
| 92 children.push_back(child_node); |
| 93 } |
| 94 } |
| 95 bookmark_tree_node->children.reset( |
| 96 new std::vector<linked_ptr<BookmarkTreeNode> >(children)); |
| 97 } |
| 98 return bookmark_tree_node; |
| 99 } |
| 100 |
33 base::DictionaryValue* GetNodeDictionary(const BookmarkNode* node, | 101 base::DictionaryValue* GetNodeDictionary(const BookmarkNode* node, |
34 bool recurse, | 102 bool recurse, |
35 bool only_folders) { | 103 bool only_folders) { |
36 base::DictionaryValue* dict = new base::DictionaryValue; | 104 base::DictionaryValue* dict = new base::DictionaryValue; |
37 dict->SetString(keys::kIdKey, base::Int64ToString(node->id())); | 105 dict->SetString(keys::kIdKey, base::Int64ToString(node->id())); |
38 | 106 |
39 const BookmarkNode* parent = node->parent(); | 107 const BookmarkNode* parent = node->parent(); |
40 if (parent) { | 108 if (parent) { |
41 dict->SetString(keys::kParentIdKey, base::Int64ToString(parent->id())); | 109 dict->SetString(keys::kParentIdKey, base::Int64ToString(parent->id())); |
42 dict->SetInteger(keys::kIndexKey, parent->GetIndexOf(node)); | 110 dict->SetInteger(keys::kIndexKey, parent->GetIndexOf(node)); |
(...skipping 23 matching lines...) Expand all Loading... |
66 if (child->IsVisible() && (!only_folders || child->is_folder())) { | 134 if (child->IsVisible() && (!only_folders || child->is_folder())) { |
67 DictionaryValue* dict = GetNodeDictionary(child, true, only_folders); | 135 DictionaryValue* dict = GetNodeDictionary(child, true, only_folders); |
68 children->Append(dict); | 136 children->Append(dict); |
69 } | 137 } |
70 } | 138 } |
71 dict->Set(keys::kChildrenKey, children); | 139 dict->Set(keys::kChildrenKey, children); |
72 } | 140 } |
73 return dict; | 141 return dict; |
74 } | 142 } |
75 | 143 |
| 144 void AddNode(const BookmarkNode* node, |
| 145 std::vector<linked_ptr<BookmarkTreeNode> >* nodes, |
| 146 bool recurse) { |
| 147 return ::AddNode(node, nodes, recurse, false); |
| 148 } |
| 149 |
| 150 void AddNodeFoldersOnly(const BookmarkNode* node, |
| 151 std::vector<linked_ptr<BookmarkTreeNode> >* nodes, |
| 152 bool recurse) { |
| 153 return ::AddNode(node, nodes, recurse, true); |
| 154 } |
| 155 |
76 void AddNode(const BookmarkNode* node, base::ListValue* list, bool recurse) { | 156 void AddNode(const BookmarkNode* node, base::ListValue* list, bool recurse) { |
77 return ::AddNode(node, list, recurse, false); | 157 return ::AddNode(node, list, recurse, false); |
78 } | 158 } |
79 | 159 |
80 void AddNodeFoldersOnly(const BookmarkNode* node, | 160 void AddNodeFoldersOnly(const BookmarkNode* node, |
81 base::ListValue* list, | 161 base::ListValue* list, |
82 bool recurse) { | 162 bool recurse) { |
83 return ::AddNode(node, list, recurse, true); | 163 return ::AddNode(node, list, recurse, true); |
84 } | 164 } |
85 | 165 |
(...skipping 14 matching lines...) Expand all Loading... |
100 *error = keys::kFolderNotEmptyError; | 180 *error = keys::kFolderNotEmptyError; |
101 return false; | 181 return false; |
102 } | 182 } |
103 | 183 |
104 const BookmarkNode* parent = node->parent(); | 184 const BookmarkNode* parent = node->parent(); |
105 model->Remove(parent, parent->GetIndexOf(node)); | 185 model->Remove(parent, parent->GetIndexOf(node)); |
106 return true; | 186 return true; |
107 } | 187 } |
108 | 188 |
109 } // namespace bookmark_extension_helpers | 189 } // namespace bookmark_extension_helpers |
OLD | NEW |