| Index: content/browser/transition_browsertest.cc
|
| diff --git a/content/browser/transition_browsertest.cc b/content/browser/transition_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cd0b66bb5fec50e885dd3830184ababd02efb1a3
|
| --- /dev/null
|
| +++ b/content/browser/transition_browsertest.cc
|
| @@ -0,0 +1,121 @@
|
| +// Copyright 2014 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 "base/bind.h"
|
| +#include "content/browser/loader/cross_site_resource_handler.h"
|
| +#include "content/browser/loader/resource_dispatcher_host_impl.h"
|
| +#include "content/browser/loader/resource_request_info_impl.h"
|
| +#include "content/browser/transition_request_manager.h"
|
| +#include "content/browser/web_contents/web_contents_impl.h"
|
| +#include "content/public/browser/web_contents_observer.h"
|
| +#include "content/public/test/content_browser_test.h"
|
| +#include "content/public/test/content_browser_test_utils.h"
|
| +#include "content/public/test/test_utils.h"
|
| +#include "content/shell/browser/shell.h"
|
| +#include "content/shell/browser/shell_resource_dispatcher_host_delegate.h"
|
| +#include "net/test/embedded_test_server/embedded_test_server.h"
|
| +#include "net/url_request/url_request.h"
|
| +
|
| +namespace content {
|
| +
|
| +class TransitionBrowserTest : public ContentBrowserTest {
|
| + public:
|
| + TransitionBrowserTest() {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(TransitionBrowserTest);
|
| +};
|
| +
|
| +class TransitionBrowserTestObserver
|
| + : public WebContentsObserver,
|
| + public ShellResourceDispatcherHostDelegate {
|
| + public:
|
| + TransitionBrowserTestObserver(Shell* shell)
|
| + : WebContentsObserver(shell->web_contents()),
|
| + request_(NULL),
|
| + shell_(shell),
|
| + did_defer_response_(false),
|
| + is_transition_request_(false) {
|
| + }
|
| +
|
| + virtual void RequestBeginning(
|
| + net::URLRequest* request,
|
| + ResourceContext* resource_context,
|
| + appcache::AppCacheService* appcache_service,
|
| + ResourceType::Type resource_type,
|
| + int child_id,
|
| + int route_id,
|
| + ScopedVector<ResourceThrottle>* throttles) OVERRIDE {
|
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + ShellResourceDispatcherHostDelegate::RequestBeginning(request,
|
| + resource_context,
|
| + appcache_service,
|
| + resource_type,
|
| + child_id,
|
| + route_id,
|
| + throttles);
|
| + request_ = request;
|
| +
|
| + ResourceRequestInfoImpl* info =
|
| + ResourceRequestInfoImpl::ForRequest(request_);
|
| +
|
| + TransitionRequestManager::GetInstance()->SetHasPendingTransitionRequest(
|
| + child_id, info->GetRenderFrameID(), is_transition_request_);
|
| + }
|
| +
|
| + virtual void OnResponseStarted(
|
| + net::URLRequest* request,
|
| + ResourceContext* resource_context,
|
| + ResourceResponse* response,
|
| + IPC::Sender* sender) {
|
| + ResourceRequestInfoImpl* info =
|
| + ResourceRequestInfoImpl::ForRequest(request_);
|
| +
|
| + did_defer_response_ = info->cross_site_handler()->did_defer_for_testing();
|
| + }
|
| +
|
| + void set_pending_transition_request(bool is_transition_request) {
|
| + is_transition_request_ = is_transition_request;
|
| + }
|
| +
|
| + bool did_defer_response() const { return did_defer_response_; }
|
| +
|
| + private:
|
| + net::URLRequest* request_;
|
| + Shell* shell_;
|
| + bool did_defer_response_;
|
| + bool is_transition_request_;
|
| +};
|
| +
|
| +// This tests that normal navigations don't defer at first response.
|
| +IN_PROC_BROWSER_TEST_F(TransitionBrowserTest,
|
| + NormalNavigationNotDeferred) {
|
| + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
|
| + scoped_ptr<TransitionBrowserTestObserver> observer(
|
| + new TransitionBrowserTestObserver(shell()));
|
| +
|
| + ResourceDispatcherHost::Get()->SetDelegate(observer.get());
|
| +
|
| + NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html"));
|
| +
|
| + ASSERT_FALSE(observer->did_defer_response());
|
| +}
|
| +
|
| +// This tests that when a navigation transition is detected, the response is
|
| +// deferred.
|
| +IN_PROC_BROWSER_TEST_F(TransitionBrowserTest,
|
| + TransitionNavigationIsDeferred) {
|
| + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
|
| + scoped_ptr<TransitionBrowserTestObserver> observer(
|
| + new TransitionBrowserTestObserver(shell()));
|
| +
|
| + ResourceDispatcherHost::Get()->SetDelegate(observer.get());
|
| + observer->set_pending_transition_request(true);
|
| +
|
| + NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html"));
|
| +
|
| + ASSERT_TRUE(observer->did_defer_response());
|
| +}
|
| +
|
| +} // namespace content
|
|
|