Chromium Code Reviews| 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 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 using blink::WebWidget; | 132 using blink::WebWidget; |
| 133 | 133 |
| 134 #define STATIC_ASSERT_ENUM(a, b) \ | 134 #define STATIC_ASSERT_ENUM(a, b) \ |
| 135 static_assert(static_cast<int>(a) == static_cast<int>(b), \ | 135 static_assert(static_cast<int>(a) == static_cast<int>(b), \ |
| 136 "mismatching enums: " #a) | 136 "mismatching enums: " #a) |
| 137 | 137 |
| 138 namespace { | 138 namespace { |
| 139 | 139 |
| 140 typedef std::map<std::string, ui::TextInputMode> TextInputModeMap; | 140 typedef std::map<std::string, ui::TextInputMode> TextInputModeMap; |
| 141 | 141 |
| 142 class WebWidgetLockTarget : public content::MouseLockDispatcher::LockTarget { | |
| 143 public: | |
| 144 explicit WebWidgetLockTarget(blink::WebWidget* webwidget) | |
| 145 : webwidget_(webwidget) {} | |
| 146 | |
| 147 void OnLockMouseACK(bool succeeded) override { | |
| 148 if (succeeded) | |
| 149 webwidget_->didAcquirePointerLock(); | |
| 150 else | |
| 151 webwidget_->didNotAcquirePointerLock(); | |
| 152 } | |
| 153 | |
| 154 void OnMouseLockLost() override { webwidget_->didLosePointerLock(); } | |
| 155 | |
| 156 bool HandleMouseLockedInputEvent(const blink::WebMouseEvent& event) override { | |
| 157 // The WebWidget handles mouse lock in Blink's handleInputEvent(). | |
| 158 return false; | |
| 159 } | |
| 160 | |
| 161 private: | |
| 162 blink::WebWidget* webwidget_; | |
| 163 }; | |
| 164 | |
| 142 class TextInputModeMapSingleton { | 165 class TextInputModeMapSingleton { |
| 143 public: | 166 public: |
| 144 static TextInputModeMapSingleton* GetInstance() { | 167 static TextInputModeMapSingleton* GetInstance() { |
| 145 return base::Singleton<TextInputModeMapSingleton>::get(); | 168 return base::Singleton<TextInputModeMapSingleton>::get(); |
| 146 } | 169 } |
| 147 TextInputModeMapSingleton() { | 170 TextInputModeMapSingleton() { |
| 148 map_["verbatim"] = ui::TEXT_INPUT_MODE_VERBATIM; | 171 map_["verbatim"] = ui::TEXT_INPUT_MODE_VERBATIM; |
| 149 map_["latin"] = ui::TEXT_INPUT_MODE_LATIN; | 172 map_["latin"] = ui::TEXT_INPUT_MODE_LATIN; |
| 150 map_["latin-name"] = ui::TEXT_INPUT_MODE_LATIN_NAME; | 173 map_["latin-name"] = ui::TEXT_INPUT_MODE_LATIN_NAME; |
| 151 map_["latin-prose"] = ui::TEXT_INPUT_MODE_LATIN_PROSE; | 174 map_["latin-prose"] = ui::TEXT_INPUT_MODE_LATIN_PROSE; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 305 } | 328 } |
| 306 scoped_refptr<RenderWidget> widget( | 329 scoped_refptr<RenderWidget> widget( |
| 307 new RenderWidget(compositor_deps, blink::WebPopupTypeNone, screen_info, | 330 new RenderWidget(compositor_deps, blink::WebPopupTypeNone, screen_info, |
| 308 false, hidden, false)); | 331 false, hidden, false)); |
| 309 widget->SetRoutingID(routing_id); | 332 widget->SetRoutingID(routing_id); |
| 310 widget->for_oopif_ = true; | 333 widget->for_oopif_ = true; |
| 311 // DoInit increments the reference count on |widget|, keeping it alive after | 334 // DoInit increments the reference count on |widget|, keeping it alive after |
| 312 // this function returns. | 335 // this function returns. |
| 313 if (widget->DoInit(MSG_ROUTING_NONE, | 336 if (widget->DoInit(MSG_ROUTING_NONE, |
| 314 RenderWidget::CreateWebFrameWidget(widget.get(), frame), | 337 RenderWidget::CreateWebFrameWidget(widget.get(), frame), |
| 315 nullptr)) { | 338 nullptr, true)) { |
| 316 return widget.get(); | 339 return widget.get(); |
| 317 } | 340 } |
| 318 return nullptr; | 341 return nullptr; |
| 319 } | 342 } |
| 320 | 343 |
| 321 // static | 344 // static |
| 322 blink::WebFrameWidget* RenderWidget::CreateWebFrameWidget( | 345 blink::WebFrameWidget* RenderWidget::CreateWebFrameWidget( |
| 323 RenderWidget* render_widget, | 346 RenderWidget* render_widget, |
| 324 blink::WebLocalFrame* frame) { | 347 blink::WebLocalFrame* frame) { |
| 325 if (!frame->parent()) { | 348 if (!frame->parent()) { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 349 | 372 |
| 350 void RenderWidget::SetRoutingID(int32_t routing_id) { | 373 void RenderWidget::SetRoutingID(int32_t routing_id) { |
| 351 routing_id_ = routing_id; | 374 routing_id_ = routing_id; |
| 352 input_handler_.reset(new RenderWidgetInputHandler( | 375 input_handler_.reset(new RenderWidgetInputHandler( |
| 353 GetRenderWidgetInputHandlerDelegate(this), this)); | 376 GetRenderWidgetInputHandlerDelegate(this), this)); |
| 354 } | 377 } |
| 355 | 378 |
| 356 bool RenderWidget::Init(int32_t opener_id) { | 379 bool RenderWidget::Init(int32_t opener_id) { |
| 357 bool success = DoInit( | 380 bool success = DoInit( |
| 358 opener_id, RenderWidget::CreateWebWidget(this), | 381 opener_id, RenderWidget::CreateWebWidget(this), |
| 359 new ViewHostMsg_CreateWidget(opener_id, popup_type_, &routing_id_)); | 382 new ViewHostMsg_CreateWidget(opener_id, popup_type_, &routing_id_), true); |
| 360 if (success) { | 383 if (success) { |
| 361 SetRoutingID(routing_id_); | 384 SetRoutingID(routing_id_); |
| 362 return true; | 385 return true; |
| 363 } | 386 } |
| 364 return false; | 387 return false; |
| 365 } | 388 } |
| 366 | 389 |
| 367 bool RenderWidget::DoInit(int32_t opener_id, | 390 bool RenderWidget::DoInit(int32_t opener_id, |
| 368 WebWidget* web_widget, | 391 WebWidget* web_widget, |
| 369 IPC::SyncMessage* create_widget_message) { | 392 IPC::SyncMessage* create_widget_message, |
| 393 bool should_add_route) { | |
|
dcheng
2016/06/04 05:28:56
Can we just make RenderView::Initialize() not add
lfg
2016/06/06 20:09:43
Done.
| |
| 370 DCHECK(!webwidget_); | 394 DCHECK(!webwidget_); |
| 371 | 395 |
| 372 if (opener_id != MSG_ROUTING_NONE) | 396 if (opener_id != MSG_ROUTING_NONE) |
| 373 opener_id_ = opener_id; | 397 opener_id_ = opener_id; |
| 374 | 398 |
| 375 webwidget_ = web_widget; | 399 webwidget_ = web_widget; |
| 400 webwidget_mouse_lock_target_.reset(new WebWidgetLockTarget(webwidget_)); | |
| 401 mouse_lock_dispatcher_ = | |
| 402 base::WrapUnique(new RenderWidgetMouseLockDispatcher(this)); | |
|
dcheng
2016/06/04 05:28:56
Nit: base::MakeUnique, or be consistent with line
lfg
2016/06/06 20:09:43
Done.
| |
| 376 | 403 |
| 377 bool result = true; | 404 bool result = true; |
| 378 if (create_widget_message) | 405 if (create_widget_message) |
| 379 result = RenderThread::Get()->Send(create_widget_message); | 406 result = RenderThread::Get()->Send(create_widget_message); |
| 380 | 407 |
| 408 if (!should_add_route) | |
| 409 return true; | |
| 410 | |
| 381 if (result) { | 411 if (result) { |
| 382 RenderThread::Get()->AddRoute(routing_id_, this); | 412 RenderThread::Get()->AddRoute(routing_id_, this); |
| 383 // Take a reference on behalf of the RenderThread. This will be balanced | 413 // Take a reference on behalf of the RenderThread. This will be balanced |
| 384 // when we receive ViewMsg_Close. | 414 // when we receive ViewMsg_Close. |
| 385 AddRef(); | 415 AddRef(); |
| 386 if (RenderThreadImpl::current()) { | 416 if (RenderThreadImpl::current()) { |
| 387 RenderThreadImpl::current()->WidgetCreated(); | 417 RenderThreadImpl::current()->WidgetCreated(); |
| 388 if (is_hidden_) | 418 if (is_hidden_) |
| 389 RenderThreadImpl::current()->WidgetHidden(); | 419 RenderThreadImpl::current()->WidgetHidden(); |
| 390 } | 420 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 442 emulator->scale(), emulator->offset()); | 472 emulator->scale(), emulator->offset()); |
| 443 } | 473 } |
| 444 #endif | 474 #endif |
| 445 | 475 |
| 446 void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { | 476 void RenderWidget::OnShowHostContextMenu(ContextMenuParams* params) { |
| 447 if (screen_metrics_emulator_) | 477 if (screen_metrics_emulator_) |
| 448 screen_metrics_emulator_->OnShowContextMenu(params); | 478 screen_metrics_emulator_->OnShowContextMenu(params); |
| 449 } | 479 } |
| 450 | 480 |
| 451 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { | 481 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { |
| 482 if (mouse_lock_dispatcher_ && | |
| 483 mouse_lock_dispatcher_->OnMessageReceived(message)) | |
| 484 return true; | |
| 485 | |
| 452 bool handled = true; | 486 bool handled = true; |
| 453 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) | 487 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) |
| 454 IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) | 488 IPC_MESSAGE_HANDLER(InputMsg_HandleInputEvent, OnHandleInputEvent) |
| 455 IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, | 489 IPC_MESSAGE_HANDLER(InputMsg_CursorVisibilityChange, |
| 456 OnCursorVisibilityChange) | 490 OnCursorVisibilityChange) |
| 457 IPC_MESSAGE_HANDLER(InputMsg_ImeSetComposition, OnImeSetComposition) | 491 IPC_MESSAGE_HANDLER(InputMsg_ImeSetComposition, OnImeSetComposition) |
| 458 IPC_MESSAGE_HANDLER(InputMsg_ImeConfirmComposition, OnImeConfirmComposition) | 492 IPC_MESSAGE_HANDLER(InputMsg_ImeConfirmComposition, OnImeConfirmComposition) |
| 459 IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) | 493 IPC_MESSAGE_HANDLER(InputMsg_MouseCaptureLost, OnMouseCaptureLost) |
| 460 IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetFocus) | 494 IPC_MESSAGE_HANDLER(InputMsg_SetFocus, OnSetFocus) |
| 461 IPC_MESSAGE_HANDLER(InputMsg_SyntheticGestureCompleted, | 495 IPC_MESSAGE_HANDLER(InputMsg_SyntheticGestureCompleted, |
| (...skipping 1627 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2089 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); | 2123 MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE); |
| 2090 } | 2124 } |
| 2091 | 2125 |
| 2092 float RenderWidget::GetOriginalDeviceScaleFactor() const { | 2126 float RenderWidget::GetOriginalDeviceScaleFactor() const { |
| 2093 return | 2127 return |
| 2094 screen_metrics_emulator_ ? | 2128 screen_metrics_emulator_ ? |
| 2095 screen_metrics_emulator_->original_screen_info().deviceScaleFactor : | 2129 screen_metrics_emulator_->original_screen_info().deviceScaleFactor : |
| 2096 device_scale_factor_; | 2130 device_scale_factor_; |
| 2097 } | 2131 } |
| 2098 | 2132 |
| 2133 bool RenderWidget::requestPointerLock() { | |
| 2134 return mouse_lock_dispatcher_->LockMouse(webwidget_mouse_lock_target_.get()); | |
| 2135 } | |
| 2136 | |
| 2137 void RenderWidget::requestPointerUnlock() { | |
| 2138 mouse_lock_dispatcher_->UnlockMouse(webwidget_mouse_lock_target_.get()); | |
| 2139 } | |
| 2140 | |
| 2141 bool RenderWidget::isPointerLocked() { | |
| 2142 return mouse_lock_dispatcher_->IsMouseLockedTo( | |
| 2143 webwidget_mouse_lock_target_.get()); | |
| 2144 } | |
| 2145 | |
| 2099 } // namespace content | 2146 } // namespace content |
| OLD | NEW |