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 15namespace content { 16class WebContents; 17struct LoadCommittedDetails; 18 19// For browser_tests, which run on the UI thread, run a second 20// MessageLoop and quit when the navigation completes loading. 21class 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