Home | History | Annotate | Download | only in extensions
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/extensions/extension_bookmark_helpers.h"
      6 
      7 #include "base/string_number_conversions.h"
      8 #include "base/values.h"
      9 #include "chrome/browser/bookmarks/bookmark_model.h"
     10 #include "chrome/browser/extensions/extension_bookmarks_module_constants.h"
     11 
     12 namespace keys = extension_bookmarks_module_constants;
     13 
     14 // Helper functions.
     15 namespace extension_bookmark_helpers {
     16 
     17 DictionaryValue* GetNodeDictionary(const BookmarkNode* node,
     18                                    bool recurse,
     19                                    bool only_folders) {
     20   DictionaryValue* dict = new DictionaryValue();
     21   dict->SetString(keys::kIdKey, base::Int64ToString(node->id()));
     22 
     23   const BookmarkNode* parent = node->parent();
     24   if (parent) {
     25     dict->SetString(keys::kParentIdKey, base::Int64ToString(parent->id()));
     26     dict->SetInteger(keys::kIndexKey, parent->GetIndexOf(node));
     27   }
     28 
     29   if (!node->is_folder()) {
     30     dict->SetString(keys::kUrlKey, node->GetURL().spec());
     31   } else {
     32     // Javascript Date wants milliseconds since the epoch, ToDoubleT is
     33     // seconds.
     34     base::Time t = node->date_folder_modified();
     35     if (!t.is_null())
     36       dict->SetDouble(keys::kDateFolderModifiedKey,
     37                       floor(t.ToDoubleT() * 1000));
     38   }
     39 
     40   dict->SetString(keys::kTitleKey, node->GetTitle());
     41   if (!node->date_added().is_null()) {
     42     // Javascript Date wants milliseconds since the epoch, ToDoubleT is
     43     // seconds.
     44     dict->SetDouble(keys::kDateAddedKey,
     45                     floor(node->date_added().ToDoubleT() * 1000));
     46   }
     47 
     48   if (recurse && node->is_folder()) {
     49     int childCount = node->child_count();
     50     ListValue* children = new ListValue();
     51     for (int i = 0; i < childCount; ++i) {
     52       const BookmarkNode* child = node->GetChild(i);
     53       if (!only_folders || child->is_folder()) {
     54         DictionaryValue* dict = GetNodeDictionary(child, true, only_folders);
     55         children->Append(dict);
     56       }
     57     }
     58     dict->Set(keys::kChildrenKey, children);
     59   }
     60   return dict;
     61 }
     62 
     63 void AddNode(const BookmarkNode* node,
     64              ListValue* list,
     65              bool recurse,
     66              bool only_folders) {
     67   DictionaryValue* dict = GetNodeDictionary(node, recurse, only_folders);
     68   list->Append(dict);
     69 }
     70 
     71 // Add a JSON representation of |node| to the JSON |list|.
     72 void AddNode(const BookmarkNode* node,
     73              ListValue* list,
     74              bool recurse) {
     75   return AddNode(node, list, recurse, false);
     76 }
     77 
     78 void AddNodeFoldersOnly(const BookmarkNode* node,
     79              ListValue* list,
     80              bool recurse) {
     81   return AddNode(node, list, recurse, true);
     82 }
     83 
     84 bool RemoveNode(BookmarkModel* model,
     85                 int64 id,
     86                 bool recursive,
     87                 std::string* error) {
     88   const BookmarkNode* node = model->GetNodeByID(id);
     89   if (!node) {
     90     *error = keys::kNoNodeError;
     91     return false;
     92   }
     93   if (node == model->root_node() ||
     94       node == model->other_node() ||
     95       node == model->GetBookmarkBarNode()) {
     96     *error = keys::kModifySpecialError;
     97     return false;
     98   }
     99   if (node->is_folder() && node->child_count() > 0 && !recursive) {
    100     *error = keys::kFolderNotEmptyError;
    101     return false;
    102   }
    103 
    104   const BookmarkNode* parent = node->parent();
    105   int index = parent->GetIndexOf(node);
    106   model->Remove(parent, index);
    107   return true;
    108 }
    109 
    110 }
    111