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

Side by Side Diff: chrome/test/ui_test_utils.cc

Issue 6662001: ui_test_utils::NavigateToURLBlockUntilNavigationsComplete can be raced (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 9 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/test/ui_test_utils.h" 5 #include "chrome/test/ui_test_utils.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 int number_of_navigations) 61 int number_of_navigations)
62 : navigation_started_(false), 62 : navigation_started_(false),
63 navigations_completed_(0), 63 navigations_completed_(0),
64 number_of_navigations_(number_of_navigations) { 64 number_of_navigations_(number_of_navigations) {
65 registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED, 65 registrar_.Add(this, NotificationType::NAV_ENTRY_COMMITTED,
66 Source<NavigationController>(controller)); 66 Source<NavigationController>(controller));
67 registrar_.Add(this, NotificationType::LOAD_START, 67 registrar_.Add(this, NotificationType::LOAD_START,
68 Source<NavigationController>(controller)); 68 Source<NavigationController>(controller));
69 registrar_.Add(this, NotificationType::LOAD_STOP, 69 registrar_.Add(this, NotificationType::LOAD_STOP,
70 Source<NavigationController>(controller)); 70 Source<NavigationController>(controller));
71 }
72
73 void Run() {
71 RunMessageLoop(); 74 RunMessageLoop();
72 } 75 }
73 76
74 virtual void Observe(NotificationType type, 77 virtual void Observe(NotificationType type,
75 const NotificationSource& source, 78 const NotificationSource& source,
76 const NotificationDetails& details) { 79 const NotificationDetails& details) {
77 if (type == NotificationType::NAV_ENTRY_COMMITTED || 80 if (type == NotificationType::NAV_ENTRY_COMMITTED ||
78 type == NotificationType::LOAD_START) { 81 type == NotificationType::LOAD_START) {
79 navigation_started_ = true; 82 navigation_started_ = true;
80 } else if (type == NotificationType::LOAD_STOP) { 83 } else if (type == NotificationType::LOAD_STOP) {
81 if (navigation_started_ && 84 if (navigation_started_ &&
82 ++navigations_completed_ == number_of_navigations_) { 85 ++navigations_completed_ == number_of_navigations_) {
83 navigation_started_ = false; 86 navigation_started_ = false;
84 MessageLoopForUI::current()->Quit(); 87 MessageLoopForUI::current()->Quit();
sky 2011/03/09 21:52:50 Doesn't this mean Quit may be invoked before Run?
85 } 88 }
86 } 89 }
87 } 90 }
88 91
89 private: 92 private:
90 NotificationRegistrar registrar_; 93 NotificationRegistrar registrar_;
91 94
92 // If true the navigation has started. 95 // If true the navigation has started.
93 bool navigation_started_; 96 bool navigation_started_;
94 97
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 return true; 408 return true;
406 } 409 }
407 410
408 void WaitForNavigation(NavigationController* controller) { 411 void WaitForNavigation(NavigationController* controller) {
409 WaitForNavigations(controller, 1); 412 WaitForNavigations(controller, 1);
410 } 413 }
411 414
412 void WaitForNavigations(NavigationController* controller, 415 void WaitForNavigations(NavigationController* controller,
413 int number_of_navigations) { 416 int number_of_navigations) {
414 NavigationNotificationObserver observer(controller, number_of_navigations); 417 NavigationNotificationObserver observer(controller, number_of_navigations);
418 observer.Run();
415 } 419 }
416 420
417 void WaitForNewTab(Browser* browser) { 421 void WaitForNewTab(Browser* browser) {
418 TestNotificationObserver observer; 422 TestNotificationObserver observer;
419 RegisterAndWait(&observer, NotificationType::TAB_ADDED, 423 RegisterAndWait(&observer, NotificationType::TAB_ADDED,
420 Source<Browser>(browser)); 424 Source<Browser>(browser));
421 } 425 }
422 426
423 void WaitForBrowserActionUpdated(ExtensionAction* browser_action) { 427 void WaitForBrowserActionUpdated(ExtensionAction* browser_action) {
424 TestNotificationObserver observer; 428 TestNotificationObserver observer;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 // Navigates the specified tab (via |disposition|) of |browser| to |url|, 469 // Navigates the specified tab (via |disposition|) of |browser| to |url|,
466 // blocking until the |number_of_navigations| specified complete. 470 // blocking until the |number_of_navigations| specified complete.
467 // |disposition| indicates what tab the download occurs in, and 471 // |disposition| indicates what tab the download occurs in, and
468 // |browser_test_flags| controls what to wait for before continuing. 472 // |browser_test_flags| controls what to wait for before continuing.
469 static void NavigateToURLWithDispositionBlockUntilNavigationsComplete( 473 static void NavigateToURLWithDispositionBlockUntilNavigationsComplete(
470 Browser* browser, 474 Browser* browser,
471 const GURL& url, 475 const GURL& url,
472 int number_of_navigations, 476 int number_of_navigations,
473 WindowOpenDisposition disposition, 477 WindowOpenDisposition disposition,
474 int browser_test_flags) { 478 int browser_test_flags) {
479 NavigationNotificationObserver
480 same_tab_observer(&browser->GetSelectedTabContents()->controller(),
481 number_of_navigations);
482
475 std::set<Browser*> initial_browsers; 483 std::set<Browser*> initial_browsers;
476 for (std::vector<Browser*>::const_iterator iter = BrowserList::begin(); 484 for (std::vector<Browser*>::const_iterator iter = BrowserList::begin();
477 iter != BrowserList::end(); 485 iter != BrowserList::end();
478 ++iter) { 486 ++iter) {
479 initial_browsers.insert(*iter); 487 initial_browsers.insert(*iter);
480 } 488 }
481 browser->OpenURL(url, GURL(), disposition, PageTransition::TYPED); 489 browser->OpenURL(url, GURL(), disposition, PageTransition::TYPED);
482 if (browser_test_flags & BROWSER_TEST_WAIT_FOR_BROWSER) 490 if (browser_test_flags & BROWSER_TEST_WAIT_FOR_BROWSER)
483 browser = WaitForBrowserNotInSet(initial_browsers); 491 browser = WaitForBrowserNotInSet(initial_browsers);
484 if (browser_test_flags & BROWSER_TEST_WAIT_FOR_TAB) 492 if (browser_test_flags & BROWSER_TEST_WAIT_FOR_TAB)
485 WaitForNotification(NotificationType::TAB_ADDED); 493 WaitForNotification(NotificationType::TAB_ADDED);
486 if (!(browser_test_flags & BROWSER_TEST_WAIT_FOR_NAVIGATION)) { 494 if (!(browser_test_flags & BROWSER_TEST_WAIT_FOR_NAVIGATION)) {
487 // Some other flag caused the wait prior to this. 495 // Some other flag caused the wait prior to this.
488 return; 496 return;
489 } 497 }
490 TabContents* tab_contents = NULL; 498 TabContents* tab_contents = NULL;
491 if (disposition == NEW_BACKGROUND_TAB) { 499 if (disposition == NEW_BACKGROUND_TAB) {
492 // We've opened up a new tab, but not selected it. 500 // We've opened up a new tab, but not selected it.
493 tab_contents = browser->GetTabContentsAt(browser->selected_index() + 1); 501 tab_contents = browser->GetTabContentsAt(browser->selected_index() + 1);
494 EXPECT_TRUE(tab_contents != NULL) 502 EXPECT_TRUE(tab_contents != NULL)
495 << " Unable to wait for navigation to \"" << url.spec() 503 << " Unable to wait for navigation to \"" << url.spec()
496 << "\" because the new tab is not available yet"; 504 << "\" because the new tab is not available yet";
497 return; 505 return;
498 } else if ((disposition == CURRENT_TAB) || 506 } else if ((disposition == CURRENT_TAB) ||
499 (disposition == NEW_FOREGROUND_TAB) || 507 (disposition == NEW_FOREGROUND_TAB) ||
500 (disposition == SINGLETON_TAB)) { 508 (disposition == SINGLETON_TAB)) {
501 // The currently selected tab is the right one. 509 // The currently selected tab is the right one.
502 tab_contents = browser->GetSelectedTabContents(); 510 tab_contents = browser->GetSelectedTabContents();
503 } 511 }
504 if (tab_contents) { 512 if (disposition == CURRENT_TAB) {
513 same_tab_observer.Run();
514 return;
515 } else if (tab_contents) {
505 NavigationController* controller = &tab_contents->controller(); 516 NavigationController* controller = &tab_contents->controller();
506 WaitForNavigations(controller, number_of_navigations); 517 WaitForNavigations(controller, number_of_navigations);
507 return; 518 return;
508 } 519 }
509 EXPECT_TRUE(NULL != tab_contents) << " Unable to wait for navigation to \"" 520 EXPECT_TRUE(NULL != tab_contents) << " Unable to wait for navigation to \""
510 << url.spec() << "\"" 521 << url.spec() << "\""
511 << " because we can't get the tab contents"; 522 << " because we can't get the tab contents";
512 } 523 }
513 524
514 void NavigateToURLWithDisposition(Browser* browser, 525 void NavigateToURLWithDisposition(Browser* browser,
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 return taker.TakeRenderWidgetSnapshot(rwh, page_size, page_size, bitmap); 1056 return taker.TakeRenderWidgetSnapshot(rwh, page_size, page_size, bitmap);
1046 } 1057 }
1047 1058
1048 bool TakeEntirePageSnapshot(RenderViewHost* rvh, SkBitmap* bitmap) { 1059 bool TakeEntirePageSnapshot(RenderViewHost* rvh, SkBitmap* bitmap) {
1049 DCHECK(bitmap); 1060 DCHECK(bitmap);
1050 SnapshotTaker taker; 1061 SnapshotTaker taker;
1051 return taker.TakeEntirePageSnapshot(rvh, bitmap); 1062 return taker.TakeEntirePageSnapshot(rvh, bitmap);
1052 } 1063 }
1053 1064
1054 } // namespace ui_test_utils 1065 } // namespace ui_test_utils
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698