blob: 7b5d636ce8aecb5dbaf439f94e09859e1cc49d03 [file] [log] [blame]
// Copyright 2019 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 "chrome/renderer/chromeos_merge_session_loader_throttle.h"
#include <utility>
#include "base/bind.h"
#include "base/command_line.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/renderer/chrome_render_thread_observer.h"
#include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
// static
base::TimeDelta MergeSessionLoaderThrottle::GetMergeSessionTimeout() {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kShortMergeSessionTimeoutForTest)) {
return base::TimeDelta::FromSeconds(1);
} else {
return base::TimeDelta::FromSeconds(20);
}
}
MergeSessionLoaderThrottle::MergeSessionLoaderThrottle(
scoped_refptr<ChromeRenderThreadObserver::ChromeOSListener>
chromeos_listener)
: chromeos_listener_(std::move(chromeos_listener)) {}
MergeSessionLoaderThrottle::~MergeSessionLoaderThrottle() = default;
bool MergeSessionLoaderThrottle::MaybeDeferForMergeSession(
const GURL& url,
DelayedCallbackGroup::Callback resume_callback) {
if (!chromeos_listener_ || !chromeos_listener_->IsMergeSessionRunning())
return false;
chromeos_listener_->RunWhenMergeSessionFinished(std::move(resume_callback));
return true;
}
void MergeSessionLoaderThrottle::WillStartRequest(
network::ResourceRequest* request,
bool* defer) {
is_xhr_ = request->resource_type ==
static_cast<int>(blink::mojom::ResourceType::kXhr);
if (is_xhr_ && request->url.SchemeIsHTTPOrHTTPS() &&
MaybeDeferForMergeSession(
request->url,
base::BindOnce(&MergeSessionLoaderThrottle::ResumeLoader,
weak_ptr_factory_.GetWeakPtr()))) {
*defer = true;
}
}
void MergeSessionLoaderThrottle::WillRedirectRequest(
net::RedirectInfo* redirect_info,
const network::mojom::URLResponseHead& /* response_head */,
bool* defer,
std::vector<std::string>* to_be_removed_headers,
net::HttpRequestHeaders* modified_headers,
net::HttpRequestHeaders* modified_cors_exempt_headers) {
if (is_xhr_ && redirect_info->new_url.SchemeIsHTTPOrHTTPS() &&
MaybeDeferForMergeSession(
redirect_info->new_url,
base::BindOnce(&MergeSessionLoaderThrottle::ResumeLoader,
weak_ptr_factory_.GetWeakPtr()))) {
*defer = true;
}
}
void MergeSessionLoaderThrottle::DetachFromCurrentSequence() {}
void MergeSessionLoaderThrottle::ResumeLoader(
DelayedCallbackGroup::RunReason run_reason) {
LOG_IF(ERROR, run_reason == DelayedCallbackGroup::RunReason::TIMEOUT)
<< "Merge session loader throttle timeout.";
DVLOG(1) << "Resuming deferred XHR request.";
delegate_->Resume();
}