15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/test/test_frame_navigation_observer.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/bind.h" 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/message_loop/message_loop.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/run_loop.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/stl_util.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/frame_host/navigation_entry_impl.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/frame_host/render_frame_host_impl.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/renderer_host/render_view_host_impl.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/browser/web_contents/web_contents_impl.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/browser/web_contents_observer.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace content { 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTestFrameNavigationObserver::TestFrameNavigationObserver( 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FrameTreeNode* node, 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int number_of_navigations) 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : WebContentsObserver( 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu node->current_frame_host()->delegate()->GetAsWebContents()), 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu frame_tree_node_id_(node->frame_tree_node_id()), 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigation_started_(false), 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigations_completed_(0), 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu number_of_navigations_(number_of_navigations), 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu message_loop_runner_(new MessageLoopRunner) { 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTestFrameNavigationObserver::TestFrameNavigationObserver( 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FrameTreeNode* node) 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : WebContentsObserver( 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu node->current_frame_host()->delegate()->GetAsWebContents()), 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu frame_tree_node_id_(node->frame_tree_node_id()), 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigation_started_(false), 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigations_completed_(0), 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu number_of_navigations_(1), 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu message_loop_runner_(new MessageLoopRunner) { 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTestFrameNavigationObserver::~TestFrameNavigationObserver() { 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid TestFrameNavigationObserver::Wait() { 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu message_loop_runner_->Run(); 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid TestFrameNavigationObserver::DidStartProvisionalLoadForFrame( 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHost* render_frame_host, 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const GURL& validated_url, 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool is_error_page, 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_iframe_srcdoc) { 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RenderFrameHostImpl* rfh = 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<RenderFrameHostImpl*>(render_frame_host); 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (rfh->frame_tree_node()->frame_tree_node_id() == frame_tree_node_id_) 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigation_started_ = true; 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid TestFrameNavigationObserver::DidNavigateAnyFrame( 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const LoadCommittedDetails& details, 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const FrameNavigateParams& params) { 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!navigation_started_) 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++navigations_completed_; 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (navigations_completed_ == number_of_navigations_) { 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu navigation_started_ = false; 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu message_loop_runner_->Quit(); 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace content 75