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

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

Issue 1980133002: Implement pointer lock API for out-of-process iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 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
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 <memory> 9 #include <memory>
10 10
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 #include "content/renderer/ime_event_guard.h" 87 #include "content/renderer/ime_event_guard.h"
88 #include "content/renderer/input/input_handler_manager.h" 88 #include "content/renderer/input/input_handler_manager.h"
89 #include "content/renderer/internal_document_state_data.h" 89 #include "content/renderer/internal_document_state_data.h"
90 #include "content/renderer/media/audio_device_factory.h" 90 #include "content/renderer/media/audio_device_factory.h"
91 #include "content/renderer/media/video_capture_impl_manager.h" 91 #include "content/renderer/media/video_capture_impl_manager.h"
92 #include "content/renderer/navigation_state_impl.h" 92 #include "content/renderer/navigation_state_impl.h"
93 #include "content/renderer/render_frame_impl.h" 93 #include "content/renderer/render_frame_impl.h"
94 #include "content/renderer/render_frame_proxy.h" 94 #include "content/renderer/render_frame_proxy.h"
95 #include "content/renderer/render_process.h" 95 #include "content/renderer/render_process.h"
96 #include "content/renderer/render_thread_impl.h" 96 #include "content/renderer/render_thread_impl.h"
97 #include "content/renderer/render_view_mouse_lock_dispatcher.h"
98 #include "content/renderer/render_widget_fullscreen_pepper.h" 97 #include "content/renderer/render_widget_fullscreen_pepper.h"
99 #include "content/renderer/renderer_webapplicationcachehost_impl.h" 98 #include "content/renderer/renderer_webapplicationcachehost_impl.h"
100 #include "content/renderer/resizing_mode_selector.h" 99 #include "content/renderer/resizing_mode_selector.h"
101 #include "content/renderer/savable_resources.h" 100 #include "content/renderer/savable_resources.h"
102 #include "content/renderer/speech_recognition_dispatcher.h" 101 #include "content/renderer/speech_recognition_dispatcher.h"
103 #include "content/renderer/text_input_client_observer.h" 102 #include "content/renderer/text_input_client_observer.h"
104 #include "content/renderer/web_ui_extension_data.h" 103 #include "content/renderer/web_ui_extension_data.h"
105 #include "content/renderer/websharedworker_proxy.h" 104 #include "content/renderer/websharedworker_proxy.h"
106 #include "media/audio/audio_output_device.h" 105 #include "media/audio/audio_output_device.h"
107 #include "media/base/media_switches.h" 106 #include "media/base/media_switches.h"
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c) 397 PendingFileChooser(const FileChooserParams& p, WebFileChooserCompletion* c)
399 : params(p), 398 : params(p),
400 completion(c) { 399 completion(c) {
401 } 400 }
402 FileChooserParams params; 401 FileChooserParams params;
403 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback. 402 WebFileChooserCompletion* completion; // MAY BE NULL to skip callback.
404 }; 403 };
405 404
406 namespace { 405 namespace {
407 406
408 class WebWidgetLockTarget : public MouseLockDispatcher::LockTarget {
409 public:
410 explicit WebWidgetLockTarget(blink::WebWidget* webwidget)
411 : webwidget_(webwidget) {}
412
413 void OnLockMouseACK(bool succeeded) override {
414 if (succeeded)
415 webwidget_->didAcquirePointerLock();
416 else
417 webwidget_->didNotAcquirePointerLock();
418 }
419
420 void OnMouseLockLost() override { webwidget_->didLosePointerLock(); }
421
422 bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override {
423 // The WebWidget handles mouse lock in WebKit's handleInputEvent().
424 return false;
425 }
426
427 private:
428 blink::WebWidget* webwidget_;
429 };
430
431 WebDragData DropDataToWebDragData(const DropData& drop_data) { 407 WebDragData DropDataToWebDragData(const DropData& drop_data) {
432 std::vector<WebDragData::Item> item_list; 408 std::vector<WebDragData::Item> item_list;
433 409
434 // These fields are currently unused when dragging into WebKit. 410 // These fields are currently unused when dragging into WebKit.
435 DCHECK(drop_data.download_metadata.empty()); 411 DCHECK(drop_data.download_metadata.empty());
436 DCHECK(drop_data.file_contents.empty()); 412 DCHECK(drop_data.file_contents.empty());
437 DCHECK(drop_data.file_description_filename.empty()); 413 DCHECK(drop_data.file_description_filename.empty());
438 414
439 if (!drop_data.text.is_null()) { 415 if (!drop_data.text.is_null()) {
440 WebDragData::Item item; 416 WebDragData::Item item;
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 top_controls_constraints_(TOP_CONTROLS_STATE_BOTH), 630 top_controls_constraints_(TOP_CONTROLS_STATE_BOTH),
655 #endif 631 #endif
656 top_controls_shrink_blink_size_(false), 632 top_controls_shrink_blink_size_(false),
657 top_controls_height_(0.f), 633 top_controls_height_(0.f),
658 webview_(nullptr), 634 webview_(nullptr),
659 has_scrolled_focused_editable_node_into_rect_(false), 635 has_scrolled_focused_editable_node_into_rect_(false),
660 page_zoom_level_(params.page_zoom_level), 636 page_zoom_level_(params.page_zoom_level),
661 main_render_frame_(nullptr), 637 main_render_frame_(nullptr),
662 frame_widget_(nullptr), 638 frame_widget_(nullptr),
663 speech_recognition_dispatcher_(NULL), 639 speech_recognition_dispatcher_(NULL),
664 mouse_lock_dispatcher_(NULL),
665 #if defined(OS_ANDROID) 640 #if defined(OS_ANDROID)
666 expected_content_intent_id_(0), 641 expected_content_intent_id_(0),
667 #endif 642 #endif
668 enumeration_completion_id_(0), 643 enumeration_completion_id_(0),
669 session_storage_namespace_id_(params.session_storage_namespace_id) { 644 session_storage_namespace_id_(params.session_storage_namespace_id) {
670 GetWidget()->set_owner_delegate(this); 645 GetWidget()->set_owner_delegate(this);
671 } 646 }
672 647
673 void RenderViewImpl::Initialize(const ViewMsg_New_Params& params, 648 void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
674 bool was_created_by_renderer) { 649 bool was_created_by_renderer) {
675 SetRoutingID(params.view_id); 650 SetRoutingID(params.view_id);
676 651
677 int opener_view_routing_id; 652 int opener_view_routing_id;
678 WebFrame* opener_frame = RenderFrameImpl::ResolveOpener( 653 WebFrame* opener_frame = RenderFrameImpl::ResolveOpener(
679 params.opener_frame_route_id, &opener_view_routing_id); 654 params.opener_frame_route_id, &opener_view_routing_id);
680 if (opener_view_routing_id != MSG_ROUTING_NONE && was_created_by_renderer) 655 if (opener_view_routing_id != MSG_ROUTING_NONE && was_created_by_renderer)
681 opener_id_ = opener_view_routing_id; 656 opener_id_ = opener_view_routing_id;
682 657
683 display_mode_ = params.initial_size.display_mode; 658 display_mode_ = params.initial_size.display_mode;
684 659
685 // Ensure we start with a valid next_page_id_ from the browser. 660 // Ensure we start with a valid next_page_id_ from the browser.
686 DCHECK_GE(next_page_id_, 0); 661 DCHECK_GE(next_page_id_, 0);
687 662
688 webview_ = WebView::create(this); 663 webview_ = WebView::create(this);
689 webwidget_ = webview_->widget(); 664 RenderWidget::DoInit(MSG_ROUTING_NONE, webview_->widget(), nullptr);
690 webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_));
691 665
692 g_view_map.Get().insert(std::make_pair(webview(), this)); 666 g_view_map.Get().insert(std::make_pair(webview(), this));
693 g_routing_id_view_map.Get().insert(std::make_pair(GetRoutingID(), this)); 667 g_routing_id_view_map.Get().insert(std::make_pair(GetRoutingID(), this));
694 668
695 const base::CommandLine& command_line = 669 const base::CommandLine& command_line =
696 *base::CommandLine::ForCurrentProcess(); 670 *base::CommandLine::ForCurrentProcess();
697 671
698 if (command_line.HasSwitch(switches::kStatsCollectionController)) 672 if (command_line.HasSwitch(switches::kStatsCollectionController))
699 stats_collection_observer_.reset(new StatsCollectionObserver(this)); 673 stats_collection_observer_.reset(new StatsCollectionObserver(this));
700 674
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 content_detectors_.push_back(base::WrapUnique(new AddressDetector())); 740 content_detectors_.push_back(base::WrapUnique(new AddressDetector()));
767 const std::string& contry_iso = 741 const std::string& contry_iso =
768 params.renderer_preferences.network_contry_iso; 742 params.renderer_preferences.network_contry_iso;
769 if (!contry_iso.empty()) { 743 if (!contry_iso.empty()) {
770 content_detectors_.push_back( 744 content_detectors_.push_back(
771 base::WrapUnique(new PhoneNumberDetector(contry_iso))); 745 base::WrapUnique(new PhoneNumberDetector(contry_iso)));
772 } 746 }
773 content_detectors_.push_back(base::WrapUnique(new EmailDetector())); 747 content_detectors_.push_back(base::WrapUnique(new EmailDetector()));
774 #endif 748 #endif
775 749
776 RenderThread::Get()->AddRoute(GetRoutingID(), this);
777 // Take a reference on behalf of the RenderThread. This will be balanced
778 // when we receive ViewMsg_Close in the RenderWidget (which RenderView
779 // inherits from).
780 AddRef();
781 if (RenderThreadImpl::current()) {
782 RenderThreadImpl::current()->WidgetCreated();
783 if (is_hidden_)
784 RenderThreadImpl::current()->WidgetHidden();
785 }
786
787 // If this is a popup, we must wait for the CreatingNew_ACK message before 750 // If this is a popup, we must wait for the CreatingNew_ACK message before
788 // completing initialization. Otherwise, we can finish it now. 751 // completing initialization. Otherwise, we can finish it now.
789 if (opener_id_ == MSG_ROUTING_NONE) 752 if (opener_id_ == MSG_ROUTING_NONE)
790 did_show_ = true; 753 did_show_ = true;
791 754
792 // Set the main frame's name. Only needs to be done for WebLocalFrames, 755 // Set the main frame's name. Only needs to be done for WebLocalFrames,
793 // since the remote case was handled as part of SetReplicatedState on the 756 // since the remote case was handled as part of SetReplicatedState on the
794 // proxy above. 757 // proxy above.
795 if (!params.replicated_frame_state.name.empty() && 758 if (!params.replicated_frame_state.name.empty() &&
796 webview()->mainFrame()->isWebLocalFrame()) { 759 webview()->mainFrame()->isWebLocalFrame()) {
(...skipping 11 matching lines...) Expand all
808 if (!params.enable_auto_resize) { 771 if (!params.enable_auto_resize) {
809 OnResize(params.initial_size); 772 OnResize(params.initial_size);
810 } else { 773 } else {
811 OnEnableAutoResize(params.min_size, params.max_size); 774 OnEnableAutoResize(params.min_size, params.max_size);
812 } 775 }
813 776
814 #if defined(OS_MACOSX) 777 #if defined(OS_MACOSX)
815 new TextInputClientObserver(this); 778 new TextInputClientObserver(this);
816 #endif // defined(OS_MACOSX) 779 #endif // defined(OS_MACOSX)
817 780
818 // The next group of objects all implement RenderViewObserver, so are deleted
819 // along with the RenderView automatically.
820 mouse_lock_dispatcher_ = new RenderViewMouseLockDispatcher(this);
821
822 // We don't use HistoryController in OOPIF-enabled modes. 781 // We don't use HistoryController in OOPIF-enabled modes.
823 if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) 782 if (!SiteIsolationPolicy::UseSubframeNavigationEntries())
824 history_controller_.reset(new HistoryController(this)); 783 history_controller_.reset(new HistoryController(this));
825 784
826 new IdleUserDetector(this); 785 new IdleUserDetector(this);
827 786
828 if (command_line.HasSwitch(switches::kDomAutomationController)) 787 if (command_line.HasSwitch(switches::kDomAutomationController))
829 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION; 788 enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION;
830 if (command_line.HasSwitch(switches::kStatsCollectionController)) 789 if (command_line.HasSwitch(switches::kStatsCollectionController))
831 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION; 790 enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION;
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 1951
1993 // NOTE: initial_rect_ may still have its default values at this point, but 1952 // NOTE: initial_rect_ may still have its default values at this point, but
1994 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the 1953 // that's okay. It'll be ignored if disposition is not NEW_POPUP, or the
1995 // browser process will impose a default position otherwise. 1954 // browser process will impose a default position otherwise.
1996 Send(new ViewHostMsg_ShowView(opener_id_, GetRoutingID(), 1955 Send(new ViewHostMsg_ShowView(opener_id_, GetRoutingID(),
1997 NavigationPolicyToDisposition(policy), 1956 NavigationPolicyToDisposition(policy),
1998 initial_rect_, opened_by_user_gesture_)); 1957 initial_rect_, opened_by_user_gesture_));
1999 SetPendingWindowRect(initial_rect_); 1958 SetPendingWindowRect(initial_rect_);
2000 } 1959 }
2001 1960
2002 bool RenderViewImpl::requestPointerLock() {
2003 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get());
2004 }
2005
2006 void RenderViewImpl::requestPointerUnlock() {
2007 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get());
2008 }
2009
2010 bool RenderViewImpl::isPointerLocked() {
2011 return mouse_lock_dispatcher_->IsMouseLockedTo(
2012 webwidget_mouse_lock_target_.get());
2013 }
2014
2015 void RenderViewImpl::onMouseDown(const WebNode& mouse_down_node) { 1961 void RenderViewImpl::onMouseDown(const WebNode& mouse_down_node) {
2016 FOR_EACH_OBSERVER( 1962 FOR_EACH_OBSERVER(
2017 RenderViewObserver, observers_, OnMouseDown(mouse_down_node)); 1963 RenderViewObserver, observers_, OnMouseDown(mouse_down_node));
2018 } 1964 }
2019 1965
2020 void RenderViewImpl::didHandleGestureEvent( 1966 void RenderViewImpl::didHandleGestureEvent(
2021 const WebGestureEvent& event, 1967 const WebGestureEvent& event,
2022 bool event_cancelled) { 1968 bool event_cancelled) {
2023 RenderWidget::didHandleGestureEvent(event, event_cancelled); 1969 RenderWidget::didHandleGestureEvent(event, event_cancelled);
2024 1970
(...skipping 1370 matching lines...) Expand 10 before | Expand all | Expand 10 after
3395 return render_frame->focused_pepper_plugin(); 3341 return render_frame->focused_pepper_plugin();
3396 } 3342 }
3397 frame = frame->traverseNext(false); 3343 frame = frame->traverseNext(false);
3398 } 3344 }
3399 3345
3400 return nullptr; 3346 return nullptr;
3401 } 3347 }
3402 #endif 3348 #endif
3403 3349
3404 } // namespace content 3350 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_view_impl.h ('k') | content/renderer/render_view_mouse_lock_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698