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