| Index: components/navigation_interception/intercept_navigation_throttle_unittest.cc
|
| diff --git a/components/navigation_interception/intercept_navigation_throttle_unittest.cc b/components/navigation_interception/intercept_navigation_throttle_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..15e05efaf0473a80b1a2f26901181eea33793908
|
| --- /dev/null
|
| +++ b/components/navigation_interception/intercept_navigation_throttle_unittest.cc
|
| @@ -0,0 +1,165 @@
|
| +// Copyright 2015 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 "base/bind_helpers.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "components/navigation_interception/intercept_navigation_throttle.h"
|
| +#include "components/navigation_interception/navigation_params.h"
|
| +#include "content/public/browser/navigation_handle.h"
|
| +#include "content/public/browser/navigation_throttle.h"
|
| +#include "content/public/browser/web_contents.h"
|
| +#include "content/public/test/test_renderer_host.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using content::NavigationThrottle;
|
| +using testing::_;
|
| +using testing::Eq;
|
| +using testing::Ne;
|
| +using testing::Property;
|
| +using testing::Return;
|
| +
|
| +namespace navigation_interception {
|
| +
|
| +namespace {
|
| +
|
| +const char kTestUrl[] = "http://www.test.com/";
|
| +
|
| +// The MS C++ compiler complains about not being able to resolve which url()
|
| +// method (const or non-const) to use if we use the Property matcher to check
|
| +// the return value of the NavigationParams::url() method.
|
| +// It is possible to suppress the error by specifying the types directly but
|
| +// that results in very ugly syntax, which is why these custom matchers are
|
| +// used instead.
|
| +MATCHER(NavigationParamsUrlIsTest, "") {
|
| + return arg.url() == GURL(kTestUrl);
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +// MockInterceptCallbackReceiver ----------------------------------------------
|
| +
|
| +class MockInterceptCallbackReceiver {
|
| + public:
|
| + MOCK_METHOD2(ShouldIgnoreNavigation,
|
| + bool(content::WebContents* source,
|
| + const NavigationParams& navigation_params));
|
| +};
|
| +
|
| +// InterceptNavigationThrottleTest ------------------------------------
|
| +
|
| +class InterceptNavigationThrottleTest
|
| + : public content::RenderViewHostTestHarness {
|
| + public:
|
| + InterceptNavigationThrottleTest()
|
| + : mock_callback_receiver_(new MockInterceptCallbackReceiver()) {}
|
| +
|
| + NavigationThrottle::ThrottleCheckResult
|
| + SimulateWillStart(const GURL& url, const GURL& sanitized_url, bool is_post) {
|
| + scoped_ptr<content::NavigationHandle> test_handle =
|
| + content::NavigationHandle::CreateNavigationHandleForTesting(
|
| + url, true, web_contents());
|
| + test_handle->RegisterThrottleForTesting(
|
| + scoped_ptr<NavigationThrottle>(
|
| + new InterceptNavigationThrottle(
|
| + test_handle.get(),
|
| + base::Bind(
|
| + &MockInterceptCallbackReceiver::ShouldIgnoreNavigation,
|
| + base::Unretained(mock_callback_receiver_.get()))))
|
| + .Pass());
|
| + return test_handle->CallWillStartRequestForTesting(
|
| + is_post, content::Referrer(), false, ui::PAGE_TRANSITION_LINK, false);
|
| + }
|
| +
|
| + NavigationThrottle::ThrottleCheckResult Simulate302() {
|
| + scoped_ptr<content::NavigationHandle> test_handle =
|
| + content::NavigationHandle::CreateNavigationHandleForTesting(
|
| + GURL(kTestUrl), true, web_contents());
|
| + test_handle->RegisterThrottleForTesting(
|
| + scoped_ptr<NavigationThrottle>(
|
| + new InterceptNavigationThrottle(
|
| + test_handle.get(),
|
| + base::Bind(
|
| + &MockInterceptCallbackReceiver::ShouldIgnoreNavigation,
|
| + base::Unretained(mock_callback_receiver_.get()))))
|
| + .Pass());
|
| + test_handle->CallWillStartRequestForTesting(
|
| + true, content::Referrer(), false, ui::PAGE_TRANSITION_LINK, false);
|
| + return test_handle->CallWillRedirectRequestForTesting(GURL(kTestUrl), false,
|
| + GURL(), false);
|
| + }
|
| +
|
| + scoped_ptr<MockInterceptCallbackReceiver> mock_callback_receiver_;
|
| +};
|
| +
|
| +TEST_F(InterceptNavigationThrottleTest,
|
| + RequestDeferredAndResumedIfNavigationNotIgnored) {
|
| + ON_CALL(*mock_callback_receiver_, ShouldIgnoreNavigation(_, _))
|
| + .WillByDefault(Return(false));
|
| + EXPECT_CALL(
|
| + *mock_callback_receiver_,
|
| + ShouldIgnoreNavigation(web_contents(), NavigationParamsUrlIsTest()));
|
| + NavigationThrottle::ThrottleCheckResult result =
|
| + SimulateWillStart(GURL(kTestUrl), GURL(kTestUrl), false);
|
| +
|
| + EXPECT_EQ(NavigationThrottle::PROCEED, result);
|
| +}
|
| +
|
| +TEST_F(InterceptNavigationThrottleTest,
|
| + RequestDeferredAndCancelledIfNavigationIgnored) {
|
| + ON_CALL(*mock_callback_receiver_, ShouldIgnoreNavigation(_, _))
|
| + .WillByDefault(Return(true));
|
| + EXPECT_CALL(
|
| + *mock_callback_receiver_,
|
| + ShouldIgnoreNavigation(web_contents(), NavigationParamsUrlIsTest()));
|
| + NavigationThrottle::ThrottleCheckResult result =
|
| + SimulateWillStart(GURL(kTestUrl), GURL(kTestUrl), false);
|
| +
|
| + EXPECT_EQ(NavigationThrottle::CANCEL_AND_IGNORE, result);
|
| +}
|
| +
|
| +TEST_F(InterceptNavigationThrottleTest, CallbackIsPostFalseForGet) {
|
| + EXPECT_CALL(*mock_callback_receiver_,
|
| + ShouldIgnoreNavigation(
|
| + _, AllOf(NavigationParamsUrlIsTest(),
|
| + Property(&NavigationParams::is_post, Eq(false)))))
|
| + .WillOnce(Return(false));
|
| +
|
| + NavigationThrottle::ThrottleCheckResult result =
|
| + SimulateWillStart(GURL(kTestUrl), GURL(kTestUrl), false);
|
| +
|
| + EXPECT_EQ(NavigationThrottle::PROCEED, result);
|
| +}
|
| +
|
| +TEST_F(InterceptNavigationThrottleTest, CallbackIsPostTrueForPost) {
|
| + EXPECT_CALL(*mock_callback_receiver_,
|
| + ShouldIgnoreNavigation(
|
| + _, AllOf(NavigationParamsUrlIsTest(),
|
| + Property(&NavigationParams::is_post, Eq(true)))))
|
| + .WillOnce(Return(false));
|
| + NavigationThrottle::ThrottleCheckResult result =
|
| + SimulateWillStart(GURL(kTestUrl), GURL(kTestUrl), true);
|
| +
|
| + EXPECT_EQ(NavigationThrottle::PROCEED, result);
|
| +}
|
| +
|
| +TEST_F(InterceptNavigationThrottleTest,
|
| + CallbackIsPostFalseForPostConvertedToGetBy302) {
|
| + EXPECT_CALL(*mock_callback_receiver_,
|
| + ShouldIgnoreNavigation(
|
| + _, AllOf(NavigationParamsUrlIsTest(),
|
| + Property(&NavigationParams::is_post, Eq(true)))))
|
| + .WillOnce(Return(false));
|
| + EXPECT_CALL(*mock_callback_receiver_,
|
| + ShouldIgnoreNavigation(
|
| + _, AllOf(NavigationParamsUrlIsTest(),
|
| + Property(&NavigationParams::is_post, Eq(false)))))
|
| + .WillOnce(Return(false));
|
| + NavigationThrottle::ThrottleCheckResult result = Simulate302();
|
| +
|
| + EXPECT_EQ(NavigationThrottle::PROCEED, result);
|
| +}
|
| +
|
| +} // namespace navigation_interception
|
|
|