1 // Copyright (c) 2012 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 #ifndef CONTENT_PUBLIC_TEST_TEST_NAVIGATION_OBSERVER_H_ 6 #define CONTENT_PUBLIC_TEST_TEST_NAVIGATION_OBSERVER_H_ 7 8 #include <set> 9 10 #include "base/callback.h" 11 #include "base/compiler_specific.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "content/public/test/test_utils.h" 14 15 namespace content { 16 class WebContents; 17 struct LoadCommittedDetails; 18 19 // For browser_tests, which run on the UI thread, run a second 20 // MessageLoop and quit when the navigation completes loading. 21 class TestNavigationObserver { 22 public: 23 // Create and register a new TestNavigationObserver against the 24 // |web_contents|. 25 TestNavigationObserver(WebContents* web_contents, 26 int number_of_navigations); 27 // Like above but waits for one navigation. 28 explicit TestNavigationObserver(WebContents* web_contents); 29 30 virtual ~TestNavigationObserver(); 31 32 // Runs a nested message loop and blocks until the expected number of 33 // navigations are complete. 34 void Wait(); 35 36 // Start/stop watching newly created WebContents. 37 void StartWatchingNewWebContents(); 38 void StopWatchingNewWebContents(); 39 40 protected: 41 // Register this TestNavigationObserver as an observer of the |web_contents|. 42 void RegisterAsObserver(WebContents* web_contents); 43 44 private: 45 class TestWebContentsObserver; 46 47 // Callbacks for WebContents-related events. 48 void OnWebContentsCreated(WebContents* web_contents); 49 void OnWebContentsDestroyed(TestWebContentsObserver* observer, 50 WebContents* web_contents); 51 void OnNavigationEntryCommitted( 52 TestWebContentsObserver* observer, 53 WebContents* web_contents, 54 const LoadCommittedDetails& load_details); 55 void OnDidAttachInterstitialPage(WebContents* web_contents); 56 void OnDidStartLoading(WebContents* web_contents); 57 void OnDidStopLoading(WebContents* web_contents); 58 59 // If true the navigation has started. 60 bool navigation_started_; 61 62 // The number of navigations that have been completed. 63 int navigations_completed_; 64 65 // The number of navigations to wait for. 66 int number_of_navigations_; 67 68 // The MessageLoopRunner used to spin the message loop. 69 scoped_refptr<MessageLoopRunner> message_loop_runner_; 70 71 // Callback invoked on WebContents creation. 72 base::Callback<void(WebContents*)> web_contents_created_callback_; 73 74 // Living TestWebContentsObservers created by this observer. 75 std::set<TestWebContentsObserver*> web_contents_observers_; 76 77 DISALLOW_COPY_AND_ASSIGN(TestNavigationObserver); 78 }; 79 80 } // namespace content 81 82 #endif // CONTENT_PUBLIC_TEST_TEST_NAVIGATION_OBSERVER_H_ 83