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_widget.h" | 5 #include "content/renderer/render_widget.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 using blink::WebWidget; | 133 using blink::WebWidget; |
134 | 134 |
135 #define STATIC_ASSERT_ENUM(a, b) \ | 135 #define STATIC_ASSERT_ENUM(a, b) \ |
136 static_assert(static_cast<int>(a) == static_cast<int>(b), \ | 136 static_assert(static_cast<int>(a) == static_cast<int>(b), \ |
137 "mismatching enums: " #a) | 137 "mismatching enums: " #a) |
138 | 138 |
139 namespace { | 139 namespace { |
140 | 140 |
141 typedef std::map<std::string, ui::TextInputMode> TextInputModeMap; | 141 typedef std::map<std::string, ui::TextInputMode> TextInputModeMap; |
142 | 142 |
| 143 class WebWidgetLockTarget : public content::MouseLockDispatcher::LockTarget { |
| 144 public: |
| 145 explicit WebWidgetLockTarget(blink::WebWidget* webwidget) |
| 146 : webwidget_(webwidget) {} |
| 147 |
| 148 void OnLockMouseACK(bool succeeded) override { |
| 149 if (succeeded) |
| 150 webwidget_->didAcquirePointerLock(); |
| 151 else |
| 152 webwidget_->didNotAcquirePointerLock(); |
| 153 } |
| 154 |
| 155 void OnMouseLockLost() override { webwidget_->didLosePointerLock(); } |
| 156 |
| 157 bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override { |
| 158 // The WebWidget handles mouse lock in WebKit's handleInputEvent(). |
| 159 return false; |
| 160 } |
| 161 |
| 162 private: |
| 163 blink::WebWidget* webwidget_; |
| 164 }; |
| 165 |
143 class TextInputModeMapSingleton { | 166 class TextInputModeMapSingleton { |
144 public: | 167 public: |
145 static TextInputModeMapSingleton* GetInstance() { | 168 static TextInputModeMapSingleton* GetInstance() { |
146 return base::Singleton<TextInputModeMapSingleton>::get(); | 169 return base::Singleton<TextInputModeMapSingleton>::get(); |
147 } | 170 } |
148 TextInputModeMapSingleton() { | 171 TextInputModeMapSingleton() { |
149 map_["verbatim"] = ui::TEXT_INPUT_MODE_VERBATIM; | 172 map_["verbatim"] = ui::TEXT_INPUT_MODE_VERBATIM; |
150 map_["latin"] = ui::TEXT_INPUT_MODE_LATIN; | 173 map_["latin"] = ui::TEXT_INPUT_MODE_LATIN; |
151 map_["latin-name"] = ui::TEXT_INPUT_MODE_LATIN_NAME; | 174 map_["latin-name"] = ui::TEXT_INPUT_MODE_LATIN_NAME; |
152 map_["latin-prose"] = ui::TEXT_INPUT_MODE_LATIN_PROSE; | 175 map_["latin-prose"] = ui::TEXT_INPUT_MODE_LATIN_PROSE; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 screen_info_(screen_info), | 263 screen_info_(screen_info), |
241 device_scale_factor_(screen_info_.deviceScaleFactor), | 264 device_scale_factor_(screen_info_.deviceScaleFactor), |
242 next_output_surface_id_(0), | 265 next_output_surface_id_(0), |
243 #if defined(OS_ANDROID) | 266 #if defined(OS_ANDROID) |
244 text_field_is_dirty_(false), | 267 text_field_is_dirty_(false), |
245 #endif | 268 #endif |
246 popup_origin_scale_for_emulation_(0.f), | 269 popup_origin_scale_for_emulation_(0.f), |
247 frame_swap_message_queue_(new FrameSwapMessageQueue()), | 270 frame_swap_message_queue_(new FrameSwapMessageQueue()), |
248 resizing_mode_selector_(new ResizingModeSelector()), | 271 resizing_mode_selector_(new ResizingModeSelector()), |
249 has_host_context_menu_location_(false), | 272 has_host_context_menu_location_(false), |
| 273 mouse_lock_dispatcher_(nullptr), |
250 has_focus_(false) { | 274 has_focus_(false) { |
251 if (!swapped_out) | 275 if (!swapped_out) |
252 RenderProcess::current()->AddRefProcess(); | 276 RenderProcess::current()->AddRefProcess(); |
253 DCHECK(RenderThread::Get()); | 277 DCHECK(RenderThread::Get()); |
254 device_color_profile_.push_back('0'); | 278 device_color_profile_.push_back('0'); |
255 #if defined(OS_ANDROID) | 279 #if defined(OS_ANDROID) |
256 text_input_info_history_.push_back(blink::WebTextInputInfo()); | 280 text_input_info_history_.push_back(blink::WebTextInputInfo()); |
257 #endif | 281 #endif |
258 | 282 |
259 // In tests there may not be a RenderThreadImpl. | 283 // In tests there may not be a RenderThreadImpl. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } | 330 } |
307 scoped_refptr<RenderWidget> widget( | 331 scoped_refptr<RenderWidget> widget( |
308 new RenderWidget(compositor_deps, blink::WebPopupTypeNone, screen_info, | 332 new RenderWidget(compositor_deps, blink::WebPopupTypeNone, screen_info, |
309 false, hidden, false)); | 333 false, hidden, false)); |
310 widget->SetRoutingID(routing_id); | 334 widget->SetRoutingID(routing_id); |
311 widget->for_oopif_ = true; | 335 widget->for_oopif_ = true; |
312 // DoInit increments the reference count on |widget|, keeping it alive after | 336 // DoInit increments the reference count on |widget|, keeping it alive after |
313 // this function returns. | 337 // this function returns. |
314 if (widget->DoInit(MSG_ROUTING_NONE, | 338 if (widget->DoInit(MSG_ROUTING_NONE, |
315 RenderWidget::CreateWebFrameWidget(widget.get(), frame), | 339 RenderWidget::CreateWebFrameWidget(widget.get(), frame), |
316 nullptr)) { | 340 nullptr, true)) { |
317 return widget.get(); | 341 return widget.get(); |
318 } | 342 } |
319 return nullptr; | 343 return nullptr; |
320 } | 344 } |
321 | 345 |
322 // static | 346 // static |
323 blink::WebFrameWidget* RenderWidget::CreateWebFrameWidget( | 347 blink::WebFrameWidget* RenderWidget::CreateWebFrameWidget( |
324 RenderWidget* render_widget, | 348 RenderWidget* render_widget, |
325 blink::WebLocalFrame* frame) { | 349 blink::WebLocalFrame* frame) { |
326 if (!frame->parent()) { | 350 if (!frame->parent()) { |
(...skipping 23 matching lines...) Expand all Loading... |
350 | 374 |
351 void RenderWidget::SetRoutingID(int32_t routing_id) { | 375 void RenderWidget::SetRoutingID(int32_t routing_id) { |
352 routing_id_ = routing_id; | 376 routing_id_ = routing_id; |
353 input_handler_.reset(new RenderWidgetInputHandler( | 377 input_handler_.reset(new RenderWidgetInputHandler( |
354 GetRenderWidgetInputHandlerDelegate(this), this)); | 378 GetRenderWidgetInputHandlerDelegate(this), this)); |
355 } | 379 } |
356 | 380 |
357 bool RenderWidget::Init(int32_t opener_id) { | 381 bool RenderWidget::Init(int32_t opener_id) { |
358 bool success = DoInit( | 382 bool success = DoInit( |
359 opener_id, RenderWidget::CreateWebWidget(this), | 383 opener_id, RenderWidget::CreateWebWidget(this), |
360 new ViewHostMsg_CreateWidget(opener_id, popup_type_, &routing_id_)); | 384 new ViewHostMsg_CreateWidget(opener_id, popup_type_, &routing_id_), true); |
361 if (success) { | 385 if (success) { |
362 SetRoutingID(routing_id_); | 386 SetRoutingID(routing_id_); |
363 return true; | 387 return true; |
364 } | 388 } |
365 return false; | 389 return false; |
366 } | 390 } |
367 | 391 |
368 bool RenderWidget::DoInit(int32_t opener_id, | 392 bool RenderWidget::DoInit(int32_t opener_id, |
369 WebWidget* web_widget, | 393 WebWidget* web_widget, |
370 IPC::SyncMessage* create_widget_message) { | 394 IPC::SyncMessage* create_widget_message, |
| 395 bool should_add_route) { |
371 DCHECK(!webwidget_); | 396 DCHECK(!webwidget_); |
372 | 397 |
373 if (opener_id != MSG_ROUTING_NONE) | 398 if (opener_id != MSG_ROUTING_NONE) |
374 opener_id_ = opener_id; | 399 opener_id_ = opener_id; |
375 | 400 |
376 webwidget_ = web_widget; | 401 webwidget_ = web_widget; |
| 402 webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_)); |
| 403 mouse_lock_dispatcher_ = |
| 404 base::WrapUnique(new RenderWidgetMouseLockDispatcher(this)); |
377 | 405 |
378 bool result = true; | 406 bool result = true; |
379 if (create_widget_message) | 407 if (create_widget_message) |
380 result = RenderThread::Get()->Send(create_widget_message); | 408 result = RenderThread::Get()->Send(create_widget_message); |
381 | 409 |
| 410 if (!should_add_route) |
| 411 return true; |
| 412 |
382 if (result) { | 413 if (result) { |
383 RenderThread::Get()->AddRoute(routing_id_, this); | 414 RenderThread::Get()->AddRoute(routing_id_, this); |
384 // Take a reference on behalf of the RenderThread. This will be balanced | 415 // Take a reference on behalf of the RenderThread. This will be balanced |
385 // when we receive ViewMsg_Close. | 416 // when we receive ViewMsg_Close. |
386 AddRef(); | 417 AddRef(); |
387 if (RenderThreadImpl::current()) { | 418 if (RenderThreadImpl::current()) { |
388 RenderThreadImpl::current()->WidgetCreated(); | 419 RenderThreadImpl::current()->WidgetCreated(); |
389 if (is_hidden_) | 420 if (is_hidden_) |
390 RenderThreadImpl::current()->WidgetHidden(); | 421 RenderThreadImpl::current()->WidgetHidden(); |
391 } | 422 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 emulator->scale(), emulator->offset()); | 474 emulator->scale(), emulator->offset()); |
444 } | 475 } |
445 #endif | 476 #endif |
446 | 477 |
447 void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { | 478 void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { |
448 if (screen_metrics_emulator_) | 479 if (screen_metrics_emulator_) |
449 screen_metrics_emulator_->OnShowContextMenu(params); | 480 screen_metrics_emulator_->OnShowContextMenu(params); |
450 } | 481 } |
451 | 482 |
452 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { | 483 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { |
| 484 if (mouse_lock_dispatcher_ && |
| 485 mouse_lock_dispatcher_->OnMessageReceived(message)) |
| 486 return true; |
| 487 |
453 bool handled = true; | 488 bool handled = true; |
454 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) | 489 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) |
455 IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) | 490 IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) |
456 IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, | 491 IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, |
457 OnCursorVisibilityChange) | 492 OnCursorVisibilityChange) |
458 IPC_MESSAGE_HANDLER(InputMsg_ImeSetComposition, OnImeSetComposition) | 493 IPC_MESSAGE_HANDLER(InputMsg_ImeSetComposition, OnImeSetComposition) |
459 IPC_MESSAGE_HANDLER(InputMsg_ImeConfirmComposition, OnImeConfirmComposition) | 494 IPC_MESSAGE_HANDLER(InputMsg_ImeConfirmComposition, OnImeConfirmComposition) |
460 IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) | 495 IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) |
461 IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetFocus) | 496 IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetFocus) |
462 IPC_MESSAGE_HANDLER(InputMsg_SyntheticGestureCompleted, | 497 IPC_MESSAGE_HANDLER(InputMsg_SyntheticGestureCompleted, |
(...skipping 1620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2083 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); | 2118 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); |
2084 } | 2119 } |
2085 | 2120 |
2086 float RenderWidget::GetOriginalDeviceScaleFactor() const { | 2121 float RenderWidget::GetOriginalDeviceScaleFactor() const { |
2087 return | 2122 return |
2088 screen_metrics_emulator_ ? | 2123 screen_metrics_emulator_ ? |
2089 screen_metrics_emulator_->original_screen_info().deviceScaleFactor : | 2124 screen_metrics_emulator_->original_screen_info().deviceScaleFactor : |
2090 device_scale_factor_; | 2125 device_scale_factor_; |
2091 } | 2126 } |
2092 | 2127 |
| 2128 bool RenderWidget::requestPointerLock() { |
| 2129 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get()); |
| 2130 } |
| 2131 |
| 2132 void RenderWidget::requestPointerUnlock() { |
| 2133 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get()); |
| 2134 } |
| 2135 |
| 2136 bool RenderWidget::isPointerLocked() { |
| 2137 return mouse_lock_dispatcher_->IsMouseLockedTo( |
| 2138 webwidget_mouse_lock_target_.get()); |
| 2139 } |
| 2140 |
2093 } // namespace content | 2141 } // namespace content |
OLD | NEW |