15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/time/time.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_node.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/clipboard/clipboard_types.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "url/gurl.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass BookmarkModel; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pickle; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PickleIterator; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace bookmarks { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkNodeData is used to represent the following: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . A single URL. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . A single node from the bookmark model. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// . A set of nodes from the bookmark model. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkNodeData is used by bookmark related views to represent a dragged 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bookmark or bookmarks. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typical usage when writing data for a drag is: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkNodeData data(node_user_is_dragging); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data.Write(os_exchange_data_for_drag); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typical usage to read is: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BookmarkNodeData data; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if (data.Read(os_exchange_data)) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // data is valid, contents are in elements. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BookmarkNodeData { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Element represents a single node. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Element { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Element(const BookmarkNode* node); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Element(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If true, this element represents a URL. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_url; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL, only valid if is_url is true. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Title of the entry, used for both urls and folders. 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Date of when this node was created. 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Time date_added; 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Date of the last modification. Only used for folders. 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::Time date_folder_modified; 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Children, only used for non-URL nodes. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Element> children; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Meta info for the bookmark node. 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BookmarkNode::MetaInfoMap meta_info_map; 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int64 id() const { return id_; } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct BookmarkNodeData; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For reading/writing this Element. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void WriteToPickle(Pickle* pickle) const; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReadFromPickle(Pickle* pickle, PickleIterator* iterator); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ID of the node. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 id_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // The MIME type for the clipboard format for BookmarkNodeData. 87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static const char* kClipboardFormatString; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) BookmarkNodeData(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Created a BookmarkNodeData populated from the arguments. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BookmarkNodeData(const BookmarkNode* node); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit BookmarkNodeData(const std::vector<const BookmarkNode*>& nodes); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~BookmarkNodeData(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(TOOLKIT_VIEWS) 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static const ui::OSExchangeData::CustomFormat& GetBookmarkCustomFormat(); 99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#endif 100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) static bool ClipboardContainsBookmarks(); 102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads bookmarks from the given vector. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReadFromVector(const std::vector<const BookmarkNode*>& nodes); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a single-bookmark DragData from url/title pair. 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool ReadFromTuple(const GURL& url, const base::string16& title); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Writes bookmarks to the specified clipboard. 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void WriteToClipboard(ui::ClipboardType type); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Reads bookmarks from the specified clipboard. Prefers data written via 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // WriteToClipboard() but will also attempt to read a plain bookmark. 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool ReadFromClipboard(ui::ClipboardType type); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(TOOLKIT_VIEWS) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writes elements to data. If there is only one element and it is a URL 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the URL and title are written to the clipboard in a format other apps can 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use. 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // |profile_path| is used to identify which profile the data came from. Use an 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // empty path to indicate that the data is not associated with any profile. 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void Write(const base::FilePath& profile_path, 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui::OSExchangeData* data) const; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restores this data from the clipboard, returning true on success. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Read(const ui::OSExchangeData& data); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writes the data for a drag to |pickle|. 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void WriteToPickle(const base::FilePath& profile_path, Pickle* pickle) const; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads the data for a drag from a |pickle|. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReadFromPickle(Pickle* pickle); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the nodes represented by this DragData. If this DragData was 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created from the same profile then the nodes from the model are returned. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the nodes can't be found (may have been deleted), an empty vector is 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // returned. 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::vector<const BookmarkNode*> GetNodes( 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BookmarkModel* model, 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::FilePath& profile_path) const; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience for getting the first node. Returns NULL if the data doesn't 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // match any nodes or there is more than one node. 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const BookmarkNode* GetFirstNode(BookmarkModel* model, 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::FilePath& profile_path) const; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Do we contain valid data? 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_valid() const { return !elements.empty(); } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there is a single url. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_single_url() const { return is_valid() && elements[0].is_url; } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Number of elements. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const { return elements.size(); } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clears the data. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Sets |profile_path_|. This is useful for the constructors/readers that 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // don't set it. This should only be called if the profile path is not 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // already set. 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void SetOriginatingProfilePath(const base::FilePath& profile_path); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns true if this data is from the specified profile path. 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool IsFromProfilePath(const base::FilePath& profile_path) const; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual elements written to the clipboard. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<Element> elements; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Path of the profile we originated from. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath profile_path_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace bookmarks 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // COMPONENTS_BOOKMARKS_BROWSER_BOOKMARK_NODE_DATA_H_ 179