1// Copyright 2014 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 "components/bookmarks/browser/bookmark_node_data.h"
6
7#include "base/logging.h"
8#include "base/pickle.h"
9#include "base/strings/utf_string_conversions.h"
10#include "ui/base/clipboard/clipboard.h"
11
12namespace bookmarks {
13
14namespace {
15
16const char kJavaScriptScheme[] = "javascript";
17
18}  // namespace
19
20// static
21const ui::OSExchangeData::CustomFormat&
22BookmarkNodeData::GetBookmarkCustomFormat() {
23  CR_DEFINE_STATIC_LOCAL(
24      ui::OSExchangeData::CustomFormat,
25      format,
26      (ui::Clipboard::GetFormatType(BookmarkNodeData::kClipboardFormatString)));
27
28  return format;
29}
30
31void BookmarkNodeData::Write(const base::FilePath& profile_path,
32                             ui::OSExchangeData* data) const {
33  DCHECK(data);
34
35  // If there is only one element and it is a URL, write the URL to the
36  // clipboard.
37  if (elements.size() == 1 && elements[0].is_url) {
38    if (elements[0].url.SchemeIs(kJavaScriptScheme)) {
39      data->SetString(base::UTF8ToUTF16(elements[0].url.spec()));
40    } else {
41      data->SetURL(elements[0].url, elements[0].title);
42    }
43  }
44
45  Pickle data_pickle;
46  WriteToPickle(profile_path, &data_pickle);
47
48  data->SetPickledData(GetBookmarkCustomFormat(), data_pickle);
49}
50
51bool BookmarkNodeData::Read(const ui::OSExchangeData& data) {
52  elements.clear();
53
54  profile_path_.clear();
55
56  if (data.HasCustomFormat(GetBookmarkCustomFormat())) {
57    Pickle drag_data_pickle;
58    if (data.GetPickledData(GetBookmarkCustomFormat(), &drag_data_pickle)) {
59      if (!ReadFromPickle(&drag_data_pickle))
60        return false;
61    }
62  } else {
63    // See if there is a URL on the clipboard.
64    Element element;
65    GURL url;
66    base::string16 title;
67    if (data.GetURLAndTitle(
68            ui::OSExchangeData::CONVERT_FILENAMES, &url, &title))
69      ReadFromTuple(url, title);
70  }
71
72  return is_valid();
73}
74
75}  // namespace bookmarks
76