Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/renderer_overrides_handler.h" | 5 #include "content/browser/devtools/renderer_overrides_handler.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/barrier_closure.h" | 10 #include "base/barrier_closure.h" |
| 11 #include "base/base64.h" | 11 #include "base/base64.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 15 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
| 16 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
| 17 #include "base/values.h" | 17 #include "base/values.h" |
| 18 #include "content/browser/child_process_security_policy_impl.h" | 18 #include "content/browser/child_process_security_policy_impl.h" |
| 19 #include "content/browser/devtools/devtools_protocol_constants.h" | 19 #include "content/browser/devtools/devtools_protocol_constants.h" |
| 20 #include "content/browser/devtools/devtools_tracing_handler.h" | 20 #include "content/browser/devtools/devtools_tracing_handler.h" |
| 21 #include "content/browser/renderer_host/dip_util.h" | 21 #include "content/browser/renderer_host/dip_util.h" |
| 22 #include "content/browser/renderer_host/render_view_host_delegate.h" | 22 #include "content/browser/renderer_host/render_view_host_delegate.h" |
| 23 #include "content/browser/renderer_host/render_view_host_impl.h" | 23 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 24 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 24 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
| 25 #include "content/browser/web_contents/web_contents_impl.h" | |
| 25 #include "content/common/view_messages.h" | 26 #include "content/common/view_messages.h" |
| 26 #include "content/public/browser/browser_thread.h" | 27 #include "content/public/browser/browser_thread.h" |
| 27 #include "content/public/browser/content_browser_client.h" | 28 #include "content/public/browser/content_browser_client.h" |
| 28 #include "content/public/browser/devtools_agent_host.h" | 29 #include "content/public/browser/devtools_agent_host.h" |
| 29 #include "content/public/browser/javascript_dialog_manager.h" | 30 #include "content/public/browser/javascript_dialog_manager.h" |
| 30 #include "content/public/browser/navigation_controller.h" | 31 #include "content/public/browser/navigation_controller.h" |
| 31 #include "content/public/browser/navigation_entry.h" | 32 #include "content/public/browser/navigation_entry.h" |
| 32 #include "content/public/browser/render_process_host.h" | 33 #include "content/public/browser/render_process_host.h" |
| 33 #include "content/public/browser/render_view_host.h" | 34 #include "content/public/browser/render_view_host.h" |
| 34 #include "content/public/browser/render_widget_host_view.h" | 35 #include "content/public/browser/render_widget_host_view.h" |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 63 static const char kJpeg[] = "jpeg"; | 64 static const char kJpeg[] = "jpeg"; |
| 64 static int kDefaultScreenshotQuality = 80; | 65 static int kDefaultScreenshotQuality = 80; |
| 65 static int kFrameRateThresholdMs = 100; | 66 static int kFrameRateThresholdMs = 100; |
| 66 static int kCaptureRetryLimit = 2; | 67 static int kCaptureRetryLimit = 2; |
| 67 | 68 |
| 68 } // namespace | 69 } // namespace |
| 69 | 70 |
| 70 RendererOverridesHandler::RendererOverridesHandler() | 71 RendererOverridesHandler::RendererOverridesHandler() |
| 71 : has_last_compositor_frame_metadata_(false), | 72 : has_last_compositor_frame_metadata_(false), |
| 72 capture_retry_count_(0), | 73 capture_retry_count_(0), |
| 74 touch_emulation_enabled_(false), | |
| 73 weak_factory_(this) { | 75 weak_factory_(this) { |
| 74 RegisterCommandHandler( | 76 RegisterCommandHandler( |
| 75 devtools::DOM::setFileInputFiles::kName, | 77 devtools::DOM::setFileInputFiles::kName, |
| 76 base::Bind( | 78 base::Bind( |
| 77 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, | 79 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, |
| 78 base::Unretained(this))); | 80 base::Unretained(this))); |
| 79 RegisterCommandHandler( | 81 RegisterCommandHandler( |
| 80 devtools::Network::clearBrowserCache::kName, | 82 devtools::Network::clearBrowserCache::kName, |
| 81 base::Bind( | 83 base::Bind( |
| 82 &RendererOverridesHandler::ClearBrowserCache, | 84 &RendererOverridesHandler::ClearBrowserCache, |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 devtools::Page::navigateToHistoryEntry::kName, | 116 devtools::Page::navigateToHistoryEntry::kName, |
| 115 base::Bind( | 117 base::Bind( |
| 116 &RendererOverridesHandler::PageNavigateToHistoryEntry, | 118 &RendererOverridesHandler::PageNavigateToHistoryEntry, |
| 117 base::Unretained(this))); | 119 base::Unretained(this))); |
| 118 RegisterCommandHandler( | 120 RegisterCommandHandler( |
| 119 devtools::Page::captureScreenshot::kName, | 121 devtools::Page::captureScreenshot::kName, |
| 120 base::Bind( | 122 base::Bind( |
| 121 &RendererOverridesHandler::PageCaptureScreenshot, | 123 &RendererOverridesHandler::PageCaptureScreenshot, |
| 122 base::Unretained(this))); | 124 base::Unretained(this))); |
| 123 RegisterCommandHandler( | 125 RegisterCommandHandler( |
| 126 devtools::Page::setTouchEmulationEnabled::kName, | |
| 127 base::Bind( | |
| 128 &RendererOverridesHandler::PageSetTouchEmulationEnabled, | |
| 129 base::Unretained(this))); | |
| 130 RegisterCommandHandler( | |
| 124 devtools::Page::canScreencast::kName, | 131 devtools::Page::canScreencast::kName, |
| 125 base::Bind( | 132 base::Bind( |
| 126 &RendererOverridesHandler::PageCanScreencast, | 133 &RendererOverridesHandler::PageCanScreencast, |
| 127 base::Unretained(this))); | 134 base::Unretained(this))); |
| 128 RegisterCommandHandler( | 135 RegisterCommandHandler( |
| 129 devtools::Page::startScreencast::kName, | 136 devtools::Page::startScreencast::kName, |
| 130 base::Bind( | 137 base::Bind( |
| 131 &RendererOverridesHandler::PageStartScreencast, | 138 &RendererOverridesHandler::PageStartScreencast, |
| 132 base::Unretained(this))); | 139 base::Unretained(this))); |
| 133 RegisterCommandHandler( | 140 RegisterCommandHandler( |
| 134 devtools::Page::stopScreencast::kName, | 141 devtools::Page::stopScreencast::kName, |
| 135 base::Bind( | 142 base::Bind( |
| 136 &RendererOverridesHandler::PageStopScreencast, | 143 &RendererOverridesHandler::PageStopScreencast, |
| 137 base::Unretained(this))); | 144 base::Unretained(this))); |
| 138 RegisterCommandHandler( | 145 RegisterCommandHandler( |
| 139 devtools::Page::queryUsageAndQuota::kName, | 146 devtools::Page::queryUsageAndQuota::kName, |
| 140 base::Bind( | 147 base::Bind( |
| 141 &RendererOverridesHandler::PageQueryUsageAndQuota, | 148 &RendererOverridesHandler::PageQueryUsageAndQuota, |
| 142 base::Unretained(this))); | 149 base::Unretained(this))); |
| 143 RegisterCommandHandler( | 150 RegisterCommandHandler( |
| 144 devtools::Input::emulateTouchFromMouseEvent::kName, | 151 devtools::Input::emulateTouchFromMouseEvent::kName, |
| 145 base::Bind( | 152 base::Bind( |
| 146 &RendererOverridesHandler::InputEmulateTouchFromMouseEvent, | 153 &RendererOverridesHandler::InputEmulateTouchFromMouseEvent, |
| 147 base::Unretained(this))); | 154 base::Unretained(this))); |
| 148 } | 155 } |
| 149 | 156 |
| 150 RendererOverridesHandler::~RendererOverridesHandler() {} | 157 RendererOverridesHandler::~RendererOverridesHandler() {} |
| 151 | 158 |
| 152 void RendererOverridesHandler::OnClientDetached() { | 159 void RendererOverridesHandler::OnClientDetached() { |
| 153 if (screencast_command_ && host_) | 160 if (touch_emulation_enabled_) |
| 154 host_->SetTouchEventEmulationEnabled(false, false); | 161 SetTouchEventEmulationEnabled(false); |
| 155 screencast_command_ = NULL; | 162 screencast_command_ = NULL; |
| 156 } | 163 } |
| 157 | 164 |
| 158 void RendererOverridesHandler::OnSwapCompositorFrame( | 165 void RendererOverridesHandler::OnSwapCompositorFrame( |
| 159 const cc::CompositorFrameMetadata& frame_metadata) { | 166 const cc::CompositorFrameMetadata& frame_metadata) { |
| 160 last_compositor_frame_metadata_ = frame_metadata; | 167 last_compositor_frame_metadata_ = frame_metadata; |
| 161 has_last_compositor_frame_metadata_ = true; | 168 has_last_compositor_frame_metadata_ = true; |
| 162 | 169 |
| 163 if (screencast_command_) | 170 if (screencast_command_) |
| 164 InnerSwapCompositorFrame(); | 171 InnerSwapCompositorFrame(); |
| 165 } | 172 } |
| 166 | 173 |
| 167 void RendererOverridesHandler::OnVisibilityChanged(bool visible) { | 174 void RendererOverridesHandler::OnVisibilityChanged(bool visible) { |
| 168 if (!screencast_command_) | 175 if (!screencast_command_) |
| 169 return; | 176 return; |
| 170 NotifyScreencastVisibility(visible); | 177 NotifyScreencastVisibility(visible); |
| 171 } | 178 } |
| 172 | 179 |
| 173 void RendererOverridesHandler::SetRenderViewHost( | 180 void RendererOverridesHandler::SetRenderViewHost( |
| 174 RenderViewHostImpl* host) { | 181 RenderViewHostImpl* host) { |
| 175 host_ = host; | 182 host_ = host; |
| 176 if (screencast_command_ && host) | 183 if (touch_emulation_enabled_) |
| 177 host->SetTouchEventEmulationEnabled(true, true); | 184 SetTouchEventEmulationEnabled(true); |
| 178 } | 185 } |
| 179 | 186 |
| 180 void RendererOverridesHandler::ClearRenderViewHost() { | 187 void RendererOverridesHandler::ClearRenderViewHost() { |
| 181 host_ = NULL; | 188 host_ = NULL; |
| 182 } | 189 } |
| 183 | 190 |
| 184 bool RendererOverridesHandler::OnSetTouchEventEmulationEnabled() { | |
| 185 return screencast_command_.get() != NULL; | |
| 186 } | |
| 187 | |
| 188 void RendererOverridesHandler::InnerSwapCompositorFrame() { | 191 void RendererOverridesHandler::InnerSwapCompositorFrame() { |
| 189 if ((base::TimeTicks::Now() - last_frame_time_).InMilliseconds() < | 192 if ((base::TimeTicks::Now() - last_frame_time_).InMilliseconds() < |
| 190 kFrameRateThresholdMs) { | 193 kFrameRateThresholdMs) { |
| 191 return; | 194 return; |
| 192 } | 195 } |
| 193 | 196 |
| 194 if (!host_ || !host_->GetView()) | 197 if (!host_ || !host_->GetView()) |
| 195 return; | 198 return; |
| 196 | 199 |
| 197 last_frame_time_ = base::TimeTicks::Now(); | 200 last_frame_time_ = base::TimeTicks::Now(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 301 GetContentClient()->browser()->ClearCookies(host_); | 304 GetContentClient()->browser()->ClearCookies(host_); |
| 302 return command->SuccessResponse(NULL); | 305 return command->SuccessResponse(NULL); |
| 303 } | 306 } |
| 304 | 307 |
| 305 | 308 |
| 306 // Page agent handlers ------------------------------------------------------- | 309 // Page agent handlers ------------------------------------------------------- |
| 307 | 310 |
| 308 scoped_refptr<DevToolsProtocol::Response> | 311 scoped_refptr<DevToolsProtocol::Response> |
| 309 RendererOverridesHandler::PageDisable( | 312 RendererOverridesHandler::PageDisable( |
| 310 scoped_refptr<DevToolsProtocol::Command> command) { | 313 scoped_refptr<DevToolsProtocol::Command> command) { |
| 311 if (screencast_command_ && host_) | 314 OnClientDetached(); |
| 312 host_->SetTouchEventEmulationEnabled(false, false); | |
| 313 screencast_command_ = NULL; | |
| 314 return NULL; | 315 return NULL; |
| 315 } | 316 } |
| 316 | 317 |
| 317 scoped_refptr<DevToolsProtocol::Response> | 318 scoped_refptr<DevToolsProtocol::Response> |
| 318 RendererOverridesHandler::PageHandleJavaScriptDialog( | 319 RendererOverridesHandler::PageHandleJavaScriptDialog( |
| 319 scoped_refptr<DevToolsProtocol::Command> command) { | 320 scoped_refptr<DevToolsProtocol::Command> command) { |
| 320 base::DictionaryValue* params = command->params(); | 321 base::DictionaryValue* params = command->params(); |
| 321 const char* paramAccept = | 322 const char* paramAccept = |
| 322 devtools::Page::handleJavaScriptDialog::kParamAccept; | 323 devtools::Page::handleJavaScriptDialog::kParamAccept; |
| 323 bool accept = false; | 324 bool accept = false; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 481 &base_64_data); | 482 &base_64_data); |
| 482 | 483 |
| 483 base::DictionaryValue* response = new base::DictionaryValue(); | 484 base::DictionaryValue* response = new base::DictionaryValue(); |
| 484 response->SetString(devtools::Page::screencastFrame::kParamData, | 485 response->SetString(devtools::Page::screencastFrame::kParamData, |
| 485 base_64_data); | 486 base_64_data); |
| 486 | 487 |
| 487 SendAsyncResponse(command->SuccessResponse(response)); | 488 SendAsyncResponse(command->SuccessResponse(response)); |
| 488 } | 489 } |
| 489 | 490 |
| 490 scoped_refptr<DevToolsProtocol::Response> | 491 scoped_refptr<DevToolsProtocol::Response> |
| 492 RendererOverridesHandler::PageSetTouchEmulationEnabled( | |
| 493 scoped_refptr<DevToolsProtocol::Command> command) { | |
| 494 base::DictionaryValue* params = command->params(); | |
| 495 bool enabled; | |
| 496 if (!params || !params->GetBoolean( | |
| 497 devtools::Page::setTouchEmulationEnabled::kParamEnabled, | |
| 498 &enabled)) { | |
| 499 // Pass to renderer. | |
| 500 return NULL; | |
| 501 } | |
| 502 | |
| 503 if (touch_emulation_enabled_ != enabled) | |
| 504 SetTouchEventEmulationEnabled(enabled); | |
| 505 // Pass to renderer. | |
| 506 return NULL; | |
| 507 } | |
| 508 | |
| 509 scoped_refptr<DevToolsProtocol::Response> | |
| 491 RendererOverridesHandler::PageCanScreencast( | 510 RendererOverridesHandler::PageCanScreencast( |
| 492 scoped_refptr<DevToolsProtocol::Command> command) { | 511 scoped_refptr<DevToolsProtocol::Command> command) { |
| 493 base::DictionaryValue* result = new base::DictionaryValue(); | 512 base::DictionaryValue* result = new base::DictionaryValue(); |
| 494 #if defined(OS_ANDROID) | 513 #if defined(OS_ANDROID) |
| 495 result->SetBoolean(devtools::kResult, true); | 514 result->SetBoolean(devtools::kResult, true); |
| 496 #else | 515 #else |
| 497 result->SetBoolean(devtools::kResult, false); | 516 result->SetBoolean(devtools::kResult, false); |
| 498 #endif // defined(OS_ANDROID) | 517 #endif // defined(OS_ANDROID) |
| 499 return command->SuccessResponse(result); | 518 return command->SuccessResponse(result); |
| 500 } | 519 } |
| 501 | 520 |
| 502 scoped_refptr<DevToolsProtocol::Response> | 521 scoped_refptr<DevToolsProtocol::Response> |
| 503 RendererOverridesHandler::PageStartScreencast( | 522 RendererOverridesHandler::PageStartScreencast( |
| 504 scoped_refptr<DevToolsProtocol::Command> command) { | 523 scoped_refptr<DevToolsProtocol::Command> command) { |
| 505 screencast_command_ = command; | 524 screencast_command_ = command; |
| 506 if (!host_) | 525 if (!host_) |
| 507 return command->InternalErrorResponse("Could not connect to view"); | 526 return command->InternalErrorResponse("Could not connect to view"); |
| 508 host_->SetTouchEventEmulationEnabled(true, true); | 527 SetTouchEventEmulationEnabled(true); |
| 509 bool visible = !host_->is_hidden(); | 528 bool visible = !host_->is_hidden(); |
| 510 NotifyScreencastVisibility(visible); | 529 NotifyScreencastVisibility(visible); |
| 511 if (visible) { | 530 if (visible) { |
| 512 if (has_last_compositor_frame_metadata_) | 531 if (has_last_compositor_frame_metadata_) |
| 513 InnerSwapCompositorFrame(); | 532 InnerSwapCompositorFrame(); |
| 514 else | 533 else |
| 515 host_->Send(new ViewMsg_ForceRedraw(host_->GetRoutingID(), 0)); | 534 host_->Send(new ViewMsg_ForceRedraw(host_->GetRoutingID(), 0)); |
| 516 } | 535 } |
| 517 return command->SuccessResponse(NULL); | 536 return command->SuccessResponse(NULL); |
| 518 } | 537 } |
| 519 | 538 |
| 520 scoped_refptr<DevToolsProtocol::Response> | 539 scoped_refptr<DevToolsProtocol::Response> |
| 521 RendererOverridesHandler::PageStopScreencast( | 540 RendererOverridesHandler::PageStopScreencast( |
| 522 scoped_refptr<DevToolsProtocol::Command> command) { | 541 scoped_refptr<DevToolsProtocol::Command> command) { |
| 523 last_frame_time_ = base::TimeTicks(); | 542 last_frame_time_ = base::TimeTicks(); |
| 524 screencast_command_ = NULL; | 543 screencast_command_ = NULL; |
| 525 if (host_) | 544 SetTouchEventEmulationEnabled(false); |
| 526 host_->SetTouchEventEmulationEnabled(false, false); | |
| 527 return command->SuccessResponse(NULL); | 545 return command->SuccessResponse(NULL); |
| 528 } | 546 } |
| 529 | 547 |
| 530 void RendererOverridesHandler::ScreencastFrameCaptured( | 548 void RendererOverridesHandler::ScreencastFrameCaptured( |
| 531 const std::string& format, | 549 const std::string& format, |
| 532 int quality, | 550 int quality, |
| 533 const cc::CompositorFrameMetadata& metadata, | 551 const cc::CompositorFrameMetadata& metadata, |
| 534 bool success, | 552 bool success, |
| 535 const SkBitmap& bitmap) { | 553 const SkBitmap& bitmap) { |
| 536 if (!success) { | 554 if (!success) { |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 971 if (!host_) | 989 if (!host_) |
| 972 return command->InternalErrorResponse("Could not connect to view"); | 990 return command->InternalErrorResponse("Could not connect to view"); |
| 973 | 991 |
| 974 if (event->type == WebInputEvent::MouseWheel) | 992 if (event->type == WebInputEvent::MouseWheel) |
| 975 host_->ForwardWheelEvent(wheel_event); | 993 host_->ForwardWheelEvent(wheel_event); |
| 976 else | 994 else |
| 977 host_->ForwardMouseEvent(mouse_event); | 995 host_->ForwardMouseEvent(mouse_event); |
| 978 return command->SuccessResponse(NULL); | 996 return command->SuccessResponse(NULL); |
| 979 } | 997 } |
| 980 | 998 |
| 999 void RendererOverridesHandler::SetTouchEventEmulationEnabled(bool enabled) { | |
|
dgozman
2014/08/17 12:39:20
Calls from start/stopScreencast and setTouchEventE
pfeldman
2014/08/17 14:47:14
Could you remind me why we enable touch while scre
dgozman
2014/08/17 15:01:41
We use touch emulator to handle emulateTouchFromMo
| |
| 1000 touch_emulation_enabled_ = enabled; | |
| 1001 if (!host_) | |
| 1002 return; | |
| 1003 host_->SetTouchEventEmulationEnabled(enabled); | |
| 1004 WebContents* web_contents = WebContents::FromRenderViewHost(host_); | |
| 1005 if (web_contents) | |
| 1006 web_contents->SetForceDisableOverscrollContent(enabled); | |
| 1007 } | |
| 1008 | |
| 981 } // namespace content | 1009 } // namespace content |
| OLD | NEW |