| Index: components/subresource_filter/content/browser/subresource_filter_safe_browsing_client.cc
|
| diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_client.cc b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_client.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0d0a21250d3ca8b102bb6505da3852c788dd90b3
|
| --- /dev/null
|
| +++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_client.cc
|
| @@ -0,0 +1,117 @@
|
| +// 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 "components/subresource_filter/content/browser/subresource_filter_safe_browsing_client.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| +#include "base/single_thread_task_runner.h"
|
| +#include "components/safe_browsing_db/util.h"
|
| +#include "components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +
|
| +namespace subresource_filter {
|
| +
|
| +constexpr base::TimeDelta
|
| + SubresourceFilterSafeBrowsingClientRequest::kCheckURLTimeout;
|
| +
|
| +SubresourceFilterSafeBrowsingClient::SubresourceFilterSafeBrowsingClient(
|
| + scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> database_manager,
|
| + const base::WeakPtr<SubresourceFilterSafeBrowsingActivationThrottle>&
|
| + throttle,
|
| + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + scoped_refptr<base::SingleThreadTaskRunner> ui_io_task_runner)
|
| + : database_manager_(std::move(database_manager)),
|
| + throttle_(throttle),
|
| + io_task_runner_(std::move(io_task_runner)),
|
| + ui_task_runner_(std::move(ui_io_task_runner)) {}
|
| +
|
| +SubresourceFilterSafeBrowsingClient::~SubresourceFilterSafeBrowsingClient() {}
|
| +
|
| +void SubresourceFilterSafeBrowsingClient::CheckUrlOnIO(const GURL& url,
|
| + size_t request_id) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + DCHECK(!url.is_empty());
|
| +
|
| + auto request = base::MakeUnique<SubresourceFilterSafeBrowsingClientRequest>(
|
| + url, request_id, database_manager_, io_task_runner_, this);
|
| + auto* raw_request = request.get();
|
| + DCHECK(requests_.find(raw_request) == requests_.end());
|
| + requests_[raw_request] = std::move(request);
|
| + raw_request->Start();
|
| +}
|
| +
|
| +void SubresourceFilterSafeBrowsingClient::OnCheckBrowseUrlResult(
|
| + SubresourceFilterSafeBrowsingClientRequest* request,
|
| + safe_browsing::SBThreatType threat_type,
|
| + const safe_browsing::ThreatMetadata& metadata) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + ui_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&SubresourceFilterSafeBrowsingActivationThrottle::
|
| + OnCheckUrlResultOnUI,
|
| + throttle_, request->url(), request->request_id(),
|
| + threat_type, metadata.threat_pattern_type));
|
| +
|
| + DCHECK(requests_.find(request) != requests_.end());
|
| + requests_.erase(request);
|
| +}
|
| +
|
| +SubresourceFilterSafeBrowsingClientRequest::
|
| + SubresourceFilterSafeBrowsingClientRequest(
|
| + const GURL& url,
|
| + size_t request_id,
|
| + scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
|
| + database_manager,
|
| + scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + SubresourceFilterSafeBrowsingClient* client)
|
| + : url_(url),
|
| + request_id_(request_id),
|
| + database_manager_(std::move(database_manager)),
|
| + client_(client) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + timer_.SetTaskRunner(std::move(io_task_runner));
|
| +}
|
| +
|
| +SubresourceFilterSafeBrowsingClientRequest::
|
| + ~SubresourceFilterSafeBrowsingClientRequest() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + database_manager_->CancelCheck(this);
|
| + timer_.Stop();
|
| +}
|
| +
|
| +void SubresourceFilterSafeBrowsingClientRequest::Start() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + start_time_ = base::TimeTicks::Now();
|
| + if (database_manager_->CheckUrlForSubresourceFilter(url_, this)) {
|
| + OnCheckBrowseUrlResult(url_, safe_browsing::SB_THREAT_TYPE_SAFE,
|
| + safe_browsing::ThreatMetadata());
|
| + return;
|
| + }
|
| + timer_.Start(
|
| + FROM_HERE, kCheckURLTimeout,
|
| + base::Bind(&SubresourceFilterSafeBrowsingClientRequest::OnCheckUrlTimeout,
|
| + base::Unretained(this)));
|
| +}
|
| +
|
| +void SubresourceFilterSafeBrowsingClientRequest::OnCheckBrowseUrlResult(
|
| + const GURL& url,
|
| + safe_browsing::SBThreatType threat_type,
|
| + const safe_browsing::ThreatMetadata& metadata) {
|
| + DCHECK_EQ(url_, url);
|
| + UMA_HISTOGRAM_TIMES("SubresourceFilter.SafeBrowsing.CheckTime",
|
| + base::TimeTicks::Now() - start_time_);
|
| + client_->OnCheckBrowseUrlResult(this, threat_type, metadata);
|
| +}
|
| +
|
| +void SubresourceFilterSafeBrowsingClientRequest::OnCheckUrlTimeout() {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| + database_manager_->CancelCheck(this);
|
| + OnCheckBrowseUrlResult(url_, safe_browsing::SB_THREAT_TYPE_SAFE,
|
| + safe_browsing::ThreatMetadata());
|
| +}
|
| +
|
| +} // namespace subresource_filter
|
|
|