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

Side by Side Diff: content/browser/loader/navigation_resource_throttle.cc

Issue 2867833002: NavigationThrottle: allow customization of net::Error when blocking
Patch Set: Rebase Created 3 years, 7 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/loader/navigation_resource_throttle.h" 5 #include "content/browser/loader/navigation_resource_throttle.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 30 matching lines...) Expand all
41 41
42 // Used in unit tests to transfer all navigations. 42 // Used in unit tests to transfer all navigations.
43 bool g_force_transfer = false; 43 bool g_force_transfer = false;
44 44
45 typedef base::Callback<void(NavigationThrottle::ThrottleCheckResult)> 45 typedef base::Callback<void(NavigationThrottle::ThrottleCheckResult)>
46 UIChecksPerformedCallback; 46 UIChecksPerformedCallback;
47 47
48 void SendCheckResultToIOThread(UIChecksPerformedCallback callback, 48 void SendCheckResultToIOThread(UIChecksPerformedCallback callback,
49 NavigationThrottle::ThrottleCheckResult result) { 49 NavigationThrottle::ThrottleCheckResult result) {
50 DCHECK_CURRENTLY_ON(BrowserThread::UI); 50 DCHECK_CURRENTLY_ON(BrowserThread::UI);
51 DCHECK_NE(result, NavigationThrottle::DEFER); 51 DCHECK_NE(result.action(), NavigationThrottle::DEFER);
52 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 52 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
53 base::Bind(callback, result)); 53 base::Bind(callback, result));
54 } 54 }
55 55
56 // Returns the NavigationHandle to use for a navigation in the frame specified 56 // Returns the NavigationHandle to use for a navigation in the frame specified
57 // by |render_process_id| and |render_frame_host_id|. If not found, |callback| 57 // by |render_process_id| and |render_frame_host_id|. If not found, |callback|
58 // will be invoked to cancel the request. 58 // will be invoked to cancel the request.
59 // 59 //
60 // Note: in unit test |callback| may be invoked with a value of proceed if no 60 // Note: in unit test |callback| may be invoked with a value of proceed if no
61 // handle is found. This happens when 61 // handle is found. This happens when
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 } 337 }
338 338
339 void NavigationResourceThrottle::set_force_transfer_for_testing( 339 void NavigationResourceThrottle::set_force_transfer_for_testing(
340 bool force_transfer) { 340 bool force_transfer) {
341 g_force_transfer = force_transfer; 341 g_force_transfer = force_transfer;
342 } 342 }
343 343
344 void NavigationResourceThrottle::OnUIChecksPerformed( 344 void NavigationResourceThrottle::OnUIChecksPerformed(
345 NavigationThrottle::ThrottleCheckResult result) { 345 NavigationThrottle::ThrottleCheckResult result) {
346 DCHECK_CURRENTLY_ON(BrowserThread::IO); 346 DCHECK_CURRENTLY_ON(BrowserThread::IO);
347 DCHECK_NE(NavigationThrottle::DEFER, result); 347 DCHECK_NE(NavigationThrottle::DEFER, result.action());
348 if (in_cross_site_transition_) { 348 if (in_cross_site_transition_) {
349 on_transfer_done_result_ = result; 349 on_transfer_done_result_ = result;
350 return; 350 return;
351 } 351 }
352 352
353 if (result == NavigationThrottle::CANCEL_AND_IGNORE) { 353 if (result.action() == NavigationThrottle::CANCEL_AND_IGNORE) {
354 DCHECK_EQ(net::ERR_ABORTED, result.net_error_code());
354 CancelAndIgnore(); 355 CancelAndIgnore();
355 } else if (result == NavigationThrottle::CANCEL) { 356 } else if (result.action() == NavigationThrottle::CANCEL) {
357 DCHECK_EQ(net::ERR_ABORTED, result.net_error_code());
356 Cancel(); 358 Cancel();
357 } else if (result == NavigationThrottle::BLOCK_REQUEST) { 359 } else if (result.action() == NavigationThrottle::BLOCK_REQUEST) {
358 CancelWithError(net::ERR_BLOCKED_BY_CLIENT); 360 DCHECK_NE(net::OK, result.net_error_code());
359 } else if (result == NavigationThrottle::BLOCK_RESPONSE) { 361 CancelWithError(result.net_error_code());
362 } else if (result.action() == NavigationThrottle::BLOCK_RESPONSE) {
363 DCHECK_NE(net::OK, result.net_error_code());
360 // TODO(mkwst): If we cancel the main frame request with anything other than 364 // TODO(mkwst): If we cancel the main frame request with anything other than
361 // 'net::ERR_ABORTED', we'll trigger some special behavior that might not be 365 // 'net::ERR_ABORTED', we'll trigger some special behavior that might not be
362 // desirable here (non-POSTs will reload the page, while POST has some logic 366 // desirable here (non-POSTs will reload the page, while POST has some logic
363 // around reloading to avoid duplicating actions server-side). For the 367 // around reloading to avoid duplicating actions server-side). For the
364 // moment, only child frame navigations should be blocked. If we need to 368 // moment, only child frame navigations should be blocked. If we need to
365 // block main frame navigations in the future, we'll need to carefully 369 // block main frame navigations in the future, we'll need to carefully
366 // consider the right thing to do here. 370 // consider the right thing to do here.
367 DCHECK(!ResourceRequestInfo::ForRequest(request_)->IsMainFrame()); 371 DCHECK(!ResourceRequestInfo::ForRequest(request_)->IsMainFrame());
368 CancelWithError(net::ERR_BLOCKED_BY_RESPONSE); 372 CancelWithError(result.net_error_code());
369 } else { 373 } else {
370 Resume(); 374 Resume();
371 } 375 }
372 } 376 }
373 377
374 void NavigationResourceThrottle::InitiateTransfer() { 378 void NavigationResourceThrottle::InitiateTransfer() {
375 DCHECK_CURRENTLY_ON(BrowserThread::IO); 379 DCHECK_CURRENTLY_ON(BrowserThread::IO);
376 in_cross_site_transition_ = true; 380 in_cross_site_transition_ = true;
377 ResourceRequestInfoImpl* info = 381 ResourceRequestInfoImpl* info =
378 ResourceRequestInfoImpl::ForRequest(request_); 382 ResourceRequestInfoImpl::ForRequest(request_);
379 ResourceDispatcherHostImpl::Get()->MarkAsTransferredNavigation( 383 ResourceDispatcherHostImpl::Get()->MarkAsTransferredNavigation(
380 info->GetGlobalRequestID(), 384 info->GetGlobalRequestID(),
381 base::Bind(&NavigationResourceThrottle::OnTransferComplete, 385 base::Bind(&NavigationResourceThrottle::OnTransferComplete,
382 weak_ptr_factory_.GetWeakPtr())); 386 weak_ptr_factory_.GetWeakPtr()));
383 } 387 }
384 388
385 void NavigationResourceThrottle::OnTransferComplete() { 389 void NavigationResourceThrottle::OnTransferComplete() {
386 DCHECK_CURRENTLY_ON(BrowserThread::IO); 390 DCHECK_CURRENTLY_ON(BrowserThread::IO);
387 DCHECK(in_cross_site_transition_); 391 DCHECK(in_cross_site_transition_);
388 in_cross_site_transition_ = false; 392 in_cross_site_transition_ = false;
389 393
390 // If the results of the checks on the UI thread are known, unblock the 394 // If the results of the checks on the UI thread are known, unblock the
391 // navigation. Otherwise, wait until the callback has executed. 395 // navigation. Otherwise, wait until the callback has executed.
392 if (on_transfer_done_result_ != NavigationThrottle::DEFER) { 396 if (on_transfer_done_result_.action() != NavigationThrottle::DEFER) {
393 OnUIChecksPerformed(on_transfer_done_result_); 397 OnUIChecksPerformed(on_transfer_done_result_);
394 on_transfer_done_result_ = NavigationThrottle::DEFER; 398 on_transfer_done_result_ = NavigationThrottle::DEFER;
395 } 399 }
396 } 400 }
397 401
398 } // namespace content 402 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigation_request.cc ('k') | content/public/browser/navigation_handle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698