Chromium Code Reviews| Index: content/browser/devtools/protocol/page_handler.cc |
| diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc |
| index d5a9244dc95b4123fe0e2ad4e5d1248ac2ba873a..40117ef5aad9720c76ecc5977f4327079e245616 100644 |
| --- a/content/browser/devtools/protocol/page_handler.cc |
| +++ b/content/browser/devtools/protocol/page_handler.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "base/threading/worker_pool.h" |
| +#include "content/browser/devtools/page_navigation_throttle.h" |
| #include "content/browser/devtools/protocol/color_picker.h" |
| #include "content/browser/renderer_host/render_widget_host_impl.h" |
| #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| @@ -23,6 +24,7 @@ |
| #include "content/public/browser/javascript_dialog_manager.h" |
| #include "content/public/browser/navigation_controller.h" |
| #include "content/public/browser/navigation_entry.h" |
| +#include "content/public/browser/navigation_handle.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_types.h" |
| #include "content/public/browser/storage_partition.h" |
| @@ -102,11 +104,12 @@ PageHandler::PageHandler() |
| session_id_(0), |
| frame_counter_(0), |
| frames_in_flight_(0), |
| - color_picker_(new ColorPicker(base::Bind( |
| - &PageHandler::OnColorPicked, base::Unretained(this)))), |
| + color_picker_(new ColorPicker( |
| + base::Bind(&PageHandler::OnColorPicked, base::Unretained(this)))), |
| + navigation_throttle_enabled_(false), |
|
dgozman
2016/07/07 19:25:58
We should resume and remove any throttles we curre
alex clarke (OOO till 29th)
2016/07/08 10:37:57
Good point! Done.
|
| + next_navigation_id_(0), |
| host_(nullptr), |
| - weak_factory_(this) { |
| -} |
| + weak_factory_(this) {} |
| PageHandler::~PageHandler() { |
| } |
| @@ -373,6 +376,71 @@ Response PageHandler::RequestAppBanner() { |
| return Response::OK(); |
| } |
| +Response PageHandler::SetNavigationThrottleEnabled(bool enabled) { |
| + navigation_throttle_enabled_ = enabled; |
|
dgozman
2016/07/07 19:25:58
Even better, clean up existing throttles here and
alex clarke (OOO till 29th)
2016/07/08 10:37:57
Done.
|
| + return Response::OK(); |
| +} |
| + |
| +Response PageHandler::NavigationThrottleResponse(const std::string& response, |
| + int navigation_id) { |
| + auto it = navigation_throttles_.find(navigation_id); |
| + if (it == navigation_throttles_.end()) |
| + return Response::InternalError("Unknown navigation"); |
| + |
| + if (response == kNavigationThrottleResponseProceed) { |
| + it->second->navigation_handle()->Resume(); |
| + return Response::OK(); |
| + } else if (response == kNavigationThrottleResponseCancel) { |
| + it->second->navigation_handle()->CancelDeferredNavigation( |
| + content::NavigationThrottle::CANCEL); |
| + return Response::OK(); |
| + } else if (response == kNavigationThrottleResponseCancelAndIgnore) { |
| + it->second->navigation_handle()->CancelDeferredNavigation( |
| + content::NavigationThrottle::CANCEL_AND_IGNORE); |
| + return Response::OK(); |
| + } |
| + |
| + return Response::InternalError("Unrecognized response"); |
| +} |
| + |
| +std::unique_ptr<PageNavigationThrottle> PageHandler::GetThrottleForNavigation( |
| + NavigationHandle* navigation_handle) { |
| + if (!navigation_throttle_enabled_) |
| + return nullptr; |
| + |
| + std::unique_ptr<PageNavigationThrottle> throttle(new PageNavigationThrottle( |
| + weak_factory_.GetWeakPtr(), next_navigation_id_, navigation_handle)); |
| + navigation_throttles_[next_navigation_id_++] = throttle.get(); |
| + return throttle; |
| +} |
| + |
| +void PageHandler::OnPageNavigationThrottleDisposed(int navigation_id) { |
| + DCHECK(navigation_throttles_.find(navigation_id) != |
| + navigation_throttles_.end()); |
| + navigation_throttles_.erase(navigation_id); |
| +} |
| + |
| +void PageHandler::ShouldAllowNavigation( |
| + const PageNavigationThrottle* throttle) { |
| + NavigationHandle* navigation_handle = throttle->navigation_handle(); |
| + client_->ShouldAllowNavigation( |
| + ShouldAllowNavigationParams::Create() |
| + ->set_frame_id(throttle->GetFrameId()) |
| + ->set_navigation_id(throttle->navigation_id()) |
| + ->set_url(navigation_handle->GetURL().spec()) |
| + ->set_renderer_initiated(navigation_handle->IsRendererInitiated())); |
| +} |
| + |
| +void PageHandler::ShouldAllowRedirect(const PageNavigationThrottle* throttle) { |
| + NavigationHandle* navigation_handle = throttle->navigation_handle(); |
| + client_->ShouldAllowRedirect( |
| + ShouldAllowRedirectParams::Create() |
| + ->set_frame_id(throttle->GetFrameId()) |
| + ->set_navigation_id(throttle->navigation_id()) |
| + ->set_url(navigation_handle->GetURL().spec()) |
| + ->set_renderer_initiated(navigation_handle->IsRendererInitiated())); |
| +} |
| + |
| WebContentsImpl* PageHandler::GetWebContents() { |
| return host_ ? |
| static_cast<WebContentsImpl*>(WebContents::FromRenderFrameHost(host_)) : |