blob: b8a57a20c2a9a50b4c8014b27669c274170424a4 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/public/test/test_navigation_observer.h"
#include "base/bind.h"
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/web_contents_observer.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
class TestNavigationObserver::TestWebContentsObserver
: public WebContentsObserver {
public:
TestWebContentsObserver(TestNavigationObserver* parent,
WebContents* web_contents)
: WebContentsObserver(web_contents),
parent_(parent) {
}
private:
// WebContentsObserver:
void NavigationEntryCommitted(
const LoadCommittedDetails& load_details) override {
parent_->OnNavigationEntryCommitted(this, web_contents(), load_details);
}
void DidAttachInterstitialPage() override {
parent_->OnDidAttachInterstitialPage(web_contents());
}
void WebContentsDestroyed() override {
parent_->OnWebContentsDestroyed(this, web_contents());
}
void DidStartLoading() override {
parent_->OnDidStartLoading(web_contents());
}
void DidStopLoading() override {
parent_->OnDidStopLoading(web_contents());
}
void DidStartProvisionalLoadForFrame(RenderFrameHost* render_frame_host,
const GURL& validated_url,
bool is_error_page,
bool is_iframe_srcdoc) override {
parent_->OnDidStartProvisionalLoad(render_frame_host, validated_url,
is_error_page, is_iframe_srcdoc);
}
void DidFailProvisionalLoad(
RenderFrameHost* render_frame_host,
const GURL& validated_url,
int error_code,
const base::string16& error_description,
bool was_ignored_by_handler) override {
parent_->OnDidFailProvisionalLoad(render_frame_host, validated_url,
error_code, error_description);
}
void DidCommitProvisionalLoadForFrame(
RenderFrameHost* render_frame_host,
const GURL& url,
ui::PageTransition transition_type) override {
parent_->OnDidCommitProvisionalLoadForFrame(
render_frame_host, url, transition_type);
}
TestNavigationObserver* parent_;
DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver);
};
TestNavigationObserver::TestNavigationObserver(
WebContents* web_contents,
int number_of_navigations)
: navigation_started_(false),
navigations_completed_(0),
number_of_navigations_(number_of_navigations),
message_loop_runner_(new MessageLoopRunner),
web_contents_created_callback_(
base::Bind(
&TestNavigationObserver::OnWebContentsCreated,
base::Unretained(this))) {
if (web_contents)
RegisterAsObserver(web_contents);
}
TestNavigationObserver::TestNavigationObserver(
WebContents* web_contents)
: navigation_started_(false),
navigations_completed_(0),
number_of_navigations_(1),
message_loop_runner_(new MessageLoopRunner),
web_contents_created_callback_(
base::Bind(
&TestNavigationObserver::OnWebContentsCreated,
base::Unretained(this))) {
if (web_contents)
RegisterAsObserver(web_contents);
}
TestNavigationObserver::~TestNavigationObserver() {
StopWatchingNewWebContents();
base::STLDeleteContainerPointers(web_contents_observers_.begin(),
web_contents_observers_.end());
}
void TestNavigationObserver::Wait() {
message_loop_runner_->Run();
}
void TestNavigationObserver::StartWatchingNewWebContents() {
WebContentsImpl::FriendZone::AddCreatedCallbackForTesting(
web_contents_created_callback_);
}
void TestNavigationObserver::StopWatchingNewWebContents() {
WebContentsImpl::FriendZone::RemoveCreatedCallbackForTesting(
web_contents_created_callback_);
}
void TestNavigationObserver::RegisterAsObserver(WebContents* web_contents) {
web_contents_observers_.insert(
new TestWebContentsObserver(this, web_contents));
}
void TestNavigationObserver::OnWebContentsCreated(WebContents* web_contents) {
RegisterAsObserver(web_contents);
}
void TestNavigationObserver::OnWebContentsDestroyed(
TestWebContentsObserver* observer,
WebContents* web_contents) {
web_contents_observers_.erase(observer);
delete observer;
}
void TestNavigationObserver::OnNavigationEntryCommitted(
TestWebContentsObserver* observer,
WebContents* web_contents,
const LoadCommittedDetails& load_details) {
navigation_started_ = true;
}
void TestNavigationObserver::OnDidAttachInterstitialPage(
WebContents* web_contents) {
// Going to an interstitial page does not trigger NavigationEntryCommitted,
// but has the same meaning for us here.
navigation_started_ = true;
}
void TestNavigationObserver::OnDidStartLoading(WebContents* web_contents) {
navigation_started_ = true;
}
void TestNavigationObserver::OnDidStopLoading(WebContents* web_contents) {
if (!navigation_started_)
return;
++navigations_completed_;
if (navigations_completed_ == number_of_navigations_) {
navigation_started_ = false;
message_loop_runner_->Quit();
}
}
void TestNavigationObserver::OnDidStartProvisionalLoad(
RenderFrameHost* render_frame_host,
const GURL& validated_url,
bool is_error_page,
bool is_iframe_srcdoc) {
last_navigation_succeeded_ = false;
}
void TestNavigationObserver::OnDidFailProvisionalLoad(
RenderFrameHost* render_frame_host,
const GURL& validated_url,
int error_code,
const base::string16& error_description) {
last_navigation_url_ = validated_url;
last_navigation_succeeded_ = false;
}
void TestNavigationObserver::OnDidCommitProvisionalLoadForFrame(
RenderFrameHost* render_frame_host,
const GURL& url,
ui::PageTransition transition_type) {
last_navigation_url_ = url;
last_navigation_succeeded_ = true;
}
} // namespace content