Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(856)

Side by Side Diff: chrome/test/live_sync/bookmarks_helper.cc

Issue 7259005: Allow sync integration tests to operate on multiple datatypes: Preferences + Bookmarks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "chrome/test/live_sync/bookmarks_helper.h"
6
7 #include "base/rand_util.h"
8 #include "base/string_number_conversions.h"
9 #include "base/stringprintf.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/bookmarks/bookmark_model.h"
12 #include "chrome/browser/bookmarks/bookmark_model_observer.h"
13 #include "chrome/browser/bookmarks/bookmark_utils.h"
14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/browser/sync/glue/bookmark_change_processor.h"
16 #include "chrome/browser/sync/profile_sync_service_harness.h"
17 #include "chrome/test/live_sync/live_sync_test.h"
18 #include "chrome/test/ui_test_utils.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "third_party/skia/include/core/SkBitmap.h"
21 #include "ui/base/models/tree_node_iterator.h"
22 #include "ui/gfx/codec/png_codec.h"
23
24 namespace {
25
26 // Helper class used to wait for changes to take effect on the favicon of a
27 // particular bookmark node in a particular bookmark model.
28 class FaviconChangeObserver : public BookmarkModelObserver {
29 public:
30 FaviconChangeObserver(BookmarkModel* model, const BookmarkNode* node)
31 : model_(model),
32 node_(node),
33 wait_for_load_(false) {
34 model->AddObserver(this);
35 }
36 virtual ~FaviconChangeObserver() {
37 model_->RemoveObserver(this);
38 }
39 void WaitForGetFavicon() {
40 wait_for_load_ = true;
41 ui_test_utils::RunMessageLoop();
42 ASSERT_TRUE(node_->is_favicon_loaded());
43 }
44 void WaitForSetFavicon() {
45 wait_for_load_ = false;
46 ui_test_utils::RunMessageLoop();
47 }
48 virtual void Loaded(BookmarkModel* model, bool ids_reassigned) OVERRIDE {}
49 virtual void BookmarkNodeMoved(BookmarkModel* model,
50 const BookmarkNode* old_parent,
51 int old_index,
52 const BookmarkNode* new_parent,
53 int new_index) OVERRIDE {}
54 virtual void BookmarkNodeAdded(BookmarkModel* model,
55 const BookmarkNode* parent,
56 int index) OVERRIDE {}
57 virtual void BookmarkNodeRemoved(BookmarkModel* model,
58 const BookmarkNode* parent,
59 int old_index,
60 const BookmarkNode* node) OVERRIDE {}
61 virtual void BookmarkNodeChanged(BookmarkModel* model,
62 const BookmarkNode* node) OVERRIDE {
63 if (model == model_ && node == node_)
64 model->GetFavicon(node);
65 }
66 virtual void BookmarkNodeChildrenReordered(
67 BookmarkModel* model,
68 const BookmarkNode* node) OVERRIDE {}
69 virtual void BookmarkNodeFaviconChanged(
70 BookmarkModel* model,
71 const BookmarkNode* node) OVERRIDE {
72 if (model == model_ && node == node_) {
73 if (!wait_for_load_ || (wait_for_load_ && node->is_favicon_loaded()))
74 MessageLoopForUI::current()->Quit();
75 }
76 }
77
78 private:
79 BookmarkModel* model_;
80 const BookmarkNode* node_;
81 bool wait_for_load_;
82 DISALLOW_COPY_AND_ASSIGN(FaviconChangeObserver);
83 };
84
85 } // namespace
86
87 BookmarksHelper::BookmarksHelper() {}
88
89 BookmarksHelper::~BookmarksHelper() {}
90
91 // static
92 BookmarkModel* BookmarksHelper::GetBookmarkModel(int index) {
93 return test()->GetProfile(index)->GetBookmarkModel();
94 }
95
96 // static
97 const BookmarkNode* BookmarksHelper::GetBookmarkBarNode(int index) {
98 return GetBookmarkModel(index)->bookmark_bar_node();
99 }
100
101 // static
102 const BookmarkNode* BookmarksHelper::GetOtherNode(int index) {
103 return GetBookmarkModel(index)->other_node();
104 }
105
106 // static
107 BookmarkModel* BookmarksHelper::GetVerifierBookmarkModel() {
108 return test()->verifier()->GetBookmarkModel();
109 }
110
111 // static
112 bool BookmarksHelper::EnableEncryption(int index) {
113 return test()->GetClient(index)->EnableEncryptionForType(syncable::BOOKMARKS);
114 }
115
116 // static
117 bool BookmarksHelper::IsEncrypted(int index) {
118 return test()->GetClient(index)->IsTypeEncrypted(syncable::BOOKMARKS);
119 }
120
121 // static
122 const BookmarkNode* BookmarksHelper::AddURL(int profile,
123 const std::wstring& title,
124 const GURL& url) {
125 return AddURL(profile, GetBookmarkBarNode(profile), 0, title, url);
126 }
127
128 // static
129 const BookmarkNode* BookmarksHelper::AddURL(int profile,
130 int index,
131 const std::wstring& title,
132 const GURL& url) {
133 return AddURL(profile, GetBookmarkBarNode(profile), index, title, url);
134 }
135
136 // static
137 const BookmarkNode* BookmarksHelper::AddURL(int profile,
138 const BookmarkNode* parent,
139 int index,
140 const std::wstring& title,
141 const GURL& url) {
142 if (GetBookmarkModel(profile)->GetNodeByID(parent->id()) != parent) {
143 LOG(ERROR) << "Node " << parent->GetTitle() << " does not belong to "
144 << "Profile " << profile;
145 return NULL;
146 }
147 const BookmarkNode* result = GetBookmarkModel(profile)->
148 AddURL(parent, index, WideToUTF16(title), url);
149 if (!result) {
150 LOG(ERROR) << "Could not add bookmark " << title << " to Profile "
151 << profile;
152 return NULL;
153 }
154 if (test()->use_verifier()) {
155 const BookmarkNode* v_parent = NULL;
156 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
157 const BookmarkNode* v_node = GetVerifierBookmarkModel()->
158 AddURL(v_parent, index, WideToUTF16(title), url);
159 if (!v_node) {
160 LOG(ERROR) << "Could not add bookmark " << title << " to the verifier";
161 return NULL;
162 }
163 EXPECT_TRUE(NodesMatch(v_node, result));
164 }
165 return result;
166 }
167
168 // static
169 const BookmarkNode* BookmarksHelper::AddFolder(int profile,
170 const std::wstring& title) {
171 return AddFolder(profile, GetBookmarkBarNode(profile), 0, title);
172 }
173
174 // static
175 const BookmarkNode* BookmarksHelper::AddFolder(int profile,
176 int index,
177 const std::wstring& title) {
178 return AddFolder(profile, GetBookmarkBarNode(profile), index, title);
179 }
180
181 // static
182 const BookmarkNode* BookmarksHelper::AddFolder(int profile,
183 const BookmarkNode* parent,
184 int index,
185 const std::wstring& title) {
186 if (GetBookmarkModel(profile)->GetNodeByID(parent->id()) != parent) {
187 LOG(ERROR) << "Node " << parent->GetTitle() << " does not belong to "
188 << "Profile " << profile;
189 return NULL;
190 }
191 const BookmarkNode* result =
192 GetBookmarkModel(profile)->AddFolder(parent, index, WideToUTF16(title));
193 EXPECT_TRUE(result);
194 if (!result) {
195 LOG(ERROR) << "Could not add folder " << title << " to Profile "
196 << profile;
197 return NULL;
198 }
199 if (test()->use_verifier()) {
200 const BookmarkNode* v_parent = NULL;
201 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
202 const BookmarkNode* v_node = GetVerifierBookmarkModel()->AddFolder(
203 v_parent, index, WideToUTF16(title));
204 if (!v_node) {
205 LOG(ERROR) << "Could not add folder " << title << " to the verifier";
206 return NULL;
207 }
208 EXPECT_TRUE(NodesMatch(v_node, result));
209 }
210 return result;
211 }
212
213 // static
214 void BookmarksHelper::SetTitle(int profile,
215 const BookmarkNode* node,
216 const std::wstring& new_title) {
217 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node)
218 << "Node " << node->GetTitle() << " does not belong to "
219 << "Profile " << profile;
220 if (test()->use_verifier()) {
221 const BookmarkNode* v_node = NULL;
222 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
223 GetVerifierBookmarkModel()->SetTitle(v_node, WideToUTF16(new_title));
224 }
225 GetBookmarkModel(profile)->SetTitle(node, WideToUTF16(new_title));
226 }
227
228 // static
229 void BookmarksHelper::SetFavicon(
230 int profile,
231 const BookmarkNode* node,
232 const std::vector<unsigned char>& icon_bytes_vector) {
233 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node)
234 << "Node " << node->GetTitle() << " does not belong to "
235 << "Profile " << profile;
236 ASSERT_EQ(BookmarkNode::URL, node->type())
237 << "Node " << node->GetTitle() << " must be a url.";
238 if (urls_with_favicons_ == NULL)
239 urls_with_favicons_ = new std::set<GURL>();
240 urls_with_favicons_->insert(node->url());
241 if (test()->use_verifier()) {
242 const BookmarkNode* v_node = NULL;
243 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
244 FaviconChangeObserver v_observer(GetVerifierBookmarkModel(), v_node);
245 browser_sync::BookmarkChangeProcessor::ApplyBookmarkFavicon(
246 v_node, test()->verifier(), icon_bytes_vector);
247 v_observer.WaitForSetFavicon();
248 }
249 FaviconChangeObserver observer(GetBookmarkModel(profile), node);
250 browser_sync::BookmarkChangeProcessor::ApplyBookmarkFavicon(
251 node, test()->GetProfile(profile), icon_bytes_vector);
252 observer.WaitForSetFavicon();
253 }
254
255 // static
256 const BookmarkNode* BookmarksHelper::SetURL(int profile,
257 const BookmarkNode* node,
258 const GURL& new_url) {
259 if (GetBookmarkModel(profile)->GetNodeByID(node->id()) != node) {
260 LOG(ERROR) << "Node " << node->GetTitle() << " does not belong to "
261 << "Profile " << profile;
262 return NULL;
263 }
264 if (test()->use_verifier()) {
265 const BookmarkNode* v_node = NULL;
266 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
267 bookmark_utils::ApplyEditsWithNoFolderChange(
268 GetVerifierBookmarkModel(),
269 v_node->parent(),
270 BookmarkEditor::EditDetails(v_node),
271 v_node->GetTitle(),
272 new_url);
273 }
274 return bookmark_utils::ApplyEditsWithNoFolderChange(
275 GetBookmarkModel(profile),
276 node->parent(),
277 BookmarkEditor::EditDetails(node),
278 node->GetTitle(),
279 new_url);
280 }
281
282 // static
283 void BookmarksHelper::Move(int profile,
284 const BookmarkNode* node,
285 const BookmarkNode* new_parent,
286 int index) {
287 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(node->id()), node)
288 << "Node " << node->GetTitle() << " does not belong to "
289 << "Profile " << profile;
290 if (test()->use_verifier()) {
291 const BookmarkNode* v_new_parent = NULL;
292 const BookmarkNode* v_node = NULL;
293 FindNodeInVerifier(GetBookmarkModel(profile), new_parent, &v_new_parent);
294 FindNodeInVerifier(GetBookmarkModel(profile), node, &v_node);
295 GetVerifierBookmarkModel()->Move(v_node, v_new_parent, index);
296 }
297 GetBookmarkModel(profile)->Move(node, new_parent, index);
298 }
299
300 // static
301 void BookmarksHelper::Remove(int profile,
302 const BookmarkNode* parent,
303 int index) {
304 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(parent->id()), parent)
305 << "Node " << parent->GetTitle() << " does not belong to "
306 << "Profile " << profile;
307 if (test()->use_verifier()) {
tim (not reviewing) 2011/07/28 05:22:41 Almost (almost) seems like a job for inheritance+f
Raghu Simha 2011/07/28 09:36:54 I implemented this via a dynamic check because a t
308 const BookmarkNode* v_parent = NULL;
309 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
310 ASSERT_TRUE(NodesMatch(parent->GetChild(index), v_parent->GetChild(index)));
311 GetVerifierBookmarkModel()->Remove(v_parent, index);
312 }
313 GetBookmarkModel(profile)->Remove(parent, index);
314 }
315
316 // static
317 void BookmarksHelper::SortChildren(int profile,
318 const BookmarkNode* parent) {
319 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(parent->id()), parent)
320 << "Node " << parent->GetTitle() << " does not belong to "
321 << "Profile " << profile;
322 if (test()->use_verifier()) {
323 const BookmarkNode* v_parent = NULL;
324 FindNodeInVerifier(GetBookmarkModel(profile), parent, &v_parent);
325 GetVerifierBookmarkModel()->SortChildren(v_parent);
326 }
327 GetBookmarkModel(profile)->SortChildren(parent);
328 }
329
330 // static
331 void BookmarksHelper::ReverseChildOrder(int profile,
332 const BookmarkNode* parent) {
333 ASSERT_EQ(GetBookmarkModel(profile)->GetNodeByID(parent->id()), parent)
334 << "Node " << parent->GetTitle() << " does not belong to "
335 << "Profile " << profile;
336 int child_count = parent->child_count();
337 if (child_count <= 0)
338 return;
339 for (int index = 0; index < child_count; ++index) {
340 Move(profile, parent->GetChild(index), parent, child_count - index);
341 }
342 }
343
344 // static
345 bool BookmarksHelper::ModelMatchesVerifier(int profile) {
346 if (!test()->use_verifier()) {
347 LOG(ERROR) << "Illegal to call ModelMatchesVerifier() after "
348 << "DisableVerifier(). Use ModelsMatch() instead.";
349 return false;
350 }
351 return BookmarkModelsMatch(GetVerifierBookmarkModel(),
352 GetBookmarkModel(profile));
353 }
354
355 // static
356 bool BookmarksHelper::AllModelsMatchVerifier() {
357 for (int i = 0; i < test()->num_clients(); ++i) {
358 if (!ModelMatchesVerifier(i)) {
359 LOG(ERROR) << "Model " << i << " does not match the verifier.";
360 return false;
361 }
362 }
363 return true;
364 }
365
366 // static
367 bool BookmarksHelper::ModelsMatch(int profile_a, int profile_b) {
368 return BookmarkModelsMatch(GetBookmarkModel(profile_a),
369 GetBookmarkModel(profile_b));
370 }
371
372 // static
373 bool BookmarksHelper::AllModelsMatch() {
374 for (int i = 1; i < test()->num_clients(); ++i) {
375 if (!ModelsMatch(0, i)) {
376 LOG(ERROR) << "Model " << i << " does not match Model 0.";
377 return false;
378 }
379 }
380 return true;
381 }
382
383 // static
384 bool BookmarksHelper::ContainsDuplicateBookmarks(int profile) {
385 ui::TreeNodeIterator<const BookmarkNode> iterator(
386 GetBookmarkModel(profile)->root_node());
387 while (iterator.has_next()) {
388 const BookmarkNode* node = iterator.Next();
389 if (node->is_folder())
390 continue;
391 std::vector<const BookmarkNode*> nodes;
392 GetBookmarkModel(profile)->GetNodesByURL(node->url(), &nodes);
393 EXPECT_TRUE(nodes.size() >= 1);
394 for (std::vector<const BookmarkNode*>::const_iterator it = nodes.begin();
395 it != nodes.end(); ++it) {
396 if (node->id() != (*it)->id() &&
397 node->parent() == (*it)->parent() &&
398 node->GetTitle() == (*it)->GetTitle()){
399 return true;
400 }
401 }
402 }
403 return false;
404 }
405
406 // static
407 const BookmarkNode* BookmarksHelper::GetUniqueNodeByURL(int profile,
408 const GURL& url) {
409 std::vector<const BookmarkNode*> nodes;
410 GetBookmarkModel(profile)->GetNodesByURL(url, &nodes);
411 EXPECT_EQ(1U, nodes.size());
412 if (nodes.empty())
413 return NULL;
414 return nodes[0];
415 }
416
417 // static
418 int BookmarksHelper::CountBookmarksWithTitlesMatching(
419 int profile,
420 const std::wstring& title) {
421 return CountNodesWithTitlesMatching(GetBookmarkModel(profile),
422 BookmarkNode::URL,
423 WideToUTF16(title));
424 }
425
426 // static
427 int BookmarksHelper::CountFoldersWithTitlesMatching(
428 int profile,
429 const std::wstring& title) {
430 return CountNodesWithTitlesMatching(GetBookmarkModel(profile),
431 BookmarkNode::FOLDER,
432 WideToUTF16(title));
433 }
434
435 // static
436 int BookmarksHelper::CountNodesWithTitlesMatching(
437 BookmarkModel* model,
438 BookmarkNode::Type node_type,
439 const string16& title) {
440 ui::TreeNodeIterator<const BookmarkNode> iterator(model->root_node());
441 // Walk through the model tree looking for bookmark nodes of node type
442 // |node_type| whose titles match |title|.
443 int count = 0;
444 while (iterator.has_next()) {
445 const BookmarkNode* node = iterator.Next();
446 if ((node->type() == node_type) && (node->GetTitle() == title))
447 ++count;
448 }
449 return count;
450 }
451
452 // static
453 std::vector<unsigned char> BookmarksHelper::CreateFavicon(int seed) {
454 const int w = 16;
455 const int h = 16;
456 SkBitmap bmp;
457 bmp.setConfig(SkBitmap::kARGB_8888_Config, w, h);
458 bmp.allocPixels();
459 uint32_t* src_data = bmp.getAddr32(0, 0);
460 for (int i = 0; i < w * h; ++i) {
461 src_data[i] = SkPreMultiplyARGB((seed + i) % 255,
462 (seed + i) % 250,
463 (seed + i) % 245,
464 (seed + i) % 240);
465 }
466 std::vector<unsigned char> favicon;
467 gfx::PNGCodec::EncodeBGRASkBitmap(bmp, false, &favicon);
468 return favicon;
469 }
470
471 // static
472 std::string BookmarksHelper::IndexedURL(int i) {
473 return StringPrintf("http://www.host.ext:1234/path/filename/%d", i);
474 }
475
476 // static
477 std::wstring BookmarksHelper::IndexedURLTitle(int i) {
478 return StringPrintf(L"URL Title %d", i);
479 }
480
481 // static
482 std::wstring BookmarksHelper::IndexedFolderName(int i) {
483 return StringPrintf(L"Folder Name %d", i);
484 }
485
486 // static
487 std::wstring BookmarksHelper::IndexedSubfolderName(int i) {
488 return StringPrintf(L"Subfolder Name %d", i);
489 }
490
491 // static
492 std::wstring BookmarksHelper::IndexedSubsubfolderName(int i) {
493 return StringPrintf(L"Subsubfolder Name %d", i);
494 }
495
496 // static
497 void BookmarksHelper::FindNodeInVerifier(BookmarkModel* foreign_model,
498 const BookmarkNode* foreign_node,
499 const BookmarkNode** result) {
500 // Climb the tree.
501 std::stack<int> path;
502 const BookmarkNode* walker = foreign_node;
503 while (walker != foreign_model->root_node()) {
504 path.push(walker->parent()->GetIndexOf(walker));
505 walker = walker->parent();
506 }
507
508 // Swing over to the other tree.
509 walker = GetVerifierBookmarkModel()->root_node();
510
511 // Climb down.
512 while (!path.empty()) {
513 ASSERT_TRUE(walker->is_folder());
514 ASSERT_LT(path.top(), walker->child_count());
515 walker = walker->GetChild(path.top());
516 path.pop();
517 }
518
519 ASSERT_TRUE(NodesMatch(foreign_node, walker));
520 *result = walker;
521 }
522
523 // static
524 bool BookmarksHelper::BookmarkModelsMatch(BookmarkModel* model_a,
525 BookmarkModel* model_b) {
526 bool ret_val = true;
527 ui::TreeNodeIterator<const BookmarkNode> iterator_a(model_a->root_node());
528 ui::TreeNodeIterator<const BookmarkNode> iterator_b(model_b->root_node());
529 while (iterator_a.has_next()) {
530 const BookmarkNode* node_a = iterator_a.Next();
531 if (!iterator_b.has_next()) {
532 LOG(ERROR) << "Models do not match.";
533 return false;
534 }
535 const BookmarkNode* node_b = iterator_b.Next();
536 ret_val = ret_val && NodesMatch(node_a, node_b);
537 if (node_a->is_folder() || node_b->is_folder())
538 continue;
539 ret_val = ret_val && FaviconsMatch(model_a, model_b, node_a, node_b);
540 }
541 ret_val = ret_val && (!iterator_b.has_next());
542 return ret_val;
543 }
544
545 // static
546 bool BookmarksHelper::NodesMatch(const BookmarkNode* node_a,
547 const BookmarkNode* node_b) {
548 if (node_a == NULL || node_b == NULL)
549 return node_a == node_b;
550 if (node_a->is_folder() != node_b->is_folder()) {
551 LOG(ERROR) << "Cannot compare folder with bookmark";
552 return false;
553 }
554 if (node_a->GetTitle() != node_b->GetTitle()) {
555 LOG(ERROR) << "Title mismatch: " << node_a->GetTitle() << " vs. "
556 << node_b->GetTitle();
557 return false;
558 }
559 if (node_a->url() != node_b->url()) {
560 LOG(ERROR) << "URL mismatch: " << node_a->url() << " vs. "
561 << node_b->url();
562 return false;
563 }
564 if (node_a->parent()->GetIndexOf(node_a) !=
565 node_b->parent()->GetIndexOf(node_b)) {
566 LOG(ERROR) << "Index mismatch: "
567 << node_a->parent()->GetIndexOf(node_a) << " vs. "
568 << node_b->parent()->GetIndexOf(node_b);
569 return false;
570 }
571 return true;
572 }
573
574 // static
575 bool BookmarksHelper::FaviconsMatch(BookmarkModel* model_a,
576 BookmarkModel* model_b,
577 const BookmarkNode* node_a,
578 const BookmarkNode* node_b) {
579 const SkBitmap& bitmap_a = GetFavicon(model_a, node_a);
580 const SkBitmap& bitmap_b = GetFavicon(model_b, node_b);
581 return FaviconBitmapsMatch(bitmap_a, bitmap_b);
582 }
583
584 // static
585 const SkBitmap& BookmarksHelper::GetFavicon(BookmarkModel* model,
586 const BookmarkNode* node) {
587 // If a favicon wasn't explicitly set for a particular URL, simply return its
588 // blank favicon.
589 if (!urls_with_favicons_ ||
590 urls_with_favicons_->find(node->url()) == urls_with_favicons_->end()) {
591 return node->favicon();
592 }
593 // If a favicon was explicitly set, we may need to wait for it to be loaded
594 // via BookmarkModel::GetFavIcon(), which is an asynchronous operation.
595 if (!node->is_favicon_loaded()) {
596 FaviconChangeObserver observer(model, node);
597 model->GetFavicon(node);
598 observer.WaitForGetFavicon();
599 }
600 EXPECT_TRUE(node->is_favicon_loaded());
601 return node->favicon();
602 }
603
604 // static
605 bool BookmarksHelper::FaviconBitmapsMatch(const SkBitmap& bitmap_a,
606 const SkBitmap& bitmap_b) {
607 if (bitmap_a.getSize() == 0U && bitmap_a.getSize() == 0U)
608 return true;
609 if ((bitmap_a.getSize() != bitmap_b.getSize()) ||
610 (bitmap_a.width() != bitmap_b.width()) ||
611 (bitmap_a.height() != bitmap_b.height())) {
612 LOG(ERROR) << "Favicon size mismatch: " << bitmap_a.getSize() << " ("
613 << bitmap_a.width() << "x" << bitmap_a.height() << ") vs. "
614 << bitmap_b.getSize() << " (" << bitmap_b.width() << "x"
615 << bitmap_b.height() << ")";
616 return false;
617 }
618 SkAutoLockPixels bitmap_lock_a(bitmap_a);
619 SkAutoLockPixels bitmap_lock_b(bitmap_b);
620 void* node_pixel_addr_a = bitmap_a.getPixels();
621 EXPECT_TRUE(node_pixel_addr_a);
622 void* node_pixel_addr_b = bitmap_b.getPixels();
623 EXPECT_TRUE(node_pixel_addr_b);
624 if (memcmp(node_pixel_addr_a, node_pixel_addr_b, bitmap_a.getSize()) != 0) {
625 LOG(ERROR) << "Favicon bitmap mismatch";
626 return false;
627 } else {
628 return true;
629 }
630 }
631
632 // static
633 std::set<GURL>* BookmarksHelper::urls_with_favicons_ = NULL;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698