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 |