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

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

Powered by Google App Engine
This is Rietveld 408576698