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