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. 4 5#include "content/test/test_frame_navigation_observer.h" 6 7#include "base/bind.h" 8#include "base/message_loop/message_loop.h" 9#include "base/run_loop.h" 10#include "base/stl_util.h" 11#include "content/browser/frame_host/navigation_entry_impl.h" 12#include "content/browser/frame_host/render_frame_host_impl.h" 13#include "content/browser/renderer_host/render_view_host_impl.h" 14#include "content/browser/web_contents/web_contents_impl.h" 15#include "content/public/browser/web_contents_observer.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18namespace content { 19 20TestFrameNavigationObserver::TestFrameNavigationObserver( 21 FrameTreeNode* node, 22 int number_of_navigations) 23 : WebContentsObserver( 24 node->current_frame_host()->delegate()->GetAsWebContents()), 25 frame_tree_node_id_(node->frame_tree_node_id()), 26 navigation_started_(false), 27 navigations_completed_(0), 28 number_of_navigations_(number_of_navigations), 29 message_loop_runner_(new MessageLoopRunner) { 30} 31 32TestFrameNavigationObserver::TestFrameNavigationObserver( 33 FrameTreeNode* node) 34 : WebContentsObserver( 35 node->current_frame_host()->delegate()->GetAsWebContents()), 36 frame_tree_node_id_(node->frame_tree_node_id()), 37 navigation_started_(false), 38 navigations_completed_(0), 39 number_of_navigations_(1), 40 message_loop_runner_(new MessageLoopRunner) { 41} 42 43TestFrameNavigationObserver::~TestFrameNavigationObserver() { 44} 45 46void TestFrameNavigationObserver::Wait() { 47 message_loop_runner_->Run(); 48} 49 50void TestFrameNavigationObserver::DidStartProvisionalLoadForFrame( 51 RenderFrameHost* render_frame_host, 52 const GURL& validated_url, 53 bool is_error_page, 54 bool is_iframe_srcdoc) { 55 RenderFrameHostImpl* rfh = 56 static_cast<RenderFrameHostImpl*>(render_frame_host); 57 if (rfh->frame_tree_node()->frame_tree_node_id() == frame_tree_node_id_) 58 navigation_started_ = true; 59} 60 61void TestFrameNavigationObserver::DidNavigateAnyFrame( 62 const LoadCommittedDetails& details, 63 const FrameNavigateParams& params) { 64 if (!navigation_started_) 65 return; 66 67 ++navigations_completed_; 68 if (navigations_completed_ == number_of_navigations_) { 69 navigation_started_ = false; 70 message_loop_runner_->Quit(); 71 } 72} 73 74} // namespace content 75