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 |