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

Side by Side Diff: third_party/WebKit/Source/web/WebViewImpl.cpp

Issue 2910233002: Do not fallback to FocusedOrMainFrame() in FocusedLocalFrameInWidget() (Closed)
Patch Set: Addressing dcheng@'s comments Created 3 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 /* 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 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 maximum_zoom_level_(ZoomFactorToZoomLevel(kMaxTextSizeMultiplier)), 349 maximum_zoom_level_(ZoomFactorToZoomLevel(kMaxTextSizeMultiplier)),
350 zoom_factor_for_device_scale_factor_(0.f), 350 zoom_factor_for_device_scale_factor_(0.f),
351 maximum_legible_scale_(1), 351 maximum_legible_scale_(1),
352 double_tap_zoom_page_scale_factor_(0), 352 double_tap_zoom_page_scale_factor_(0),
353 double_tap_zoom_pending_(false), 353 double_tap_zoom_pending_(false),
354 enable_fake_page_scale_animation_for_testing_(false), 354 enable_fake_page_scale_animation_for_testing_(false),
355 fake_page_scale_animation_page_scale_factor_(0), 355 fake_page_scale_animation_page_scale_factor_(0),
356 fake_page_scale_animation_use_anchor_(false), 356 fake_page_scale_animation_use_anchor_(false),
357 compositor_device_scale_factor_override_(0), 357 compositor_device_scale_factor_override_(0),
358 suppress_next_keypress_event_(false), 358 suppress_next_keypress_event_(false),
359 ime_accept_events_(true),
360 dev_tools_emulator_(nullptr), 359 dev_tools_emulator_(nullptr),
361 tabs_to_links_(false), 360 tabs_to_links_(false),
362 layer_tree_view_(nullptr), 361 layer_tree_view_(nullptr),
363 root_layer_(nullptr), 362 root_layer_(nullptr),
364 root_graphics_layer_(nullptr), 363 root_graphics_layer_(nullptr),
365 visual_viewport_container_layer_(nullptr), 364 visual_viewport_container_layer_(nullptr),
366 matches_heuristics_for_gpu_rasterization_(false), 365 matches_heuristics_for_gpu_rasterization_(false),
367 fling_modifier_(0), 366 fling_modifier_(0),
368 fling_source_device_(kWebGestureDeviceUninitialized), 367 fling_source_device_(kWebGestureDeviceUninitialized),
369 fullscreen_controller_(FullscreenController::Create(this)), 368 fullscreen_controller_(FullscreenController::Create(this)),
(...skipping 1912 matching lines...) Expand 10 before | Expand all | Expand 10 after
2282 page_->SetIsCursorVisible(is_visible); 2281 page_->SetIsCursorVisible(is_visible);
2283 } 2282 }
2284 2283
2285 void WebViewImpl::MouseCaptureLost() { 2284 void WebViewImpl::MouseCaptureLost() {
2286 TRACE_EVENT_ASYNC_END0("input", "capturing mouse", this); 2285 TRACE_EVENT_ASYNC_END0("input", "capturing mouse", this);
2287 mouse_capture_node_ = nullptr; 2286 mouse_capture_node_ = nullptr;
2288 } 2287 }
2289 2288
2290 void WebViewImpl::SetFocus(bool enable) { 2289 void WebViewImpl::SetFocus(bool enable) {
2291 page_->GetFocusController().SetFocused(enable); 2290 page_->GetFocusController().SetFocused(enable);
2291 LocalFrame* focused_frame = page_->GetFocusController().FocusedFrame();
2292 if (enable) { 2292 if (enable) {
2293 page_->GetFocusController().SetActive(true); 2293 page_->GetFocusController().SetActive(true);
2294 LocalFrame* focused_frame = page_->GetFocusController().FocusedFrame();
2295 if (focused_frame) { 2294 if (focused_frame) {
2296 Element* element = focused_frame->GetDocument()->FocusedElement(); 2295 Element* element = focused_frame->GetDocument()->FocusedElement();
2297 if (element && focused_frame->Selection() 2296 if (element && focused_frame->Selection()
2298 .ComputeVisibleSelectionInDOMTreeDeprecated() 2297 .ComputeVisibleSelectionInDOMTreeDeprecated()
2299 .IsNone()) { 2298 .IsNone()) {
2300 // If the selection was cleared while the WebView was not 2299 // If the selection was cleared while the WebView was not
2301 // focused, then the focus element shows with a focus ring but 2300 // focused, then the focus element shows with a focus ring but
2302 // no caret and does respond to keyboard inputs. 2301 // no caret and does respond to keyboard inputs.
2303 focused_frame->GetDocument()->UpdateStyleAndLayoutTree(); 2302 focused_frame->GetDocument()->UpdateStyleAndLayoutTree();
2304 if (element->IsTextControl()) { 2303 if (element->IsTextControl()) {
2305 element->UpdateFocusAppearance(SelectionBehaviorOnFocus::kRestore); 2304 element->UpdateFocusAppearance(SelectionBehaviorOnFocus::kRestore);
2306 } else if (HasEditableStyle(*element)) { 2305 } else if (HasEditableStyle(*element)) {
2307 // updateFocusAppearance() selects all the text of 2306 // updateFocusAppearance() selects all the text of
2308 // contentseditable DIVs. So we set the selection explicitly 2307 // contentseditable DIVs. So we set the selection explicitly
2309 // instead. Note that this has the side effect of moving the 2308 // instead. Note that this has the side effect of moving the
2310 // caret back to the beginning of the text. 2309 // caret back to the beginning of the text.
2311 Position position(element, 0); 2310 Position position(element, 0);
2312 focused_frame->Selection().SetSelection( 2311 focused_frame->Selection().SetSelection(
2313 SelectionInDOMTree::Builder().Collapse(position).Build()); 2312 SelectionInDOMTree::Builder().Collapse(position).Build());
2314 } 2313 }
2315 } 2314 }
2315 // TODO(ekaramad): We need to figure out the right way to propagate page
2316 // focus to OOPIFs. Right now WebFrameWidgetImpl::SetFocus never gets
2317 // called (https://crbug.com/689777).
2318 WebLocalFrameBase::FromFrame(focused_frame->LocalFrameRoot())
2319 ->FrameWidget()
2320 ->ime_accept_events_ = true;
alexmos 2017/06/15 02:53:06 Ugh, really hope we can clean this up soon. I agr
EhsanK 2017/06/16 19:25:14 Agreed. I have been meaning to get started on this
alexmos 2017/06/17 01:06:43 Sounds good. The other concern I remember with th
2316 } 2321 }
2317 ime_accept_events_ = true;
2318 } else { 2322 } else {
2319 HidePopups(); 2323 HidePopups();
2320 2324
2321 // Clear focus on the currently focused frame if any. 2325 // Clear focus on the currently focused frame if any.
2322 if (!page_) 2326 if (!page_ || !focused_frame)
2323 return; 2327 return;
2324 2328
2325 LocalFrame* frame = page_->MainFrame() && page_->MainFrame()->IsLocalFrame() 2329 // Finish an ongoing composition to delete the composition node.
2326 ? page_->DeprecatedLocalMainFrame() 2330 if (focused_frame->GetInputMethodController().HasComposition()) {
2327 : nullptr; 2331 // TODO(editing-dev): The use of
2328 if (!frame) 2332 // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited.
2329 return; 2333 // See http://crbug.com/590369 for more details.
2334 focused_frame->GetDocument()
2335 ->UpdateStyleAndLayoutIgnorePendingStylesheets();
2330 2336
2331 LocalFrame* focused_frame = FocusedLocalFrameInWidget(); 2337 focused_frame->GetInputMethodController().FinishComposingText(
2332 if (focused_frame) { 2338 InputMethodController::kKeepSelection);
2333 // Finish an ongoing composition to delete the composition node.
2334 if (focused_frame->GetInputMethodController().HasComposition()) {
2335 // TODO(editing-dev): The use of
2336 // updateStyleAndLayoutIgnorePendingStylesheets needs to be audited.
2337 // See http://crbug.com/590369 for more details.
2338 focused_frame->GetDocument()
2339 ->UpdateStyleAndLayoutIgnorePendingStylesheets();
2340
2341 focused_frame->GetInputMethodController().FinishComposingText(
2342 InputMethodController::kKeepSelection);
2343 } 2339 }
2344 ime_accept_events_ = false; 2340 // TODO(ekaramad): We need to figure out the right way to propagate page
2345 } 2341 // focus to OOPIFs. Right now WebFrameWidgetImpl::SetFocus never gets
2342 // called (https://crbug.com/689777).
2343 WebLocalFrameBase::FromFrame(focused_frame->LocalFrameRoot())
2344 ->FrameWidget()
2345 ->ime_accept_events_ = false;
2346 } 2346 }
2347 } 2347 }
2348 2348
2349 // TODO(ekaramad):This method is almost duplicated in WebFrameWidgetImpl as 2349 // TODO(ekaramad):This method is almost duplicated in WebFrameWidgetImpl as
2350 // well. This code needs to be refactored (http://crbug.com/629721). 2350 // well. This code needs to be refactored (http://crbug.com/629721).
2351 WebRange WebViewImpl::CompositionRange() { 2351 WebRange WebViewImpl::CompositionRange() {
2352 LocalFrame* focused = FocusedLocalFrameAvailableForIme(); 2352 if (!MainFrameImpl() || !MainFrameImpl()->FrameWidget()->ime_accept_events_)
2353 return WebRange();
2354
2355 LocalFrame* focused = FocusedLocalFrameInWidget();
2353 if (!focused) 2356 if (!focused)
2354 return WebRange(); 2357 return WebRange();
2355 2358
2356 const EphemeralRange range = 2359 const EphemeralRange range =
2357 focused->GetInputMethodController().CompositionEphemeralRange(); 2360 focused->GetInputMethodController().CompositionEphemeralRange();
2358 if (range.IsNull()) 2361 if (range.IsNull())
2359 return WebRange(); 2362 return WebRange();
2360 2363
2361 Element* editable = 2364 Element* editable =
2362 focused->Selection().RootEditableElementOrDocumentElement(); 2365 focused->Selection().RootEditableElementOrDocumentElement();
(...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after
4134 // TODO(oshima): Investigate if this should return the ScreenInfo's scale 4137 // TODO(oshima): Investigate if this should return the ScreenInfo's scale
4135 // factor rather than page's scale factor, which can be 1 in use-zoom-for-dsf 4138 // factor rather than page's scale factor, which can be 1 in use-zoom-for-dsf
4136 // mode. 4139 // mode.
4137 if (!GetPage()) 4140 if (!GetPage())
4138 return 1; 4141 return 1;
4139 4142
4140 return GetPage()->DeviceScaleFactorDeprecated(); 4143 return GetPage()->DeviceScaleFactorDeprecated();
4141 } 4144 }
4142 4145
4143 LocalFrame* WebViewImpl::FocusedLocalFrameInWidget() const { 4146 LocalFrame* WebViewImpl::FocusedLocalFrameInWidget() const {
4144 if (!MainFrameImpl()) 4147 if (auto* frame = MainFrameImpl())
4145 return nullptr; 4148 return frame->FrameWidget()->FocusedLocalFrame();
4146 4149 return nullptr;
4147 LocalFrame* focused_frame = ToLocalFrame(FocusedCoreFrame());
4148 if (focused_frame->LocalFrameRoot() != MainFrameImpl()->GetFrame())
4149 return nullptr;
4150 return focused_frame;
4151 }
4152
4153 LocalFrame* WebViewImpl::FocusedLocalFrameAvailableForIme() const {
4154 return ime_accept_events_ ? FocusedLocalFrameInWidget() : nullptr;
4155 } 4150 }
4156 4151
4157 } // namespace blink 4152 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/web/WebViewImpl.h ('k') | third_party/WebKit/Source/web/tests/WebViewTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698