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

Side by Side Diff: third_party/WebKit/Source/core/editing/InputMethodController.cpp

Issue 2316053002: Audit the use of updateStyleAndLayoutIgnorePendingStylesheets in InputMethodController::setSelectio… (Closed)
Patch Set: Unfold and remove SelectionOffsetsScope Created 4 years, 3 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) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2011 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 frame.eventHandler().handleTextInputEvent(text, 0, TextEventInputComposi tion); 111 frame.eventHandler().handleTextInputEvent(text, 0, TextEventInputComposi tion);
112 break; 112 break;
113 default: 113 default:
114 NOTREACHED(); 114 NOTREACHED();
115 } 115 }
116 // TODO(chongz): Fire 'input' event. 116 // TODO(chongz): Fire 'input' event.
117 } 117 }
118 118
119 } // anonymous namespace 119 } // anonymous namespace
120 120
121 InputMethodController::SelectionOffsetsScope::SelectionOffsetsScope(InputMethodC ontroller* inputMethodController)
122 : m_inputMethodController(inputMethodController)
123 , m_offsets(inputMethodController->getSelectionOffsets())
124 {
125 }
126
127 InputMethodController::SelectionOffsetsScope::~SelectionOffsetsScope()
128 {
129 m_inputMethodController->setSelectionOffsets(m_offsets);
130 }
131
132 // ----------------------------
133
134 InputMethodController* InputMethodController::create(LocalFrame& frame) 121 InputMethodController* InputMethodController::create(LocalFrame& frame)
135 { 122 {
136 return new InputMethodController(frame); 123 return new InputMethodController(frame);
137 } 124 }
138 125
139 InputMethodController::InputMethodController(LocalFrame& frame) 126 InputMethodController::InputMethodController(LocalFrame& frame)
140 : m_frame(&frame) 127 : m_frame(&frame)
141 , m_isDirty(false) 128 , m_isDirty(false)
142 , m_hasComposition(false) 129 , m_hasComposition(false)
143 { 130 {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 } 234 }
248 235
249 if (text.length()) { 236 if (text.length()) {
250 confirmComposition(text); 237 confirmComposition(text);
251 return true; 238 return true;
252 } 239 }
253 240
254 if (confirmBehavior == DoNotKeepSelection) 241 if (confirmBehavior == DoNotKeepSelection)
255 return confirmComposition(composingText(), DoNotKeepSelection); 242 return confirmComposition(composingText(), DoNotKeepSelection);
256 243
257 SelectionOffsetsScope selectionOffsetsScope(this); 244 PlainTextRange oldOffsets = getSelectionOffsets();
258 return confirmComposition(); 245 bool result = confirmComposition();
246
247 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
248 // needs to be audited. see http://crbug.com/590369 for more details.
249 frame().document()->updateStyleAndLayoutIgnorePendingStylesheets();
250
251 setSelectionOffsets(oldOffsets);
252 return result;
259 } 253 }
260 254
261 void InputMethodController::cancelComposition() 255 void InputMethodController::cancelComposition()
262 { 256 {
263 if (!hasComposition()) 257 if (!hasComposition())
264 return; 258 return;
265 259
266 Editor::RevealSelectionScope revealSelectionScope(&editor()); 260 Editor::RevealSelectionScope revealSelectionScope(&editor());
267 261
268 if (frame().selection().isNone()) 262 if (frame().selection().isNone())
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 // !hasComposition() && test.isEmpty(). 341 // !hasComposition() && test.isEmpty().
348 if (text.isEmpty()) { 342 if (text.isEmpty()) {
349 if (hasComposition()) { 343 if (hasComposition()) {
350 confirmComposition(emptyString()); 344 confirmComposition(emptyString());
351 } else { 345 } else {
352 // It's weird to call |setComposition()| with empty text outside com position, however some IME 346 // It's weird to call |setComposition()| with empty text outside com position, however some IME
353 // (e.g. Japanese IBus-Anthy) did this, so we simply delete selectio n without sending extra events. 347 // (e.g. Japanese IBus-Anthy) did this, so we simply delete selectio n without sending extra events.
354 TypingCommand::deleteSelection(*frame().document(), TypingCommand::P reventSpellChecking); 348 TypingCommand::deleteSelection(*frame().document(), TypingCommand::P reventSpellChecking);
355 } 349 }
356 350
351 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesh eets
352 // needs to be audited. see http://crbug.com/590369 for more details.
353 frame().document()->updateStyleAndLayoutIgnorePendingStylesheets();
354
357 setEditableSelectionOffsets(selectedRange); 355 setEditableSelectionOffsets(selectedRange);
358 return; 356 return;
359 } 357 }
360 358
361 // We should send a 'compositionstart' event only when the given text is not empty because this 359 // We should send a 'compositionstart' event only when the given text is not empty because this
362 // function doesn't create a composition node when the text is empty. 360 // function doesn't create a composition node when the text is empty.
363 if (!hasComposition()) { 361 if (!hasComposition()) {
364 target->dispatchEvent(CompositionEvent::create(EventTypeNames::compositi onstart, frame().domWindow(), frame().selectedText())); 362 target->dispatchEvent(CompositionEvent::create(EventTypeNames::compositi onstart, frame().domWindow(), frame().selectedText()));
365 if (!frame().document()) 363 if (!frame().document())
366 return; 364 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 m_isDirty = true; 396 m_isDirty = true;
399 m_hasComposition = true; 397 m_hasComposition = true;
400 if (!m_compositionRange) 398 if (!m_compositionRange)
401 m_compositionRange = Range::create(baseNode->document()); 399 m_compositionRange = Range::create(baseNode->document());
402 m_compositionRange->setStart(baseNode, baseOffset); 400 m_compositionRange->setStart(baseNode, baseOffset);
403 m_compositionRange->setEnd(baseNode, extentOffset); 401 m_compositionRange->setEnd(baseNode, extentOffset);
404 402
405 if (baseNode->layoutObject()) 403 if (baseNode->layoutObject())
406 baseNode->layoutObject()->setShouldDoFullPaintInvalidation(); 404 baseNode->layoutObject()->setShouldDoFullPaintInvalidation();
407 405
406 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets
407 // needs to be audited. see http://crbug.com/590369 for more details.
408 frame().document()->updateStyleAndLayoutIgnorePendingStylesheets();
409
408 // We shouldn't close typing in the middle of setComposition. 410 // We shouldn't close typing in the middle of setComposition.
409 setEditableSelectionOffsets(selectedRange, NotUserTriggered); 411 setEditableSelectionOffsets(selectedRange, NotUserTriggered);
410 412
411 if (underlines.isEmpty()) { 413 if (underlines.isEmpty()) {
412 frame().document()->markers().addCompositionMarker(m_compositionRange->s tartPosition(), m_compositionRange->endPosition(), Color::black, false, LayoutTh eme::theme().platformDefaultCompositionBackgroundColor()); 414 frame().document()->markers().addCompositionMarker(m_compositionRange->s tartPosition(), m_compositionRange->endPosition(), Color::black, false, LayoutTh eme::theme().platformDefaultCompositionBackgroundColor());
413 return; 415 return;
414 } 416 }
415 for (const auto& underline : underlines) { 417 for (const auto& underline : underlines) {
416 unsigned underlineStart = baseOffset + underline.startOffset; 418 unsigned underlineStart = baseOffset + underline.startOffset;
417 unsigned underlineEnd = baseOffset + underline.endOffset; 419 unsigned underlineEnd = baseOffset + underline.endOffset;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 } 491 }
490 492
491 bool InputMethodController::setSelectionOffsets(const PlainTextRange& selectionO ffsets, FrameSelection::SetSelectionOptions options) 493 bool InputMethodController::setSelectionOffsets(const PlainTextRange& selectionO ffsets, FrameSelection::SetSelectionOptions options)
492 { 494 {
493 if (selectionOffsets.isNull()) 495 if (selectionOffsets.isNull())
494 return false; 496 return false;
495 Element* rootEditableElement = frame().selection().rootEditableElement(); 497 Element* rootEditableElement = frame().selection().rootEditableElement();
496 if (!rootEditableElement) 498 if (!rootEditableElement)
497 return false; 499 return false;
498 500
499 // TODO(dglazkov): The use of updateStyleAndLayoutIgnorePendingStylesheets n eeds to be audited. 501 DCHECK(!rootEditableElement->document().needsLayoutTreeUpdate());
500 // see http://crbug.com/590369 for more details.
501 rootEditableElement->document().updateStyleAndLayoutIgnorePendingStylesheets ();
502 502
503 const EphemeralRange range = selectionOffsets.createRange(*rootEditableEleme nt); 503 const EphemeralRange range = selectionOffsets.createRange(*rootEditableEleme nt);
504 if (range.isNull()) 504 if (range.isNull())
505 return false; 505 return false;
506 506
507 return frame().selection().setSelectedRange(range, VP_DEFAULT_AFFINITY, Sele ctionDirectionalMode::NonDirectional, options); 507 return frame().selection().setSelectedRange(range, VP_DEFAULT_AFFINITY, Sele ctionDirectionalMode::NonDirectional, options);
508 } 508 }
509 509
510 bool InputMethodController::setEditableSelectionOffsets(const PlainTextRange& se lectionOffsets, FrameSelection::SetSelectionOptions options) 510 bool InputMethodController::setEditableSelectionOffsets(const PlainTextRange& se lectionOffsets, FrameSelection::SetSelectionOptions options)
511 { 511 {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 TypingCommand::deleteSelection(*frame().document()); 578 TypingCommand::deleteSelection(*frame().document());
579 } 579 }
580 580
581 DEFINE_TRACE(InputMethodController) 581 DEFINE_TRACE(InputMethodController)
582 { 582 {
583 visitor->trace(m_frame); 583 visitor->trace(m_frame);
584 visitor->trace(m_compositionRange); 584 visitor->trace(m_compositionRange);
585 } 585 }
586 586
587 } // namespace blink 587 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698