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