OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 maximum_zoom_level_(ZoomFactorToZoomLevel(kMaxTextSizeMultiplier)), | 343 maximum_zoom_level_(ZoomFactorToZoomLevel(kMaxTextSizeMultiplier)), |
344 zoom_factor_for_device_scale_factor_(0.f), | 344 zoom_factor_for_device_scale_factor_(0.f), |
345 maximum_legible_scale_(1), | 345 maximum_legible_scale_(1), |
346 double_tap_zoom_page_scale_factor_(0), | 346 double_tap_zoom_page_scale_factor_(0), |
347 double_tap_zoom_pending_(false), | 347 double_tap_zoom_pending_(false), |
348 enable_fake_page_scale_animation_for_testing_(false), | 348 enable_fake_page_scale_animation_for_testing_(false), |
349 fake_page_scale_animation_page_scale_factor_(0), | 349 fake_page_scale_animation_page_scale_factor_(0), |
350 fake_page_scale_animation_use_anchor_(false), | 350 fake_page_scale_animation_use_anchor_(false), |
351 compositor_device_scale_factor_override_(0), | 351 compositor_device_scale_factor_override_(0), |
352 suppress_next_keypress_event_(false), | 352 suppress_next_keypress_event_(false), |
353 ime_accept_events_(true), | |
354 dev_tools_emulator_(nullptr), | 353 dev_tools_emulator_(nullptr), |
355 tabs_to_links_(false), | 354 tabs_to_links_(false), |
356 layer_tree_view_(nullptr), | 355 layer_tree_view_(nullptr), |
357 root_layer_(nullptr), | 356 root_layer_(nullptr), |
358 root_graphics_layer_(nullptr), | 357 root_graphics_layer_(nullptr), |
359 visual_viewport_container_layer_(nullptr), | 358 visual_viewport_container_layer_(nullptr), |
360 matches_heuristics_for_gpu_rasterization_(false), | 359 matches_heuristics_for_gpu_rasterization_(false), |
361 fling_modifier_(0), | 360 fling_modifier_(0), |
362 fling_source_device_(kWebGestureDeviceUninitialized), | 361 fling_source_device_(kWebGestureDeviceUninitialized), |
363 fullscreen_controller_(FullscreenController::Create(this)), | 362 fullscreen_controller_(FullscreenController::Create(this)), |
(...skipping 1895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2259 page_->SetIsCursorVisible(is_visible); | 2258 page_->SetIsCursorVisible(is_visible); |
2260 } | 2259 } |
2261 | 2260 |
2262 void WebViewImpl::MouseCaptureLost() { | 2261 void WebViewImpl::MouseCaptureLost() { |
2263 TRACE_EVENT_ASYNC_END0("input", "capturing mouse", this); | 2262 TRACE_EVENT_ASYNC_END0("input", "capturing mouse", this); |
2264 mouse_capture_node_ = nullptr; | 2263 mouse_capture_node_ = nullptr; |
2265 } | 2264 } |
2266 | 2265 |
2267 void WebViewImpl::SetFocus(bool enable) { | 2266 void WebViewImpl::SetFocus(bool enable) { |
2268 page_->GetFocusController().SetFocused(enable); | 2267 page_->GetFocusController().SetFocused(enable); |
| 2268 LocalFrame* focused_frame = page_->GetFocusController().FocusedFrame(); |
2269 if (enable) { | 2269 if (enable) { |
2270 page_->GetFocusController().SetActive(true); | 2270 page_->GetFocusController().SetActive(true); |
2271 LocalFrame* focused_frame = page_->GetFocusController().FocusedFrame(); | |
2272 if (focused_frame) { | 2271 if (focused_frame) { |
2273 Element* element = focused_frame->GetDocument()->FocusedElement(); | 2272 Element* element = focused_frame->GetDocument()->FocusedElement(); |
2274 if (element && focused_frame->Selection() | 2273 if (element && focused_frame->Selection() |
2275 .ComputeVisibleSelectionInDOMTreeDeprecated() | 2274 .ComputeVisibleSelectionInDOMTreeDeprecated() |
2276 .IsNone()) { | 2275 .IsNone()) { |
2277 // If the selection was cleared while the WebView was not | 2276 // If the selection was cleared while the WebView was not |
2278 // focused, then the focus element shows with a focus ring but | 2277 // focused, then the focus element shows with a focus ring but |
2279 // no caret and does respond to keyboard inputs. | 2278 // no caret and does respond to keyboard inputs. |
2280 focused_frame->GetDocument()->UpdateStyleAndLayoutTree(); | 2279 focused_frame->GetDocument()->UpdateStyleAndLayoutTree(); |
2281 if (element->IsTextControl()) { | 2280 if (element->IsTextControl()) { |
2282 element->UpdateFocusAppearance(SelectionBehaviorOnFocus::kRestore); | 2281 element->UpdateFocusAppearance(SelectionBehaviorOnFocus::kRestore); |
2283 } else if (HasEditableStyle(*element)) { | 2282 } else if (HasEditableStyle(*element)) { |
2284 // updateFocusAppearance() selects all the text of | 2283 // updateFocusAppearance() selects all the text of |
2285 // contentseditable DIVs. So we set the selection explicitly | 2284 // contentseditable DIVs. So we set the selection explicitly |
2286 // instead. Note that this has the side effect of moving the | 2285 // instead. Note that this has the side effect of moving the |
2287 // caret back to the beginning of the text. | 2286 // caret back to the beginning of the text. |
2288 Position position(element, 0); | 2287 Position position(element, 0); |
2289 focused_frame->Selection().SetSelection( | 2288 focused_frame->Selection().SetSelection( |
2290 SelectionInDOMTree::Builder().Collapse(position).Build()); | 2289 SelectionInDOMTree::Builder().Collapse(position).Build()); |
2291 } | 2290 } |
2292 } | 2291 } |
| 2292 // TODO(ekaramad): We need to figure out the right way to propagate page |
| 2293 // focus to OOPIFs. Right now WebFrameWidgetImpl::SetFocus never gets |
| 2294 // called (https://crbug.com/689777). |
| 2295 WebLocalFrameBase::FromFrame(focused_frame->LocalFrameRoot()) |
| 2296 ->FrameWidget() |
| 2297 ->ime_accept_events_ = true; |
2293 } | 2298 } |
2294 ime_accept_events_ = true; | |
2295 } else { | 2299 } else { |
2296 HidePopups(); | 2300 HidePopups(); |
2297 | 2301 |
2298 // Clear focus on the currently focused frame if any. | 2302 // Clear focus on the currently focused frame if any. |
2299 if (!page_) | 2303 if (!page_ || !focused_frame) |
2300 return; | 2304 return; |
2301 | 2305 |
2302 LocalFrame* frame = page_->MainFrame() && page_->MainFrame()->IsLocalFrame() | 2306 // Finish an ongoing composition to delete the composition node. |
2303 ? page_->DeprecatedLocalMainFrame() | 2307 if (focused_frame->GetInputMethodController().HasComposition()) { |
2304 : nullptr; | 2308 // TODO(editing-dev): The use of |
2305 if (!frame) | 2309 // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited. |
2306 return; | 2310 // See http://crbug.com/590369 for more details. |
| 2311 focused_frame->GetDocument() |
| 2312 ->UpdateStyleAndLayoutIgnorePendingStylesheets(); |
2307 | 2313 |
2308 LocalFrame* focused_frame = FocusedLocalFrameInWidget(); | 2314 focused_frame->GetInputMethodController().FinishComposingText( |
2309 if (focused_frame) { | 2315 InputMethodController::kKeepSelection); |
2310 // Finish an ongoing composition to delete the composition node. | |
2311 if (focused_frame->GetInputMethodController().HasComposition()) { | |
2312 // TODO(editing-dev): The use of | |
2313 // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited. | |
2314 // See http://crbug.com/590369 for more details. | |
2315 focused_frame->GetDocument() | |
2316 ->UpdateStyleAndLayoutIgnorePendingStylesheets(); | |
2317 | |
2318 focused_frame->GetInputMethodController().FinishComposingText( | |
2319 InputMethodController::kKeepSelection); | |
2320 } | 2316 } |
2321 ime_accept_events_ = false; | 2317 // TODO(ekaramad): We need to figure out the right way to propagate page |
2322 } | 2318 // focus to OOPIFs. Right now WebFrameWidgetImpl::SetFocus never gets |
| 2319 // called (https://crbug.com/689777). |
| 2320 WebLocalFrameBase::FromFrame(focused_frame->LocalFrameRoot()) |
| 2321 ->FrameWidget() |
| 2322 ->ime_accept_events_ = false; |
2323 } | 2323 } |
2324 } | 2324 } |
2325 | 2325 |
2326 // TODO(ekaramad):This method is almost duplicated in WebFrameWidgetImpl as | 2326 // TODO(ekaramad):This method is almost duplicated in WebFrameWidgetImpl as |
2327 // well. This code needs to be refactored (http://crbug.com/629721). | 2327 // well. This code needs to be refactored (http://crbug.com/629721). |
2328 WebRange WebViewImpl::CompositionRange() { | 2328 WebRange WebViewImpl::CompositionRange() { |
2329 LocalFrame* focused = FocusedLocalFrameAvailableForIme(); | 2329 if (!MainFrameImpl() || !MainFrameImpl()->FrameWidget()->ime_accept_events_) |
| 2330 return WebRange(); |
| 2331 |
| 2332 LocalFrame* focused = FocusedLocalFrameInWidget(); |
2330 if (!focused) | 2333 if (!focused) |
2331 return WebRange(); | 2334 return WebRange(); |
2332 | 2335 |
2333 const EphemeralRange range = | 2336 const EphemeralRange range = |
2334 focused->GetInputMethodController().CompositionEphemeralRange(); | 2337 focused->GetInputMethodController().CompositionEphemeralRange(); |
2335 if (range.IsNull()) | 2338 if (range.IsNull()) |
2336 return WebRange(); | 2339 return WebRange(); |
2337 | 2340 |
2338 Element* editable = | 2341 Element* editable = |
2339 focused->Selection().RootEditableElementOrDocumentElement(); | 2342 focused->Selection().RootEditableElementOrDocumentElement(); |
(...skipping 1766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4106 // TODO(oshima): Investigate if this should return the ScreenInfo's scale | 4109 // TODO(oshima): Investigate if this should return the ScreenInfo's scale |
4107 // factor rather than page's scale factor, which can be 1 in use-zoom-for-dsf | 4110 // factor rather than page's scale factor, which can be 1 in use-zoom-for-dsf |
4108 // mode. | 4111 // mode. |
4109 if (!GetPage()) | 4112 if (!GetPage()) |
4110 return 1; | 4113 return 1; |
4111 | 4114 |
4112 return GetPage()->DeviceScaleFactorDeprecated(); | 4115 return GetPage()->DeviceScaleFactorDeprecated(); |
4113 } | 4116 } |
4114 | 4117 |
4115 LocalFrame* WebViewImpl::FocusedLocalFrameInWidget() const { | 4118 LocalFrame* WebViewImpl::FocusedLocalFrameInWidget() const { |
4116 if (!MainFrameImpl()) | 4119 if (auto* frame = MainFrameImpl()) |
4117 return nullptr; | 4120 return frame->FrameWidget()->FocusedLocalFrame(); |
4118 | 4121 return nullptr; |
4119 LocalFrame* focused_frame = ToLocalFrame(FocusedCoreFrame()); | |
4120 if (focused_frame->LocalFrameRoot() != MainFrameImpl()->GetFrame()) | |
4121 return nullptr; | |
4122 return focused_frame; | |
4123 } | |
4124 | |
4125 LocalFrame* WebViewImpl::FocusedLocalFrameAvailableForIme() const { | |
4126 return ime_accept_events_ ? FocusedLocalFrameInWidget() : nullptr; | |
4127 } | 4122 } |
4128 | 4123 |
4129 } // namespace blink | 4124 } // namespace blink |
OLD | NEW |