Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/devtools/protocol/page_handler.h" | 5 #include "content/browser/devtools/protocol/page_handler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
| 12 #include "base/strings/string_number_conversions.h" | |
| 12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 13 #include "base/threading/worker_pool.h" | 14 #include "base/threading/worker_pool.h" |
| 14 #include "content/browser/devtools/protocol/color_picker.h" | 15 #include "content/browser/devtools/protocol/color_picker.h" |
| 15 #include "content/browser/devtools/protocol/frame_recorder.h" | 16 #include "content/browser/devtools/protocol/frame_recorder.h" |
| 16 #include "content/browser/geolocation/geolocation_service_context.h" | 17 #include "content/browser/geolocation/geolocation_service_context.h" |
| 17 #include "content/browser/renderer_host/render_view_host_impl.h" | 18 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 18 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 19 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 19 #include "content/browser/web_contents/web_contents_impl.h" | 20 #include "content/browser/web_contents/web_contents_impl.h" |
| 21 #include "content/common/devtools_messages.h" | |
| 20 #include "content/common/view_messages.h" | 22 #include "content/common/view_messages.h" |
| 21 #include "content/public/browser/browser_thread.h" | 23 #include "content/public/browser/browser_thread.h" |
| 22 #include "content/public/browser/javascript_dialog_manager.h" | 24 #include "content/public/browser/javascript_dialog_manager.h" |
| 23 #include "content/public/browser/navigation_controller.h" | 25 #include "content/public/browser/navigation_controller.h" |
| 24 #include "content/public/browser/navigation_entry.h" | 26 #include "content/public/browser/navigation_entry.h" |
| 25 #include "content/public/browser/storage_partition.h" | 27 #include "content/public/browser/storage_partition.h" |
| 26 #include "content/public/browser/web_contents_delegate.h" | 28 #include "content/public/browser/web_contents_delegate.h" |
| 27 #include "content/public/common/referrer.h" | 29 #include "content/public/common/referrer.h" |
| 28 #include "content/public/common/url_constants.h" | 30 #include "content/public/common/url_constants.h" |
| 29 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | 31 #include "third_party/WebKit/public/platform/WebScreenInfo.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 return base_64_data; | 101 return base_64_data; |
| 100 } | 102 } |
| 101 | 103 |
| 102 } // namespace | 104 } // namespace |
| 103 | 105 |
| 104 typedef DevToolsProtocolClient::Response Response; | 106 typedef DevToolsProtocolClient::Response Response; |
| 105 | 107 |
| 106 PageHandler::PageHandler() | 108 PageHandler::PageHandler() |
| 107 : enabled_(false), | 109 : enabled_(false), |
| 108 touch_emulation_enabled_(false), | 110 touch_emulation_enabled_(false), |
| 111 device_emulation_enabled_(false), | |
| 109 screencast_enabled_(false), | 112 screencast_enabled_(false), |
| 110 screencast_quality_(kDefaultScreenshotQuality), | 113 screencast_quality_(kDefaultScreenshotQuality), |
| 111 screencast_max_width_(-1), | 114 screencast_max_width_(-1), |
| 112 screencast_max_height_(-1), | 115 screencast_max_height_(-1), |
| 113 capture_retry_count_(0), | 116 capture_retry_count_(0), |
| 114 has_compositor_frame_metadata_(false), | 117 has_compositor_frame_metadata_(false), |
| 115 screencast_frame_sent_(0), | 118 screencast_frame_sent_(0), |
| 116 screencast_frame_acked_(0), | 119 screencast_frame_acked_(0), |
| 117 processing_screencast_frame_(false), | 120 processing_screencast_frame_(false), |
| 118 color_picker_(new ColorPicker(base::Bind( | 121 color_picker_(new ColorPicker(base::Bind( |
| 119 &PageHandler::OnColorPicked, base::Unretained(this)))), | 122 &PageHandler::OnColorPicked, base::Unretained(this)))), |
| 120 frame_recorder_(new FrameRecorder()), | 123 frame_recorder_(new FrameRecorder()), |
| 121 host_(nullptr), | 124 host_(nullptr), |
| 122 weak_factory_(this) { | 125 weak_factory_(this) { |
| 123 } | 126 } |
| 124 | 127 |
| 125 PageHandler::~PageHandler() { | 128 PageHandler::~PageHandler() { |
| 126 } | 129 } |
| 127 | 130 |
| 128 void PageHandler::SetRenderViewHost(RenderViewHostImpl* host) { | 131 void PageHandler::SetRenderViewHost(RenderViewHostImpl* host) { |
| 129 if (host_ == host) | 132 if (host_ == host) |
| 130 return; | 133 return; |
| 131 | 134 |
| 132 color_picker_->SetRenderViewHost(host); | 135 color_picker_->SetRenderViewHost(host); |
| 133 frame_recorder_->SetRenderViewHost(host); | 136 frame_recorder_->SetRenderViewHost(host); |
| 134 host_ = host; | 137 host_ = host; |
| 135 UpdateTouchEventEmulationState(); | 138 UpdateTouchEventEmulationState(); |
| 139 UpdateDeviceEmulationState(); | |
| 136 } | 140 } |
| 137 | 141 |
| 138 void PageHandler::SetClient(scoped_ptr<Client> client) { | 142 void PageHandler::SetClient(scoped_ptr<Client> client) { |
| 139 client_.swap(client); | 143 client_.swap(client); |
| 140 } | 144 } |
| 141 | 145 |
| 142 void PageHandler::Detached() { | 146 void PageHandler::Detached() { |
| 143 Disable(); | 147 Disable(); |
| 144 } | 148 } |
| 145 | 149 |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 176 | 180 |
| 177 Response PageHandler::Enable() { | 181 Response PageHandler::Enable() { |
| 178 enabled_ = true; | 182 enabled_ = true; |
| 179 return Response::FallThrough(); | 183 return Response::FallThrough(); |
| 180 } | 184 } |
| 181 | 185 |
| 182 Response PageHandler::Disable() { | 186 Response PageHandler::Disable() { |
| 183 enabled_ = false; | 187 enabled_ = false; |
| 184 touch_emulation_enabled_ = false; | 188 touch_emulation_enabled_ = false; |
| 185 screencast_enabled_ = false; | 189 screencast_enabled_ = false; |
| 190 device_emulation_enabled_ = false; | |
| 186 UpdateTouchEventEmulationState(); | 191 UpdateTouchEventEmulationState(); |
| 192 UpdateDeviceEmulationState(); | |
| 187 color_picker_->SetEnabled(false); | 193 color_picker_->SetEnabled(false); |
| 188 return Response::FallThrough(); | 194 return Response::FallThrough(); |
| 189 } | 195 } |
| 190 | 196 |
| 191 Response PageHandler::Reload(const bool* ignoreCache, | 197 Response PageHandler::Reload(const bool* ignoreCache, |
| 192 const std::string* script_to_evaluate_on_load, | 198 const std::string* script_to_evaluate_on_load, |
| 193 const std::string* script_preprocessor) { | 199 const std::string* script_preprocessor) { |
| 194 if (!host_) | 200 if (!host_) |
| 195 return Response::InternalError("Could not connect to view"); | 201 return Response::InternalError("Could not connect to view"); |
| 196 | 202 |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 335 #endif // defined(OS_ANDROID) | 341 #endif // defined(OS_ANDROID) |
| 336 return Response::OK(); | 342 return Response::OK(); |
| 337 } | 343 } |
| 338 | 344 |
| 339 Response PageHandler::CanEmulate(bool* result) { | 345 Response PageHandler::CanEmulate(bool* result) { |
| 340 #if defined(OS_ANDROID) | 346 #if defined(OS_ANDROID) |
| 341 *result = false; | 347 *result = false; |
| 342 #else | 348 #else |
| 343 if (host_) { | 349 if (host_) { |
| 344 if (WebContents* web_contents = WebContents::FromRenderViewHost(host_)) { | 350 if (WebContents* web_contents = WebContents::FromRenderViewHost(host_)) { |
| 345 *result = !web_contents->GetVisibleURL().SchemeIs(kChromeDevToolsScheme); | 351 *result = |
| 352 !web_contents->GetVisibleURL().SchemeIs(kChromeDevToolsScheme) && | |
|
pfeldman
2015/03/13 13:00:17
DEBUG_DEVTOOLS ?
dgozman
2015/03/13 15:57:27
Done.
| |
| 353 web_contents->GetMainFrame()->GetRenderViewHost() == host_; | |
| 346 } else { | 354 } else { |
| 347 *result = true; | 355 *result = true; |
| 348 } | 356 } |
| 349 } else { | 357 } else { |
| 350 *result = true; | 358 *result = true; |
| 351 } | 359 } |
| 352 #endif // defined(OS_ANDROID) | 360 #endif // defined(OS_ANDROID) |
| 353 return Response::OK(); | 361 return Response::OK(); |
| 354 } | 362 } |
| 355 | 363 |
| 364 Response PageHandler::SetDeviceMetricsOverride( | |
| 365 int width, int height, double device_scale_factor, bool mobile, | |
| 366 bool fit_window, const double* optional_scale, | |
| 367 const double* optional_offset_x, const double* optional_offset_y) { | |
| 368 const static int max_size = 10000000; | |
| 369 const static double max_scale = 10; | |
| 370 | |
| 371 if (!host_) | |
| 372 return Response::InternalError("Could not connect to view"); | |
| 373 | |
| 374 if (width < 0 || height < 0 || width > max_size || height > max_size) { | |
| 375 return Response::InvalidParams( | |
| 376 "Width and height values must be positive, not greater than " + | |
| 377 base::IntToString(max_size)); | |
| 378 } | |
| 379 | |
| 380 if (device_scale_factor < 0) | |
| 381 return Response::InvalidParams("deviceScaleFactor must be non-negative"); | |
| 382 | |
| 383 if (optional_scale && (*optional_scale <= 0 || *optional_scale > max_scale)) { | |
| 384 return Response::InvalidParams( | |
| 385 "scale must be positive, not greater than " + | |
| 386 base::IntToString(max_scale)); | |
| 387 } | |
| 388 | |
| 389 blink::WebDeviceEmulationParams params; | |
| 390 params.screenPosition = mobile ? blink::WebDeviceEmulationParams::Mobile : | |
| 391 blink::WebDeviceEmulationParams::Desktop; | |
| 392 params.deviceScaleFactor = device_scale_factor; | |
| 393 params.viewSize = blink::WebSize(width, height); | |
| 394 params.fitToView = fit_window; | |
| 395 params.scale = optional_scale ? *optional_scale : 1; | |
| 396 params.offset = blink::WebFloatPoint( | |
| 397 optional_offset_x ? *optional_offset_x : 0.f, | |
| 398 optional_offset_y ? *optional_offset_y : 0.f); | |
| 399 | |
| 400 if (device_emulation_enabled_ && params == device_emulation_params_) | |
| 401 return Response::OK(); | |
| 402 | |
| 403 device_emulation_enabled_ = true; | |
| 404 device_emulation_params_ = params; | |
| 405 UpdateDeviceEmulationState(); | |
| 406 return Response::OK(); | |
| 407 } | |
| 408 | |
| 409 Response PageHandler::ClearDeviceMetricsOverride() { | |
| 410 if (!device_emulation_enabled_) | |
| 411 return Response::OK(); | |
| 412 | |
| 413 device_emulation_enabled_ = false; | |
| 414 UpdateDeviceEmulationState(); | |
| 415 return Response::OK(); | |
| 416 } | |
| 417 | |
| 356 Response PageHandler::StartScreencast(const std::string* format, | 418 Response PageHandler::StartScreencast(const std::string* format, |
| 357 const int* quality, | 419 const int* quality, |
| 358 const int* max_width, | 420 const int* max_width, |
| 359 const int* max_height) { | 421 const int* max_height) { |
| 360 if (!host_) | 422 if (!host_) |
| 361 return Response::InternalError("Could not connect to view"); | 423 return Response::InternalError("Could not connect to view"); |
| 362 | 424 |
| 363 screencast_enabled_ = true; | 425 screencast_enabled_ = true; |
| 364 screencast_format_ = format ? *format : kPng; | 426 screencast_format_ = format ? *format : kPng; |
| 365 screencast_quality_ = quality ? *quality : kDefaultScreenshotQuality; | 427 screencast_quality_ = quality ? *quality : kDefaultScreenshotQuality; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 446 bool enabled = touch_emulation_enabled_ || screencast_enabled_; | 508 bool enabled = touch_emulation_enabled_ || screencast_enabled_; |
| 447 ui::GestureProviderConfigType config_type = | 509 ui::GestureProviderConfigType config_type = |
| 448 TouchEmulationConfigurationToType(touch_emulation_configuration_); | 510 TouchEmulationConfigurationToType(touch_emulation_configuration_); |
| 449 host_->SetTouchEventEmulationEnabled(enabled, config_type); | 511 host_->SetTouchEventEmulationEnabled(enabled, config_type); |
| 450 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( | 512 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
| 451 WebContents::FromRenderViewHost(host_)); | 513 WebContents::FromRenderViewHost(host_)); |
| 452 if (web_contents) | 514 if (web_contents) |
| 453 web_contents->SetForceDisableOverscrollContent(enabled); | 515 web_contents->SetForceDisableOverscrollContent(enabled); |
| 454 } | 516 } |
| 455 | 517 |
| 518 void PageHandler::UpdateDeviceEmulationState() { | |
| 519 if (!host_) | |
| 520 return; | |
| 521 if (device_emulation_enabled_) { | |
| 522 host_->GetMainFrame()->Send(new DevToolsMsg_EnableDeviceEmulation( | |
| 523 host_->GetMainFrame()->GetRoutingID(), device_emulation_params_)); | |
| 524 } else { | |
| 525 host_->GetMainFrame()->Send(new DevToolsMsg_DisableDeviceEmulation( | |
| 526 host_->GetMainFrame()->GetRoutingID())); | |
| 527 } | |
| 528 } | |
| 529 | |
| 456 void PageHandler::NotifyScreencastVisibility(bool visible) { | 530 void PageHandler::NotifyScreencastVisibility(bool visible) { |
| 457 if (visible) | 531 if (visible) |
| 458 capture_retry_count_ = kCaptureRetryLimit; | 532 capture_retry_count_ = kCaptureRetryLimit; |
| 459 client_->ScreencastVisibilityChanged( | 533 client_->ScreencastVisibilityChanged( |
| 460 ScreencastVisibilityChangedParams::Create()->set_visible(visible)); | 534 ScreencastVisibilityChangedParams::Create()->set_visible(visible)); |
| 461 } | 535 } |
| 462 | 536 |
| 463 void PageHandler::InnerSwapCompositorFrame() { | 537 void PageHandler::InnerSwapCompositorFrame() { |
| 464 if (screencast_frame_sent_ - screencast_frame_acked_ > | 538 if (screencast_frame_sent_ - screencast_frame_acked_ > |
| 465 kMaxScreencastFramesInFlight || processing_screencast_frame_) { | 539 kMaxScreencastFramesInFlight || processing_screencast_frame_) { |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 595 | 669 |
| 596 void PageHandler::OnFramesRecorded( | 670 void PageHandler::OnFramesRecorded( |
| 597 DevToolsCommandId command_id, | 671 DevToolsCommandId command_id, |
| 598 scoped_refptr<StopRecordingFramesResponse> response_data) { | 672 scoped_refptr<StopRecordingFramesResponse> response_data) { |
| 599 client_->SendStopRecordingFramesResponse(command_id, response_data); | 673 client_->SendStopRecordingFramesResponse(command_id, response_data); |
| 600 } | 674 } |
| 601 | 675 |
| 602 } // namespace page | 676 } // namespace page |
| 603 } // namespace devtools | 677 } // namespace devtools |
| 604 } // namespace content | 678 } // namespace content |
| OLD | NEW |