Use multiline attribute to check for IA2_STATE_MULTILINE.
[chromium-blink-merge.git] / components / bookmarks / test / bookmark_test_helpers.cc
bloba8c6d942d4d707cbc532342a96d4efc5ca1ea263
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.
5 #include "components/bookmarks/test/bookmark_test_helpers.h"
7 #include "base/basictypes.h"
8 #include "base/callback.h"
9 #include "base/compiler_specific.h"
10 #include "base/logging.h"
11 #include "base/run_loop.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "components/bookmarks/browser/base_bookmark_model_observer.h"
14 #include "components/bookmarks/browser/bookmark_model.h"
15 #include "url/gurl.h"
17 namespace bookmarks {
18 namespace test {
20 namespace {
22 // BookmarkLoadObserver is used when blocking until the BookmarkModel finishes
23 // loading. As soon as the BookmarkModel finishes loading the message loop is
24 // quit.
25 class BookmarkLoadObserver : public BaseBookmarkModelObserver {
26 public:
27 explicit BookmarkLoadObserver(const base::Closure& quit_task);
28 ~BookmarkLoadObserver() override;
30 private:
31 // BaseBookmarkModelObserver:
32 void BookmarkModelChanged() override;
33 void BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) override;
35 base::Closure quit_task_;
37 DISALLOW_COPY_AND_ASSIGN(BookmarkLoadObserver);
40 BookmarkLoadObserver::BookmarkLoadObserver(const base::Closure& quit_task)
41 : quit_task_(quit_task) {}
43 BookmarkLoadObserver::~BookmarkLoadObserver() {}
45 void BookmarkLoadObserver::BookmarkModelChanged() {}
47 void BookmarkLoadObserver::BookmarkModelLoaded(BookmarkModel* model,
48 bool ids_reassigned) {
49 quit_task_.Run();
52 // Helper function which does the actual work of creating the nodes for
53 // a particular level in the hierarchy.
54 std::string::size_type AddNodesFromString(BookmarkModel* model,
55 const BookmarkNode* node,
56 const std::string& model_string,
57 std::string::size_type start_pos) {
58 DCHECK(node);
59 int index = node->child_count();
60 static const std::string folder_tell(":[");
61 std::string::size_type end_pos = model_string.find(' ', start_pos);
62 while (end_pos != std::string::npos) {
63 std::string::size_type part_length = end_pos - start_pos;
64 std::string node_name = model_string.substr(start_pos, part_length);
65 // Are we at the end of a folder group?
66 if (node_name != "]") {
67 // No, is it a folder?
68 std::string tell;
69 if (part_length > 2)
70 tell = node_name.substr(part_length - 2, 2);
71 if (tell == folder_tell) {
72 node_name = node_name.substr(0, part_length - 2);
73 const BookmarkNode* new_node =
74 model->AddFolder(node, index, base::UTF8ToUTF16(node_name));
75 end_pos = AddNodesFromString(model, new_node, model_string,
76 end_pos + 1);
77 } else {
78 std::string url_string("http://");
79 url_string += std::string(node_name.begin(), node_name.end());
80 url_string += ".com";
81 model->AddURL(
82 node, index, base::UTF8ToUTF16(node_name), GURL(url_string));
83 ++end_pos;
85 ++index;
86 start_pos = end_pos;
87 end_pos = model_string.find(' ', start_pos);
88 } else {
89 ++end_pos;
90 break;
93 return end_pos;
96 } // namespace
98 void WaitForBookmarkModelToLoad(BookmarkModel* model) {
99 if (model->loaded())
100 return;
101 base::RunLoop run_loop;
102 base::MessageLoop::ScopedNestableTaskAllower allow(
103 base::MessageLoop::current());
105 BookmarkLoadObserver observer(run_loop.QuitClosure());
106 model->AddObserver(&observer);
107 run_loop.Run();
108 model->RemoveObserver(&observer);
109 DCHECK(model->loaded());
112 std::string ModelStringFromNode(const BookmarkNode* node) {
113 // Since the children of the node are not available as a vector,
114 // we'll just have to do it the hard way.
115 int child_count = node->child_count();
116 std::string child_string;
117 for (int i = 0; i < child_count; ++i) {
118 const BookmarkNode* child = node->GetChild(i);
119 if (child->is_folder()) {
120 child_string += base::UTF16ToUTF8(child->GetTitle()) + ":[ " +
121 ModelStringFromNode(child) + "] ";
122 } else {
123 child_string += base::UTF16ToUTF8(child->GetTitle()) + " ";
126 return child_string;
129 void AddNodesFromModelString(BookmarkModel* model,
130 const BookmarkNode* node,
131 const std::string& model_string) {
132 DCHECK(node);
133 std::string::size_type start_pos = 0;
134 std::string::size_type end_pos =
135 AddNodesFromString(model, node, model_string, start_pos);
136 DCHECK(end_pos == std::string::npos);
139 } // namespace test
140 } // namespace bookmarks