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

Side by Side Diff: content/renderer/render_view_impl.cc

Issue 8970016: refactoring mouse lock to support pepper and WebKit (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Refactor LockTarget interface & Tests Created 8 years, 11 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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/renderer/render_view_impl.h" 5 #include "content/renderer/render_view_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 #include "content/renderer/web_intents_host.h" 57 #include "content/renderer/web_intents_host.h"
58 #include "content/renderer/java/java_bridge_dispatcher.h" 58 #include "content/renderer/java/java_bridge_dispatcher.h"
59 #include "content/renderer/load_progress_tracker.h" 59 #include "content/renderer/load_progress_tracker.h"
60 #include "content/renderer/media/audio_message_filter.h" 60 #include "content/renderer/media/audio_message_filter.h"
61 #include "content/renderer/media/audio_renderer_impl.h" 61 #include "content/renderer/media/audio_renderer_impl.h"
62 #include "content/renderer/media/media_stream_dependency_factory.h" 62 #include "content/renderer/media/media_stream_dependency_factory.h"
63 #include "content/renderer/media/media_stream_dispatcher.h" 63 #include "content/renderer/media/media_stream_dispatcher.h"
64 #include "content/renderer/media/media_stream_impl.h" 64 #include "content/renderer/media/media_stream_impl.h"
65 #include "content/renderer/media/render_media_log.h" 65 #include "content/renderer/media/render_media_log.h"
66 #include "content/renderer/mhtml_generator.h" 66 #include "content/renderer/mhtml_generator.h"
67 #include "content/renderer/mouse_lock_dispatcher.h"
67 #include "content/renderer/notification_provider.h" 68 #include "content/renderer/notification_provider.h"
68 #include "content/renderer/p2p/socket_dispatcher.h" 69 #include "content/renderer/p2p/socket_dispatcher.h"
69 #include "content/renderer/plugin_channel_host.h" 70 #include "content/renderer/plugin_channel_host.h"
70 #include "content/renderer/render_audiosourceprovider.h" 71 #include "content/renderer/render_audiosourceprovider.h"
71 #include "content/renderer/render_process.h" 72 #include "content/renderer/render_process.h"
72 #include "content/renderer/render_thread_impl.h" 73 #include "content/renderer/render_thread_impl.h"
73 #include "content/renderer/render_widget_fullscreen_pepper.h" 74 #include "content/renderer/render_widget_fullscreen_pepper.h"
74 #include "content/renderer/renderer_accessibility.h" 75 #include "content/renderer/renderer_accessibility.h"
75 #include "content/renderer/renderer_gpu_video_decoder_factories.h" 76 #include "content/renderer/renderer_gpu_video_decoder_factories.h"
76 #include "content/renderer/renderer_webapplicationcachehost_impl.h" 77 #include "content/renderer/renderer_webapplicationcachehost_impl.h"
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 cached_has_main_frame_horizontal_scrollbar_(false), 364 cached_has_main_frame_horizontal_scrollbar_(false),
364 cached_has_main_frame_vertical_scrollbar_(false), 365 cached_has_main_frame_vertical_scrollbar_(false),
365 ALLOW_THIS_IN_INITIALIZER_LIST(cookie_jar_(this)), 366 ALLOW_THIS_IN_INITIALIZER_LIST(cookie_jar_(this)),
366 geolocation_dispatcher_(NULL), 367 geolocation_dispatcher_(NULL),
367 speech_input_dispatcher_(NULL), 368 speech_input_dispatcher_(NULL),
368 device_orientation_dispatcher_(NULL), 369 device_orientation_dispatcher_(NULL),
369 media_stream_dispatcher_(NULL), 370 media_stream_dispatcher_(NULL),
370 p2p_socket_dispatcher_(NULL), 371 p2p_socket_dispatcher_(NULL),
371 devtools_agent_(NULL), 372 devtools_agent_(NULL),
372 renderer_accessibility_(NULL), 373 renderer_accessibility_(NULL),
374 mouse_lock_dispatcher_(NULL),
373 session_storage_namespace_id_(session_storage_namespace_id), 375 session_storage_namespace_id_(session_storage_namespace_id),
374 handling_select_range_(false), 376 handling_select_range_(false),
375 #if defined(OS_WIN) 377 #if defined(OS_WIN)
376 focused_plugin_id_(-1), 378 focused_plugin_id_(-1),
377 #endif 379 #endif
378 ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)) { 380 ALLOW_THIS_IN_INITIALIZER_LIST(pepper_delegate_(this)) {
379 routing_id_ = routing_id; 381 routing_id_ = routing_id;
380 surface_id_ = surface_id; 382 surface_id_ = surface_id;
381 if (opener_id != MSG_ROUTING_NONE) 383 if (opener_id != MSG_ROUTING_NONE)
382 opener_id_ = opener_id; 384 opener_id_ = opener_id;
383 385
384 // Ensure we start with a valid next_page_id_ from the browser. 386 // Ensure we start with a valid next_page_id_ from the browser.
385 DCHECK_GE(next_page_id_, 0); 387 DCHECK_GE(next_page_id_, 0);
386 388
387 #if defined(ENABLE_NOTIFICATIONS) 389 #if defined(ENABLE_NOTIFICATIONS)
388 notification_provider_ = new NotificationProvider(this); 390 notification_provider_ = new NotificationProvider(this);
389 #else 391 #else
390 notification_provider_ = NULL; 392 notification_provider_ = NULL;
391 #endif 393 #endif
392 394
393 webwidget_ = WebView::create(this); 395 webwidget_ = WebView::create(this);
396 webwidget_mouse_lock_target_.reset(
397 MouseLockDispatcher::CreateLockTarget(webwidget_));
394 398
395 if (counter) { 399 if (counter) {
396 shared_popup_counter_ = counter; 400 shared_popup_counter_ = counter;
397 shared_popup_counter_->data++; 401 shared_popup_counter_->data++;
398 decrement_shared_popup_at_destruction_ = true; 402 decrement_shared_popup_at_destruction_ = true;
399 } else { 403 } else {
400 shared_popup_counter_ = new SharedRenderViewCounter(0); 404 shared_popup_counter_ = new SharedRenderViewCounter(0);
401 decrement_shared_popup_at_destruction_ = false; 405 decrement_shared_popup_at_destruction_ = false;
402 } 406 }
403 407
(...skipping 27 matching lines...) Expand all
431 #if defined(ENABLE_P2P_APIS) 435 #if defined(ENABLE_P2P_APIS)
432 if (!p2p_socket_dispatcher_) 436 if (!p2p_socket_dispatcher_)
433 p2p_socket_dispatcher_ = new content::P2PSocketDispatcher(this); 437 p2p_socket_dispatcher_ = new content::P2PSocketDispatcher(this);
434 #endif 438 #endif
435 439
436 new MHTMLGenerator(this); 440 new MHTMLGenerator(this);
437 #if defined(OS_MACOSX) 441 #if defined(OS_MACOSX)
438 new TextInputClientObserver(this); 442 new TextInputClientObserver(this);
439 #endif // defined(OS_MACOSX) 443 #endif // defined(OS_MACOSX)
440 444
445 // The next group of objects all implement RenderViewObserver, so are deleted
446 // along with the RenderView automatically.
441 devtools_agent_ = new DevToolsAgent(this); 447 devtools_agent_ = new DevToolsAgent(this);
442
443 renderer_accessibility_ = new RendererAccessibility(this); 448 renderer_accessibility_ = new RendererAccessibility(this);
449 mouse_lock_dispatcher_ = new MouseLockDispatcher(this);
444 450
445 new IdleUserDetector(this); 451 new IdleUserDetector(this);
446 452
447 content::GetContentClient()->renderer()->RenderViewCreated(this); 453 content::GetContentClient()->renderer()->RenderViewCreated(this);
448 } 454 }
449 455
450 RenderViewImpl::~RenderViewImpl() { 456 RenderViewImpl::~RenderViewImpl() {
451 history_page_ids_.clear(); 457 history_page_ids_.clear();
452 458
453 if (decrement_shared_popup_at_destruction_) 459 if (decrement_shared_popup_at_destruction_)
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 // TODO(viettrungluu): Move to a separate message filter. 715 // TODO(viettrungluu): Move to a separate message filter.
710 #if defined(ENABLE_FLAPPER_HACKS) 716 #if defined(ENABLE_FLAPPER_HACKS)
711 IPC_MESSAGE_HANDLER(PepperMsg_ConnectTcpACK, OnConnectTcpACK) 717 IPC_MESSAGE_HANDLER(PepperMsg_ConnectTcpACK, OnConnectTcpACK)
712 #endif 718 #endif
713 #if defined(OS_MACOSX) 719 #if defined(OS_MACOSX)
714 IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize) 720 IPC_MESSAGE_HANDLER(ViewMsg_SetInLiveResize, OnSetInLiveResize)
715 #endif 721 #endif
716 IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryLengthAndPrune, 722 IPC_MESSAGE_HANDLER(ViewMsg_SetHistoryLengthAndPrune,
717 OnSetHistoryLengthAndPrune) 723 OnSetHistoryLengthAndPrune)
718 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode) 724 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
719 IPC_MESSAGE_HANDLER(ViewMsg_LockMouse_ACK, OnLockMouseACK)
720 IPC_MESSAGE_HANDLER(ViewMsg_MouseLockLost, OnMouseLockLost)
721 IPC_MESSAGE_HANDLER(JavaBridgeMsg_Init, OnJavaBridgeInit) 725 IPC_MESSAGE_HANDLER(JavaBridgeMsg_Init, OnJavaBridgeInit)
722 726
723 // Have the super handle all other messages. 727 // Have the super handle all other messages.
724 IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message)) 728 IPC_MESSAGE_UNHANDLED(handled = RenderWidget::OnMessageReceived(message))
725 IPC_END_MESSAGE_MAP() 729 IPC_END_MESSAGE_MAP()
726 730
727 if (!msg_is_ok) { 731 if (!msg_is_ok) {
728 // The message had a handler, but its deserialization failed. 732 // The message had a handler, but its deserialization failed.
729 // Kill the renderer to avoid potential spoofing attacks. 733 // Kill the renderer to avoid potential spoofing attacks.
730 CHECK(false) << "Unable to deserialize message in RenderViewImpl."; 734 CHECK(false) << "Unable to deserialize message in RenderViewImpl.";
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1890 1894
1891 bool RenderViewImpl::enterFullScreen() { 1895 bool RenderViewImpl::enterFullScreen() {
1892 Send(new ViewHostMsg_ToggleFullscreen(routing_id_, true)); 1896 Send(new ViewHostMsg_ToggleFullscreen(routing_id_, true));
1893 return true; 1897 return true;
1894 } 1898 }
1895 1899
1896 void RenderViewImpl::exitFullScreen() { 1900 void RenderViewImpl::exitFullScreen() {
1897 Send(new ViewHostMsg_ToggleFullscreen(routing_id_, false)); 1901 Send(new ViewHostMsg_ToggleFullscreen(routing_id_, false));
1898 } 1902 }
1899 1903
1904 bool RenderViewImpl::requestPointerLock() {
1905 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get());
1906 }
1907
1908 void RenderViewImpl::requestPointerUnlock() {
1909 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get());
1910 }
1911
1912 bool RenderViewImpl::isPointerLocked() {
1913 return mouse_lock_dispatcher_->IsMouseLockedTo(
1914 webwidget_mouse_lock_target_.get());
1915 }
1916
1900 // WebKit::WebFrameClient ----------------------------------------------------- 1917 // WebKit::WebFrameClient -----------------------------------------------------
1901 1918
1902 WebPlugin* RenderViewImpl::createPlugin(WebFrame* frame, 1919 WebPlugin* RenderViewImpl::createPlugin(WebFrame* frame,
1903 const WebPluginParams& params) { 1920 const WebPluginParams& params) {
1904 WebPlugin* plugin = NULL; 1921 WebPlugin* plugin = NULL;
1905 if (content::GetContentClient()->renderer()->OverrideCreatePlugin( 1922 if (content::GetContentClient()->renderer()->OverrideCreatePlugin(
1906 this, frame, params, &plugin)) { 1923 this, frame, params, &plugin)) {
1907 return plugin; 1924 return plugin;
1908 } 1925 }
1909 1926
(...skipping 2438 matching lines...) Expand 10 before | Expand all | Expand 10 after
4348 WebView* doomed = webview(); 4365 WebView* doomed = webview();
4349 RenderWidget::Close(); 4366 RenderWidget::Close();
4350 g_view_map.Get().erase(doomed); 4367 g_view_map.Get().erase(doomed);
4351 } 4368 }
4352 4369
4353 void RenderViewImpl::DidHandleKeyEvent() { 4370 void RenderViewImpl::DidHandleKeyEvent() {
4354 edit_commands_.clear(); 4371 edit_commands_.clear();
4355 } 4372 }
4356 4373
4357 bool RenderViewImpl::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) { 4374 bool RenderViewImpl::WillHandleMouseEvent(const WebKit::WebMouseEvent& event) {
4358 return pepper_delegate_.HandleMouseEvent(event); 4375 pepper_delegate_.WillHandleMouseEvent();
4376
4377 // If the mouse is locked, only the current owner of the mouse lock can
4378 // process mouse events.
4379 return mouse_lock_dispatcher_->WillHandleMouseEvent(event);
4359 } 4380 }
4360 4381
4361 void RenderViewImpl::DidHandleMouseEvent(const WebKit::WebMouseEvent& event) { 4382 void RenderViewImpl::DidHandleMouseEvent(const WebKit::WebMouseEvent& event) {
4362 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleMouseEvent(event)); 4383 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleMouseEvent(event));
4363 } 4384 }
4364 4385
4365 void RenderViewImpl::DidHandleTouchEvent(const WebTouchEvent& event) { 4386 void RenderViewImpl::DidHandleTouchEvent(const WebTouchEvent& event) {
4366 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleTouchEvent(event)); 4387 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidHandleTouchEvent(event));
4367 } 4388 }
4368 4389
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
4857 4878
4858 void RenderViewImpl::OnEnableViewSourceMode() { 4879 void RenderViewImpl::OnEnableViewSourceMode() {
4859 if (!webview()) 4880 if (!webview())
4860 return; 4881 return;
4861 WebFrame* main_frame = webview()->mainFrame(); 4882 WebFrame* main_frame = webview()->mainFrame();
4862 if (!main_frame) 4883 if (!main_frame)
4863 return; 4884 return;
4864 main_frame->enableViewSourceMode(true); 4885 main_frame->enableViewSourceMode(true);
4865 } 4886 }
4866 4887
4867 void RenderViewImpl::OnLockMouseACK(bool succeeded) {
4868 // Mouse Lock removes the system cursor and provides all mouse motion as
4869 // .movementX/Y values on events all sent to a fixed target. This requires
4870 // content to specifically request the mode to be entered.
4871 // Mouse Capture is implicitly given for the duration of a drag event, and
4872 // sends all mouse events to the initial target of the drag.
4873 // If Lock is entered it supercedes any in progress Capture.
4874 if (succeeded)
4875 OnMouseCaptureLost();
4876
4877 pepper_delegate_.OnLockMouseACK(succeeded);
4878 }
4879
4880 void RenderViewImpl::OnMouseLockLost() {
4881 pepper_delegate_.OnMouseLockLost();
4882 }
4883
4884 bool RenderViewImpl::WebWidgetHandlesCompositorScheduling() const { 4888 bool RenderViewImpl::WebWidgetHandlesCompositorScheduling() const {
4885 return !!RenderThreadImpl::current()->compositor_thread(); 4889 return !!RenderThreadImpl::current()->compositor_thread();
4886 } 4890 }
4887 4891
4888 void RenderViewImpl::OnJavaBridgeInit() { 4892 void RenderViewImpl::OnJavaBridgeInit() {
4889 DCHECK(!java_bridge_dispatcher_.get()); 4893 DCHECK(!java_bridge_dispatcher_.get());
4890 #if defined(ENABLE_JAVA_BRIDGE) 4894 #if defined(ENABLE_JAVA_BRIDGE)
4891 java_bridge_dispatcher_.reset(new JavaBridgeDispatcher(this)); 4895 java_bridge_dispatcher_.reset(new JavaBridgeDispatcher(this));
4892 #endif 4896 #endif
4893 } 4897 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698