172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian 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
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h"
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string16.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/bookmarks/bookmark_node_data.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/dragdrop/os_exchange_data.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/dragdrop/os_exchange_data_provider_win.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass BookmarkNodeDataTest : public testing::Test {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeDataTest()
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : ui_thread_(BrowserThread::UI, &loop_),
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick        file_thread_(BrowserThread::FILE, &loop_) { }
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop loop_;
26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread file_thread_;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenui::OSExchangeData::Provider* CloneProvider(const ui::OSExchangeData& data) {
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return new ui::OSExchangeDataProviderWin(
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ui::OSExchangeDataProviderWin::GetIDataObject(data));
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Makes sure BookmarkNodeData is initially invalid.
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, InitialState) {
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData data;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(data.is_valid());
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Makes sure reading bogus data leaves the BookmarkNodeData invalid.
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, BogusRead) {
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data;
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData drag_data;
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_FALSE(drag_data.Read(ui::OSExchangeData(CloneProvider(data))));
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(drag_data.is_valid());
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Writes a URL to the clipboard and make sure BookmarkNodeData can correctly
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// read it.
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, JustURL) {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL url("http://google.com");
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring title(L"title");
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data.SetURL(url, title);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData drag_data;
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(drag_data.Read(ui::OSExchangeData(CloneProvider(data))));
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(drag_data.is_valid());
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, drag_data.elements.size());
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(drag_data.elements[0].is_url);
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(url, drag_data.elements[0].url);
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(title, drag_data.elements[0].title);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, drag_data.elements[0].children.size());
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, URL) {
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Write a single node representing a URL to the clipboard.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile profile;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.CreateBookmarkModel(false);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.BlockUntilBookmarkModelLoaded();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.SetID(L"id");
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model = profile.GetBookmarkModel();
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* root = model->GetBookmarkBarNode();
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(GURL("http://foo.com"));
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const string16 title(ASCIIToUTF16("blah"));
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* node = model->AddURL(root, 0, title, url);
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData drag_data(node);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(drag_data.is_valid());
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, drag_data.elements.size());
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(drag_data.elements[0].is_url);
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(url, drag_data.elements[0].url);
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(title, WideToUTF16Hack(drag_data.elements[0].title));
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  drag_data.Write(&profile, &data);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now read the data back in.
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data2(CloneProvider(data));
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData read_data;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.Read(data2));
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.is_valid());
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, read_data.elements.size());
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.elements[0].is_url);
993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(url, read_data.elements[0].url);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(title, read_data.elements[0].title);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.GetFirstNode(&profile) == node);
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure asking for the node with a different profile returns NULL.
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestingProfile profile2;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.GetFirstNode(&profile2) == NULL);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Writing should also put the URL and title on the clipboard.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL read_url;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring read_title;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(data2.GetURLAndTitle(&read_url, &read_title));
1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(url, read_url);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(title, read_title);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Tests writing a folder to the clipboard.
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(BookmarkNodeDataTest, Folder) {
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile profile;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.CreateBookmarkModel(false);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.BlockUntilBookmarkModelLoaded();
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.SetID(L"id");
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model = profile.GetBookmarkModel();
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* root = model->GetBookmarkBarNode();
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* g1 = model->AddFolder(root, 0, ASCIIToUTF16("g1"));
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* g11 = model->AddFolder(g1, 0, ASCIIToUTF16("g11"));
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* g12 = model->AddFolder(g1, 0, ASCIIToUTF16("g12"));
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData drag_data(g12);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(drag_data.is_valid());
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, drag_data.elements.size());
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(g12->GetTitle(), WideToUTF16Hack(drag_data.elements[0].title));
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(drag_data.elements[0].is_url);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data;
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  drag_data.Write(&profile, &data);
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now read the data back in.
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data2(CloneProvider(data));
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData read_data;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.Read(data2));
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.is_valid());
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, read_data.elements.size());
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(g12->GetTitle(), WideToUTF16Hack(read_data.elements[0].title));
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(read_data.elements[0].is_url);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should get back the same node when asking for the same profile.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* r_g12 = read_data.GetFirstNode(&profile);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(g12 == r_g12);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A different profile should return NULL for the node.
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestingProfile profile2;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.GetFirstNode(&profile2) == NULL);
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests reading/writing a folder with children.
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(BookmarkNodeDataTest, FolderWithChild) {
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile profile;
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.SetID(L"id");
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.CreateBookmarkModel(false);
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.BlockUntilBookmarkModelLoaded();
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model = profile.GetBookmarkModel();
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* root = model->GetBookmarkBarNode();
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* folder = model->AddFolder(root, 0, ASCIIToUTF16("g1"));
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(GURL("http://foo.com"));
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const string16 title(ASCIIToUTF16("blah2"));
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  model->AddURL(folder, 0, title, url);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BookmarkNodeData drag_data(folder);
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  drag_data.Write(&profile, &data);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now read the data back in.
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data2(CloneProvider(data));
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData read_data;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.Read(data2));
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, read_data.elements.size());
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, read_data.elements[0].children.size());
180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const BookmarkNodeData::Element& read_child =
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      read_data.elements[0].children[0];
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_child.is_url);
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(title, WideToUTF16Hack(read_child.title));
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(url, read_child.url);
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_child.is_url);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure we get the node back.
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* r_folder = read_data.GetFirstNode(&profile);
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(folder == r_folder);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests reading/writing of multiple nodes.
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BookmarkNodeDataTest, MultipleNodes) {
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestingProfile profile;
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.SetID(L"id");
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.CreateBookmarkModel(false);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  profile.BlockUntilBookmarkModelLoaded();
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model = profile.GetBookmarkModel();
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const BookmarkNode* root = model->GetBookmarkBarNode();
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* folder = model->AddFolder(root, 0, ASCIIToUTF16("g1"));
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(GURL("http://foo.com"));
2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const string16 title(ASCIIToUTF16("blah2"));
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNode* url_node = model->AddURL(folder, 0, title, url);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Write the nodes to the clipboard.
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<const BookmarkNode*> nodes;
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  nodes.push_back(folder);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nodes.push_back(url_node);
212201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData drag_data(nodes);
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  drag_data.Write(&profile, &data);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Read the data back in.
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::OSExchangeData data2(CloneProvider(data));
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BookmarkNodeData read_data;
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.Read(data2));
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.is_valid());
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, read_data.elements.size());
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, read_data.elements[0].children.size());
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const BookmarkNodeData::Element& read_folder = read_data.elements[0];
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(read_folder.is_url);
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(L"g1", read_folder.title);
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(1, read_folder.children.size());
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const BookmarkNodeData::Element& read_url = read_data.elements[1];
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_url.is_url);
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(title, WideToUTF16Hack(read_url.title));
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, read_url.children.size());
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And make sure we get the node back.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<const BookmarkNode*> read_nodes = read_data.GetNodes(&profile);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, read_nodes.size());
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(read_nodes[0] == folder);
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_nodes[1] == url_node);
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Asking for the first node should return NULL with more than one element
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // present.
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(read_data.GetFirstNode(&profile) == NULL);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
244