Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: content/browser/devtools/renderer_overrides_handler.cc

Issue 474213002: DevTools: control touch emulation from the browser side only. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebaselined Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698