Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3551)

Unified Diff: chrome/browser/renderer_host/data_reduction_proxy_navigation_throttle_android.cc

Issue 1424003006: DataReductionProxyNavigationThrottle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@merge-session-throttle
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/renderer_host/data_reduction_proxy_navigation_throttle_android.cc
diff --git a/chrome/browser/renderer_host/data_reduction_proxy_navigation_throttle_android.cc b/chrome/browser/renderer_host/data_reduction_proxy_navigation_throttle_android.cc
new file mode 100644
index 0000000000000000000000000000000000000000..608c84e05541dc32b7be682f77183f6885b12d80
--- /dev/null
+++ b/chrome/browser/renderer_host/data_reduction_proxy_navigation_throttle_android.cc
@@ -0,0 +1,146 @@
+// 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 "chrome/browser/renderer_host/data_reduction_proxy_navigation_throttle_android.h"
+
+#include "base/logging.h"
+#include "base/prefs/pref_service.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/prerender/prerender_contents.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/renderer_host/data_reduction_proxy_throttling_utils_android.h"
+#include "chrome/browser/safe_browsing/ui_manager.h"
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
+#include "components/data_reduction_proxy/core/common/data_reduction_proxy_pref_names.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents.h"
+#include "net/http/http_response_headers.h"
+
+using content::BrowserThread;
+using content::NavigationThrottle;
+
+// static
+scoped_ptr<NavigationThrottle>
+DataReductionProxyNavigationThrottle::MaybeCreate(
+ content::NavigationHandle* navigation_handle,
+ safe_browsing::SafeBrowsingService* sb_service) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+ content::BrowserContext* browser_context =
+ navigation_handle->GetWebContents()->GetBrowserContext();
+ DCHECK(browser_context);
+ Profile* profile = Profile::FromBrowserContext(browser_context);
+ DCHECK(profile);
+
+ bool is_data_reduction_proxy_available =
+ !profile->GetPrefs()->GetBoolean(
+ data_reduction_proxy::prefs::kDataReductionProxyEnabled) ||
+ data_reduction_proxy::params::ShouldForceEnableDataReductionProxy();
+ if (!data_reduction_proxy_throttling_utils::CanCreateThrottle(
+ profile->GetProfileType() == Profile::INCOGNITO_PROFILE,
+ is_data_reduction_proxy_available, navigation_handle->GetURL())) {
+ return nullptr;
+ }
+
+ return scoped_ptr<NavigationThrottle>(
+ new DataReductionProxyNavigationThrottle(navigation_handle, sb_service));
+}
+
+DataReductionProxyNavigationThrottle::DataReductionProxyNavigationThrottle(
+ content::NavigationHandle* navigation_handle,
+ safe_browsing::SafeBrowsingService* sb_service)
+ : NavigationThrottle(navigation_handle),
+ state_(STATE_NONE),
+ safe_browsing_(sb_service) {}
+
+DataReductionProxyNavigationThrottle::~DataReductionProxyNavigationThrottle() {}
+
+NavigationThrottle::ThrottleCheckResult
+DataReductionProxyNavigationThrottle::WillRedirectRequest() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ CHECK(state_ == STATE_NONE);
+
+ // Save the redirect urls for possible malware detail reporting later.
+ redirect_urls_.push_back(navigation_handle()->GetURL());
+
+ // We need to check the new URL before following the redirect.
+ safe_browsing::SBThreatType threat_type =
+ data_reduction_proxy_throttling_utils::CheckHeaders(
+ navigation_handle()->GetResponseHeaders());
+ if (threat_type == safe_browsing::SB_THREAT_TYPE_SAFE)
+ return NavigationThrottle::PROCEED;
+
+ // If safe browsing is disabled and the request is sent to the DRP server,
+ // we need to break the redirect loop by setting the extra header.
+ if (!safe_browsing_->enabled()) {
+ AddExtraHeader(
+ data_reduction_proxy_throttling_utils::kUnsafeUrlProceedHeader, "1");
+ return NavigationThrottle::PROCEED;
+ }
+
+ if (navigation_handle()->IsPrefetch()) {
+ return NavigationThrottle::CANCEL;
+ }
+
+ prerender::PrerenderContents* prerender_contents =
+ prerender::PrerenderContents::FromWebContents(
+ navigation_handle()->GetWebContents());
+ if (prerender_contents) {
+ // This does not destroy the WebContents backing the PrerenderContents in
+ // this iteration of the MessageLoop, making it safe to call from a
+ // NavigationThrottle.
+ prerender_contents->Destroy(prerender::FINAL_STATUS_SAFE_BROWSING);
+ return NavigationThrottle::CANCEL;
+ }
+
+ state_ = STATE_DISPLAYING_BLOCKING_PAGE;
+ safe_browsing::SafeBrowsingUIManager::UnsafeResource unsafe_resource;
+ unsafe_resource.url = navigation_handle()->GetURL();
+ unsafe_resource.original_url = navigation_handle()->GetOriginalURL();
+ unsafe_resource.redirect_urls = redirect_urls_;
+ unsafe_resource.is_subresource = !navigation_handle()->IsInMainFrame();
+ unsafe_resource.is_subframe = !navigation_handle()->IsInMainFrame();
+ unsafe_resource.threat_type = threat_type;
+ unsafe_resource.callback =
+ base::Bind(&DataReductionProxyNavigationThrottle::OnBlockingPageComplete,
+ AsWeakPtr());
+ unsafe_resource.callback_thread =
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
+
+ // Add the route id and process id for the WebContents current RenderView. It
+ // is used later to find the WebContents again.
+ unsafe_resource.render_process_host_id = navigation_handle()
+ ->GetWebContents()
+ ->GetRenderViewHost()
+ ->GetProcess()
+ ->GetID();
+ unsafe_resource.render_view_id =
+ navigation_handle()->GetWebContents()->GetRoutingID();
+ unsafe_resource.threat_source = safe_browsing::ThreatSource::DATA_SAVER;
+
+ safe_browsing_->ui_manager()->DisplayBlockingPage(unsafe_resource);
+ return NavigationThrottle::DEFER;
+}
+
+// SafeBrowsingService::UrlCheckCallback implementation, called on the UI
+// thread when the user has decided to proceed with the current request, or
+// go back.
+void DataReductionProxyNavigationThrottle::OnBlockingPageComplete(
+ bool proceed) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ CHECK(state_ == STATE_DISPLAYING_BLOCKING_PAGE);
+ state_ = STATE_NONE;
+
+ if (proceed) {
+ // Inject the header before resuming the request.
+ AddExtraHeader(
+ data_reduction_proxy_throttling_utils::kUnsafeUrlProceedHeader, "1");
+ navigation_handle()->Resume();
+ } else {
+ navigation_handle()->CancelDeferredNavigation(NavigationThrottle::CANCEL);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698