| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |