blob: 78402375438ef111be68f83790f5315e56b926f2 [file] [log] [blame]
// Copyright 2017 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_throttle.h"
#include "base/bind.h"
#include "base/optional.h"
#include "base/task/post_task.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_handle.h"
namespace content {
TestNavigationThrottle::TestNavigationThrottle(NavigationHandle* handle)
: NavigationThrottle(handle), weak_ptr_factory_(this) {}
TestNavigationThrottle::~TestNavigationThrottle() {}
NavigationThrottle::ThrottleCheckResult
TestNavigationThrottle::WillStartRequest() {
return ProcessMethod(WILL_START_REQUEST);
}
NavigationThrottle::ThrottleCheckResult
TestNavigationThrottle::WillRedirectRequest() {
return ProcessMethod(WILL_REDIRECT_REQUEST);
}
NavigationThrottle::ThrottleCheckResult
TestNavigationThrottle::WillFailRequest() {
return ProcessMethod(WILL_FAIL_REQUEST);
}
NavigationThrottle::ThrottleCheckResult
TestNavigationThrottle::WillProcessResponse() {
return ProcessMethod(WILL_PROCESS_RESPONSE);
}
const char* TestNavigationThrottle::GetNameForLogging() {
return "TestNavigationThrottle";
}
int TestNavigationThrottle::GetCallCount(ThrottleMethod method) {
return method_properties_[method].call_count;
}
void TestNavigationThrottle::SetResponse(
ThrottleMethod method,
ResultSynchrony synchrony,
NavigationThrottle::ThrottleCheckResult result) {
CHECK_LT(method, NUM_THROTTLE_METHODS) << "Invalid throttle method";
if (synchrony == ASYNCHRONOUS) {
DCHECK(result.action() == NavigationThrottle::CANCEL_AND_IGNORE ||
result.action() == NavigationThrottle::CANCEL ||
result.action() == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE)
<< "Invalid result for asynchronous response. Must have a valid action "
"for CancelDeferredNavigation().";
}
method_properties_[method].synchrony = synchrony;
method_properties_[method].result = result;
}
void TestNavigationThrottle::SetResponseForAllMethods(
ResultSynchrony synchrony,
NavigationThrottle::ThrottleCheckResult result) {
for (size_t method = 0; method < NUM_THROTTLE_METHODS; method++) {
SetResponse(static_cast<ThrottleMethod>(method), synchrony, result);
}
}
void TestNavigationThrottle::SetCallback(ThrottleMethod method,
base::Closure callback) {
method_properties_[method].callback = std::move(callback);
}
void TestNavigationThrottle::OnWillRespond() {}
NavigationThrottle::ThrottleCheckResult TestNavigationThrottle::ProcessMethod(
ThrottleMethod method) {
method_properties_[method].call_count++;
if (!method_properties_[method].callback.is_null())
method_properties_[method].callback.Run();
NavigationThrottle::ThrottleCheckResult result =
method_properties_[method].result;
if (method_properties_[method].synchrony == ASYNCHRONOUS) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(&TestNavigationThrottle::TestNavigationThrottle::
CancelAsynchronously,
weak_ptr_factory_.GetWeakPtr(), result));
return NavigationThrottle::DEFER;
}
OnWillRespond();
return result;
}
void TestNavigationThrottle::CancelAsynchronously(
NavigationThrottle::ThrottleCheckResult result) {
OnWillRespond();
CancelDeferredNavigation(result);
}
TestNavigationThrottle::MethodProperties::MethodProperties() {}
TestNavigationThrottle::MethodProperties::~MethodProperties() {}
} // namespace content