1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/bookmarks/bookmark_node_data.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <string> 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/pickle.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/url_constants.h" 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "net/base/escape.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/clipboard/scoped_clipboard_writer.h" 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_pasteboard_helper_mac.h" 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#else 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char* BookmarkNodeData::kClipboardFormatString = 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "chromium/x-bookmark-entries"; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::Element::Element() : is_url(false), id_(0) { 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::Element::Element(const BookmarkNode* node) 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : is_url(node->is_url()), 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url(node->GetURL()), 343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick title(node->GetTitle()), 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch id_(node->id()) { 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (int i = 0; i < node->child_count(); ++i) 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch children.push_back(Element(node->GetChild(i))); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::Element::~Element() { 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::Element::WriteToPickle(Pickle* pickle) const { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->WriteBool(is_url); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->WriteString(url.spec()); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->WriteString16(title); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->WriteInt64(id_); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!is_url) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->WriteSize(children.size()); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::vector<Element>::const_iterator i = children.begin(); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != children.end(); ++i) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i->WriteToPickle(pickle); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::Element::ReadFromPickle(Pickle* pickle, 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void** iterator) { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string url_spec; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!pickle->ReadBool(iterator, &is_url) || 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !pickle->ReadString(iterator, &url_spec) || 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !pickle->ReadString16(iterator, &title) || 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !pickle->ReadInt64(iterator, &id_)) { 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url = GURL(url_spec); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch children.clear(); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!is_url) { 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t children_count; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!pickle->ReadSize(iterator, &children_count)) 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch children.resize(children_count); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (std::vector<Element>::iterator i = children.begin(); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch i != children.end(); ++i) { 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!i->ReadFromPickle(pickle, iterator)) 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS) 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenui::OSExchangeData::CustomFormat BookmarkNodeData::GetBookmarkCustomFormat() { 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static ui::OSExchangeData::CustomFormat format; 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool format_valid = false; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!format_valid) { 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch format_valid = true; 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen format = ui::OSExchangeData::RegisterCustomFormat( 91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch BookmarkNodeData::kClipboardFormatString); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return format; 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::BookmarkNodeData() { 983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::BookmarkNodeData(const BookmarkNode* node) { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.push_back(Element(node)); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::BookmarkNodeData( 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<const BookmarkNode*>& nodes) { 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ReadFromVector(nodes); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochBookmarkNodeData::~BookmarkNodeData() { 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromVector( 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<const BookmarkNode*>& nodes) { 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Clear(); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (nodes.empty()) 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < nodes.size(); ++i) 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.push_back(Element(nodes[i])); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromTuple(const GURL& url, const string16& title) { 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Clear(); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!url.is_valid()) 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Element element; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch element.title = title; 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch element.url = url; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch element.is_url = true; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.push_back(element); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_MACOSX) 142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::WriteToClipboard(Profile* profile) const { 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::ScopedClipboardWriter scw(g_browser_process->clipboard()); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If there is only one element and it is a URL, write the URL to the 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // clipboard. 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (elements.size() == 1 && elements[0].is_url) { 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& title = elements[0].title; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string url = elements[0].url.spec(); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scw.WriteBookmark(title, url); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scw.WriteHyperlink(EscapeForHTML(title), url); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Also write the URL to the clipboard as text so that it can be pasted 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // into text fields. We use WriteText instead of WriteURL because we don't 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // want to clobber the X clipboard when the user copies out of the omnibox 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on Linux (on Windows and Mac, there is no difference between these 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // functions). 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scw.WriteText(UTF8ToUTF16(url)); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pickle pickle; 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteToPickle(profile, &pickle); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scw.WritePickledData(pickle, kClipboardFormatString); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromClipboard() { 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string data; 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::Clipboard* clipboard = g_browser_process->clipboard(); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch clipboard->ReadData(kClipboardFormatString, &data); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!data.empty()) { 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pickle pickle(data.data(), data.size()); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ReadFromPickle(&pickle)) 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 title; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string url; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch clipboard->ReadBookmark(&title, &url); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!url.empty()) { 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Element element; 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch element.is_url = true; 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch element.url = GURL(url); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch element.title = title; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.clear(); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.push_back(element); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ClipboardContainsBookmarks() { 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return g_browser_process->clipboard()->IsFormatAvailableByString( 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BookmarkNodeData::kClipboardFormatString, ui::Clipboard::BUFFER_STANDARD); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::WriteToClipboard(Profile* profile) const { 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bookmark_pasteboard_helper_mac::WriteToClipboard(elements, profile_path_); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromClipboard() { 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return bookmark_pasteboard_helper_mac::ReadFromClipboard(elements, 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &profile_path_); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromDragClipboard() { 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return bookmark_pasteboard_helper_mac::ReadFromDragClipboard(elements, 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &profile_path_); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ClipboardContainsBookmarks() { 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return bookmark_pasteboard_helper_mac::ClipboardContainsBookmarks(); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // !defined(OS_MACOSX) 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS) 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BookmarkNodeData::Write(Profile* profile, ui::OSExchangeData* data) const { 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(data); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If there is only one element and it is a URL, write the URL to the 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // clipboard. 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (elements.size() == 1 && elements[0].is_url) { 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (elements[0].url.SchemeIs(chrome::kJavaScriptScheme)) { 227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen data->SetString(UTF8ToUTF16(elements[0].url.spec())); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen data->SetURL(elements[0].url, elements[0].title); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pickle data_pickle; 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WriteToPickle(profile, &data_pickle); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch data->SetPickledData(GetBookmarkCustomFormat(), data_pickle); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool BookmarkNodeData::Read(const ui::OSExchangeData& data) { 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.clear(); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_path_.clear(); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (data.HasCustomFormat(GetBookmarkCustomFormat())) { 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pickle drag_data_pickle; 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (data.GetPickledData(GetBookmarkCustomFormat(), &drag_data_pickle)) { 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ReadFromPickle(&drag_data_pickle)) 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See if there is a URL on the clipboard. 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Element element; 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url; 254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen string16 title; 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (data.GetURLAndTitle(&url, &title)) 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ReadFromTuple(url, title); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return is_valid(); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::WriteToPickle(Profile* profile, Pickle* pickle) const { 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath path = profile ? profile->GetPath() : FilePath(); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath::WriteStringTypeToPickle(pickle, path.value()); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->WriteSize(elements.size()); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < elements.size(); ++i) 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements[i].WriteToPickle(pickle); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::ReadFromPickle(Pickle* pickle) { 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* data_iterator = NULL; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t element_count; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (FilePath::ReadStringTypeFromPickle(pickle, &data_iterator, 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &profile_path_) && 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch pickle->ReadSize(&data_iterator, &element_count)) { 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<Element> tmp_elements; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tmp_elements.resize(element_count); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < element_count; ++i) { 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!tmp_elements[i].ReadFromPickle(pickle, &data_iterator)) { 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.swap(tmp_elements); 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstd::vector<const BookmarkNode*> BookmarkNodeData::GetNodes( 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile) const { 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<const BookmarkNode*> nodes; 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!IsFromProfile(profile)) 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return nodes; 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < elements.size(); ++i) { 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BookmarkNode* node = 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile->GetBookmarkModel()->GetNodeByID(elements[i].id_); 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!node) { 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nodes.clear(); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return nodes; 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch nodes.push_back(node); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return nodes; 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst BookmarkNode* BookmarkNodeData::GetFirstNode(Profile* profile) const { 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<const BookmarkNode*> nodes = GetNodes(profile); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return nodes.size() == 1 ? nodes[0] : NULL; 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 315201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::Clear() { 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_path_.clear(); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch elements.clear(); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BookmarkNodeData::SetOriginatingProfile(Profile* profile) { 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile_path_.empty()); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (profile) 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_path_ = profile->GetPath().value(); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 327201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BookmarkNodeData::IsFromProfile(Profile* profile) const { 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An empty path means the data is not associated with any profile. 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return !profile_path_.empty() && profile_path_ == profile->GetPath().value(); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 331