| 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" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 static const char kJpeg[] = "jpeg"; | 67 static const char kJpeg[] = "jpeg"; |
| 68 static int kDefaultScreenshotQuality = 80; | 68 static int kDefaultScreenshotQuality = 80; |
| 69 static int kFrameRateThresholdMs = 100; | 69 static int kFrameRateThresholdMs = 100; |
| 70 static int kCaptureRetryLimit = 2; | 70 static int kCaptureRetryLimit = 2; |
| 71 | 71 |
| 72 } // namespace | 72 } // namespace |
| 73 | 73 |
| 74 RendererOverridesHandler::RendererOverridesHandler() | 74 RendererOverridesHandler::RendererOverridesHandler() |
| 75 : has_last_compositor_frame_metadata_(false), | 75 : has_last_compositor_frame_metadata_(false), |
| 76 capture_retry_count_(0), | 76 capture_retry_count_(0), |
| 77 touch_emulation_enabled_(false), |
| 77 color_picker_enabled_(false), | 78 color_picker_enabled_(false), |
| 78 last_cursor_x_(-1), | 79 last_cursor_x_(-1), |
| 79 last_cursor_y_(-1), | 80 last_cursor_y_(-1), |
| 80 weak_factory_(this) { | 81 weak_factory_(this) { |
| 81 RegisterCommandHandler( | 82 RegisterCommandHandler( |
| 82 devtools::DOM::setFileInputFiles::kName, | 83 devtools::DOM::setFileInputFiles::kName, |
| 83 base::Bind( | 84 base::Bind( |
| 84 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, | 85 &RendererOverridesHandler::GrantPermissionsForSetFileInputFiles, |
| 85 base::Unretained(this))); | 86 base::Unretained(this))); |
| 86 RegisterCommandHandler( | 87 RegisterCommandHandler( |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 devtools::Page::navigateToHistoryEntry::kName, | 122 devtools::Page::navigateToHistoryEntry::kName, |
| 122 base::Bind( | 123 base::Bind( |
| 123 &RendererOverridesHandler::PageNavigateToHistoryEntry, | 124 &RendererOverridesHandler::PageNavigateToHistoryEntry, |
| 124 base::Unretained(this))); | 125 base::Unretained(this))); |
| 125 RegisterCommandHandler( | 126 RegisterCommandHandler( |
| 126 devtools::Page::captureScreenshot::kName, | 127 devtools::Page::captureScreenshot::kName, |
| 127 base::Bind( | 128 base::Bind( |
| 128 &RendererOverridesHandler::PageCaptureScreenshot, | 129 &RendererOverridesHandler::PageCaptureScreenshot, |
| 129 base::Unretained(this))); | 130 base::Unretained(this))); |
| 130 RegisterCommandHandler( | 131 RegisterCommandHandler( |
| 132 devtools::Page::setTouchEmulationEnabled::kName, |
| 133 base::Bind( |
| 134 &RendererOverridesHandler::PageSetTouchEmulationEnabled, |
| 135 base::Unretained(this))); |
| 136 RegisterCommandHandler( |
| 131 devtools::Page::canScreencast::kName, | 137 devtools::Page::canScreencast::kName, |
| 132 base::Bind( | 138 base::Bind( |
| 133 &RendererOverridesHandler::PageCanScreencast, | 139 &RendererOverridesHandler::PageCanScreencast, |
| 134 base::Unretained(this))); | 140 base::Unretained(this))); |
| 135 RegisterCommandHandler( | 141 RegisterCommandHandler( |
| 136 devtools::Page::startScreencast::kName, | 142 devtools::Page::startScreencast::kName, |
| 137 base::Bind( | 143 base::Bind( |
| 138 &RendererOverridesHandler::PageStartScreencast, | 144 &RendererOverridesHandler::PageStartScreencast, |
| 139 base::Unretained(this))); | 145 base::Unretained(this))); |
| 140 RegisterCommandHandler( | 146 RegisterCommandHandler( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 158 &RendererOverridesHandler::InputEmulateTouchFromMouseEvent, | 164 &RendererOverridesHandler::InputEmulateTouchFromMouseEvent, |
| 159 base::Unretained(this))); | 165 base::Unretained(this))); |
| 160 mouse_event_callback_ = base::Bind( | 166 mouse_event_callback_ = base::Bind( |
| 161 &RendererOverridesHandler::HandleMouseEvent, | 167 &RendererOverridesHandler::HandleMouseEvent, |
| 162 base::Unretained(this)); | 168 base::Unretained(this)); |
| 163 } | 169 } |
| 164 | 170 |
| 165 RendererOverridesHandler::~RendererOverridesHandler() {} | 171 RendererOverridesHandler::~RendererOverridesHandler() {} |
| 166 | 172 |
| 167 void RendererOverridesHandler::OnClientDetached() { | 173 void RendererOverridesHandler::OnClientDetached() { |
| 168 if (screencast_command_ && host_) | 174 touch_emulation_enabled_ = false; |
| 169 host_->SetTouchEventEmulationEnabled(false, false); | |
| 170 screencast_command_ = NULL; | 175 screencast_command_ = NULL; |
| 176 UpdateTouchEventEmulationState(); |
| 171 SetColorPickerEnabled(false); | 177 SetColorPickerEnabled(false); |
| 172 } | 178 } |
| 173 | 179 |
| 174 void RendererOverridesHandler::OnSwapCompositorFrame( | 180 void RendererOverridesHandler::OnSwapCompositorFrame( |
| 175 const cc::CompositorFrameMetadata& frame_metadata) { | 181 const cc::CompositorFrameMetadata& frame_metadata) { |
| 176 last_compositor_frame_metadata_ = frame_metadata; | 182 last_compositor_frame_metadata_ = frame_metadata; |
| 177 has_last_compositor_frame_metadata_ = true; | 183 has_last_compositor_frame_metadata_ = true; |
| 178 | 184 |
| 179 if (screencast_command_) | 185 if (screencast_command_) |
| 180 InnerSwapCompositorFrame(); | 186 InnerSwapCompositorFrame(); |
| 181 if (color_picker_enabled_) | 187 if (color_picker_enabled_) |
| 182 UpdateColorPickerFrame(); | 188 UpdateColorPickerFrame(); |
| 183 } | 189 } |
| 184 | 190 |
| 185 void RendererOverridesHandler::OnVisibilityChanged(bool visible) { | 191 void RendererOverridesHandler::OnVisibilityChanged(bool visible) { |
| 186 if (!screencast_command_) | 192 if (!screencast_command_) |
| 187 return; | 193 return; |
| 188 NotifyScreencastVisibility(visible); | 194 NotifyScreencastVisibility(visible); |
| 189 } | 195 } |
| 190 | 196 |
| 191 void RendererOverridesHandler::SetRenderViewHost( | 197 void RendererOverridesHandler::SetRenderViewHost( |
| 192 RenderViewHostImpl* host) { | 198 RenderViewHostImpl* host) { |
| 193 host_ = host; | 199 host_ = host; |
| 194 if (!host) | 200 if (!host) |
| 195 return; | 201 return; |
| 196 if (screencast_command_) | 202 UpdateTouchEventEmulationState(); |
| 197 host->SetTouchEventEmulationEnabled(true, true); | |
| 198 if (color_picker_enabled_) | 203 if (color_picker_enabled_) |
| 199 host->AddMouseEventCallback(mouse_event_callback_); | 204 host->AddMouseEventCallback(mouse_event_callback_); |
| 200 } | 205 } |
| 201 | 206 |
| 202 void RendererOverridesHandler::ClearRenderViewHost() { | 207 void RendererOverridesHandler::ClearRenderViewHost() { |
| 203 if (host_) | 208 if (host_) |
| 204 host_->RemoveMouseEventCallback(mouse_event_callback_); | 209 host_->RemoveMouseEventCallback(mouse_event_callback_); |
| 205 host_ = NULL; | 210 host_ = NULL; |
| 206 ResetColorPickerFrame(); | 211 ResetColorPickerFrame(); |
| 207 } | 212 } |
| 208 | 213 |
| 209 bool RendererOverridesHandler::OnSetTouchEventEmulationEnabled() { | |
| 210 return screencast_command_.get() != NULL; | |
| 211 } | |
| 212 | |
| 213 void RendererOverridesHandler::InnerSwapCompositorFrame() { | 214 void RendererOverridesHandler::InnerSwapCompositorFrame() { |
| 214 if ((base::TimeTicks::Now() - last_frame_time_).InMilliseconds() < | 215 if ((base::TimeTicks::Now() - last_frame_time_).InMilliseconds() < |
| 215 kFrameRateThresholdMs) { | 216 kFrameRateThresholdMs) { |
| 216 return; | 217 return; |
| 217 } | 218 } |
| 218 | 219 |
| 219 if (!host_ || !host_->GetView()) | 220 if (!host_ || !host_->GetView()) |
| 220 return; | 221 return; |
| 221 | 222 |
| 222 last_frame_time_ = base::TimeTicks::Now(); | 223 last_frame_time_ = base::TimeTicks::Now(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 GetContentClient()->browser()->ClearCookies(host_); | 327 GetContentClient()->browser()->ClearCookies(host_); |
| 327 return command->SuccessResponse(NULL); | 328 return command->SuccessResponse(NULL); |
| 328 } | 329 } |
| 329 | 330 |
| 330 | 331 |
| 331 // Page agent handlers ------------------------------------------------------- | 332 // Page agent handlers ------------------------------------------------------- |
| 332 | 333 |
| 333 scoped_refptr<DevToolsProtocol::Response> | 334 scoped_refptr<DevToolsProtocol::Response> |
| 334 RendererOverridesHandler::PageDisable( | 335 RendererOverridesHandler::PageDisable( |
| 335 scoped_refptr<DevToolsProtocol::Command> command) { | 336 scoped_refptr<DevToolsProtocol::Command> command) { |
| 336 if (screencast_command_ && host_) | 337 OnClientDetached(); |
| 337 host_->SetTouchEventEmulationEnabled(false, false); | |
| 338 screencast_command_ = NULL; | |
| 339 return NULL; | 338 return NULL; |
| 340 } | 339 } |
| 341 | 340 |
| 342 scoped_refptr<DevToolsProtocol::Response> | 341 scoped_refptr<DevToolsProtocol::Response> |
| 343 RendererOverridesHandler::PageHandleJavaScriptDialog( | 342 RendererOverridesHandler::PageHandleJavaScriptDialog( |
| 344 scoped_refptr<DevToolsProtocol::Command> command) { | 343 scoped_refptr<DevToolsProtocol::Command> command) { |
| 345 base::DictionaryValue* params = command->params(); | 344 base::DictionaryValue* params = command->params(); |
| 346 const char* paramAccept = | 345 const char* paramAccept = |
| 347 devtools::Page::handleJavaScriptDialog::kParamAccept; | 346 devtools::Page::handleJavaScriptDialog::kParamAccept; |
| 348 bool accept = false; | 347 bool accept = false; |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 &base_64_data); | 505 &base_64_data); |
| 507 | 506 |
| 508 base::DictionaryValue* response = new base::DictionaryValue(); | 507 base::DictionaryValue* response = new base::DictionaryValue(); |
| 509 response->SetString(devtools::Page::screencastFrame::kParamData, | 508 response->SetString(devtools::Page::screencastFrame::kParamData, |
| 510 base_64_data); | 509 base_64_data); |
| 511 | 510 |
| 512 SendAsyncResponse(command->SuccessResponse(response)); | 511 SendAsyncResponse(command->SuccessResponse(response)); |
| 513 } | 512 } |
| 514 | 513 |
| 515 scoped_refptr<DevToolsProtocol::Response> | 514 scoped_refptr<DevToolsProtocol::Response> |
| 515 RendererOverridesHandler::PageSetTouchEmulationEnabled( |
| 516 scoped_refptr<DevToolsProtocol::Command> command) { |
| 517 base::DictionaryValue* params = command->params(); |
| 518 bool enabled = false; |
| 519 if (!params || !params->GetBoolean( |
| 520 devtools::Page::setTouchEmulationEnabled::kParamEnabled, |
| 521 &enabled)) { |
| 522 // Pass to renderer. |
| 523 return NULL; |
| 524 } |
| 525 |
| 526 touch_emulation_enabled_ = enabled; |
| 527 UpdateTouchEventEmulationState(); |
| 528 |
| 529 // Pass to renderer. |
| 530 return NULL; |
| 531 } |
| 532 |
| 533 scoped_refptr<DevToolsProtocol::Response> |
| 516 RendererOverridesHandler::PageCanScreencast( | 534 RendererOverridesHandler::PageCanScreencast( |
| 517 scoped_refptr<DevToolsProtocol::Command> command) { | 535 scoped_refptr<DevToolsProtocol::Command> command) { |
| 518 base::DictionaryValue* result = new base::DictionaryValue(); | 536 base::DictionaryValue* result = new base::DictionaryValue(); |
| 519 #if defined(OS_ANDROID) | 537 #if defined(OS_ANDROID) |
| 520 result->SetBoolean(devtools::kResult, true); | 538 result->SetBoolean(devtools::kResult, true); |
| 521 #else | 539 #else |
| 522 result->SetBoolean(devtools::kResult, false); | 540 result->SetBoolean(devtools::kResult, false); |
| 523 #endif // defined(OS_ANDROID) | 541 #endif // defined(OS_ANDROID) |
| 524 return command->SuccessResponse(result); | 542 return command->SuccessResponse(result); |
| 525 } | 543 } |
| 526 | 544 |
| 527 scoped_refptr<DevToolsProtocol::Response> | 545 scoped_refptr<DevToolsProtocol::Response> |
| 528 RendererOverridesHandler::PageStartScreencast( | 546 RendererOverridesHandler::PageStartScreencast( |
| 529 scoped_refptr<DevToolsProtocol::Command> command) { | 547 scoped_refptr<DevToolsProtocol::Command> command) { |
| 530 screencast_command_ = command; | 548 screencast_command_ = command; |
| 549 UpdateTouchEventEmulationState(); |
| 531 if (!host_) | 550 if (!host_) |
| 532 return command->InternalErrorResponse("Could not connect to view"); | 551 return command->InternalErrorResponse("Could not connect to view"); |
| 533 host_->SetTouchEventEmulationEnabled(true, true); | |
| 534 bool visible = !host_->is_hidden(); | 552 bool visible = !host_->is_hidden(); |
| 535 NotifyScreencastVisibility(visible); | 553 NotifyScreencastVisibility(visible); |
| 536 if (visible) { | 554 if (visible) { |
| 537 if (has_last_compositor_frame_metadata_) | 555 if (has_last_compositor_frame_metadata_) |
| 538 InnerSwapCompositorFrame(); | 556 InnerSwapCompositorFrame(); |
| 539 else | 557 else |
| 540 host_->Send(new ViewMsg_ForceRedraw(host_->GetRoutingID(), 0)); | 558 host_->Send(new ViewMsg_ForceRedraw(host_->GetRoutingID(), 0)); |
| 541 } | 559 } |
| 542 return command->SuccessResponse(NULL); | 560 return command->SuccessResponse(NULL); |
| 543 } | 561 } |
| 544 | 562 |
| 545 scoped_refptr<DevToolsProtocol::Response> | 563 scoped_refptr<DevToolsProtocol::Response> |
| 546 RendererOverridesHandler::PageStopScreencast( | 564 RendererOverridesHandler::PageStopScreencast( |
| 547 scoped_refptr<DevToolsProtocol::Command> command) { | 565 scoped_refptr<DevToolsProtocol::Command> command) { |
| 548 last_frame_time_ = base::TimeTicks(); | 566 last_frame_time_ = base::TimeTicks(); |
| 549 screencast_command_ = NULL; | 567 screencast_command_ = NULL; |
| 550 if (host_) | 568 UpdateTouchEventEmulationState(); |
| 551 host_->SetTouchEventEmulationEnabled(false, false); | |
| 552 return command->SuccessResponse(NULL); | 569 return command->SuccessResponse(NULL); |
| 553 } | 570 } |
| 554 | 571 |
| 555 void RendererOverridesHandler::ScreencastFrameCaptured( | 572 void RendererOverridesHandler::ScreencastFrameCaptured( |
| 556 const std::string& format, | 573 const std::string& format, |
| 557 int quality, | 574 int quality, |
| 558 const cc::CompositorFrameMetadata& metadata, | 575 const cc::CompositorFrameMetadata& metadata, |
| 559 bool success, | 576 bool success, |
| 560 const SkBitmap& bitmap) { | 577 const SkBitmap& bitmap) { |
| 561 if (!success) { | 578 if (!success) { |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 if (!host_) | 1238 if (!host_) |
| 1222 return command->InternalErrorResponse("Could not connect to view"); | 1239 return command->InternalErrorResponse("Could not connect to view"); |
| 1223 | 1240 |
| 1224 if (event->type == WebInputEvent::MouseWheel) | 1241 if (event->type == WebInputEvent::MouseWheel) |
| 1225 host_->ForwardWheelEvent(wheel_event); | 1242 host_->ForwardWheelEvent(wheel_event); |
| 1226 else | 1243 else |
| 1227 host_->ForwardMouseEvent(mouse_event); | 1244 host_->ForwardMouseEvent(mouse_event); |
| 1228 return command->SuccessResponse(NULL); | 1245 return command->SuccessResponse(NULL); |
| 1229 } | 1246 } |
| 1230 | 1247 |
| 1248 void RendererOverridesHandler::UpdateTouchEventEmulationState() { |
| 1249 if (!host_) |
| 1250 return; |
| 1251 bool enabled = touch_emulation_enabled_ || screencast_command_; |
| 1252 host_->SetTouchEventEmulationEnabled(enabled); |
| 1253 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
| 1254 WebContents::FromRenderViewHost(host_)); |
| 1255 if (web_contents) |
| 1256 web_contents->SetForceDisableOverscrollContent(enabled); |
| 1257 } |
| 1258 |
| 1231 } // namespace content | 1259 } // namespace content |
| OLD | NEW |