OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |