OLD | NEW |
---|---|
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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 | 248 |
249 if (text.length()) { | 249 if (text.length()) { |
250 confirmComposition(text); | 250 confirmComposition(text); |
251 return true; | 251 return true; |
252 } | 252 } |
253 | 253 |
254 if (confirmBehavior == DoNotKeepSelection) | 254 if (confirmBehavior == DoNotKeepSelection) |
255 return confirmComposition(composingText(), DoNotKeepSelection); | 255 return confirmComposition(composingText(), DoNotKeepSelection); |
256 | 256 |
257 SelectionOffsetsScope selectionOffsetsScope(this); | 257 SelectionOffsetsScope selectionOffsetsScope(this); |
258 return confirmComposition(); | 258 bool result = confirmComposition(); |
259 | |
260 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | |
261 // needs to be audited. see http://crbug.com/590369 for more details. | |
262 frame().document()->updateStyleAndLayoutIgnorePendingStylesheets(); | |
yosin_UTC9
2016/09/08 04:04:41
This is the first pattern which updates layout aft
Xiaocheng
2016/09/08 06:39:09
It is in fact the dtor of the SelectionOffsetsScop
| |
263 | |
264 return result; | |
259 } | 265 } |
260 | 266 |
261 void InputMethodController::cancelComposition() | 267 void InputMethodController::cancelComposition() |
262 { | 268 { |
263 if (!hasComposition()) | 269 if (!hasComposition()) |
264 return; | 270 return; |
265 | 271 |
266 Editor::RevealSelectionScope revealSelectionScope(&editor()); | 272 Editor::RevealSelectionScope revealSelectionScope(&editor()); |
267 | 273 |
268 if (frame().selection().isNone()) | 274 if (frame().selection().isNone()) |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 // !hasComposition() && test.isEmpty(). | 353 // !hasComposition() && test.isEmpty(). |
348 if (text.isEmpty()) { | 354 if (text.isEmpty()) { |
349 if (hasComposition()) { | 355 if (hasComposition()) { |
350 confirmComposition(emptyString()); | 356 confirmComposition(emptyString()); |
351 } else { | 357 } else { |
352 // It's weird to call |setComposition()| with empty text outside com position, however some IME | 358 // 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. | 359 // (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); | 360 TypingCommand::deleteSelection(*frame().document(), TypingCommand::P reventSpellChecking); |
355 } | 361 } |
356 | 362 |
363 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesh eets | |
364 // needs to be audited. see http://crbug.com/590369 for more details. | |
365 frame().document()->updateStyleAndLayoutIgnorePendingStylesheets(); | |
366 | |
357 setEditableSelectionOffsets(selectedRange); | 367 setEditableSelectionOffsets(selectedRange); |
358 return; | 368 return; |
359 } | 369 } |
360 | 370 |
361 // We should send a 'compositionstart' event only when the given text is not empty because this | 371 // 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. | 372 // function doesn't create a composition node when the text is empty. |
363 if (!hasComposition()) { | 373 if (!hasComposition()) { |
364 target->dispatchEvent(CompositionEvent::create(EventTypeNames::compositi onstart, frame().domWindow(), frame().selectedText())); | 374 target->dispatchEvent(CompositionEvent::create(EventTypeNames::compositi onstart, frame().domWindow(), frame().selectedText())); |
365 if (!frame().document()) | 375 if (!frame().document()) |
366 return; | 376 return; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
398 m_isDirty = true; | 408 m_isDirty = true; |
399 m_hasComposition = true; | 409 m_hasComposition = true; |
400 if (!m_compositionRange) | 410 if (!m_compositionRange) |
401 m_compositionRange = Range::create(baseNode->document()); | 411 m_compositionRange = Range::create(baseNode->document()); |
402 m_compositionRange->setStart(baseNode, baseOffset); | 412 m_compositionRange->setStart(baseNode, baseOffset); |
403 m_compositionRange->setEnd(baseNode, extentOffset); | 413 m_compositionRange->setEnd(baseNode, extentOffset); |
404 | 414 |
405 if (baseNode->layoutObject()) | 415 if (baseNode->layoutObject()) |
406 baseNode->layoutObject()->setShouldDoFullPaintInvalidation(); | 416 baseNode->layoutObject()->setShouldDoFullPaintInvalidation(); |
407 | 417 |
418 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | |
419 // needs to be audited. see http://crbug.com/590369 for more details. | |
420 frame().document()->updateStyleAndLayoutIgnorePendingStylesheets(); | |
421 | |
408 // We shouldn't close typing in the middle of setComposition. | 422 // We shouldn't close typing in the middle of setComposition. |
409 setEditableSelectionOffsets(selectedRange, NotUserTriggered); | 423 setEditableSelectionOffsets(selectedRange, NotUserTriggered); |
410 | 424 |
411 if (underlines.isEmpty()) { | 425 if (underlines.isEmpty()) { |
412 frame().document()->markers().addCompositionMarker(m_compositionRange->s tartPosition(), m_compositionRange->endPosition(), Color::black, false, LayoutTh eme::theme().platformDefaultCompositionBackgroundColor()); | 426 frame().document()->markers().addCompositionMarker(m_compositionRange->s tartPosition(), m_compositionRange->endPosition(), Color::black, false, LayoutTh eme::theme().platformDefaultCompositionBackgroundColor()); |
413 return; | 427 return; |
414 } | 428 } |
415 for (const auto& underline : underlines) { | 429 for (const auto& underline : underlines) { |
416 unsigned underlineStart = baseOffset + underline.startOffset; | 430 unsigned underlineStart = baseOffset + underline.startOffset; |
417 unsigned underlineEnd = baseOffset + underline.endOffset; | 431 unsigned underlineEnd = baseOffset + underline.endOffset; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
491 } | 505 } |
492 | 506 |
493 bool InputMethodController::setSelectionOffsets(const PlainTextRange& selectionO ffsets, FrameSelection::SetSelectionOptions options) | 507 bool InputMethodController::setSelectionOffsets(const PlainTextRange& selectionO ffsets, FrameSelection::SetSelectionOptions options) |
494 { | 508 { |
495 if (selectionOffsets.isNull()) | 509 if (selectionOffsets.isNull()) |
496 return false; | 510 return false; |
497 Element* rootEditableElement = frame().selection().rootEditableElement(); | 511 Element* rootEditableElement = frame().selection().rootEditableElement(); |
498 if (!rootEditableElement) | 512 if (!rootEditableElement) |
499 return false; | 513 return false; |
500 | 514 |
501 // TODO(dglazkov): The use of updateStyleAndLayoutIgnorePendingStylesheets n eeds to be audited. | 515 DCHECK(!rootEditableElement->document().needsLayoutTreeUpdate()); |
502 // see http://crbug.com/590369 for more details. | |
503 rootEditableElement->document().updateStyleAndLayoutIgnorePendingStylesheets (); | |
504 | 516 |
505 const EphemeralRange range = selectionOffsets.createRange(*rootEditableEleme nt); | 517 const EphemeralRange range = selectionOffsets.createRange(*rootEditableEleme nt); |
506 if (range.isNull()) | 518 if (range.isNull()) |
507 return false; | 519 return false; |
508 | 520 |
509 return frame().selection().setSelectedRange(range, VP_DEFAULT_AFFINITY, Sele ctionDirectionalMode::NonDirectional, options); | 521 return frame().selection().setSelectedRange(range, VP_DEFAULT_AFFINITY, Sele ctionDirectionalMode::NonDirectional, options); |
510 } | 522 } |
511 | 523 |
512 bool InputMethodController::setEditableSelectionOffsets(const PlainTextRange& se lectionOffsets, FrameSelection::SetSelectionOptions options) | 524 bool InputMethodController::setEditableSelectionOffsets(const PlainTextRange& se lectionOffsets, FrameSelection::SetSelectionOptions options) |
513 { | 525 { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
580 TypingCommand::deleteSelection(*frame().document()); | 592 TypingCommand::deleteSelection(*frame().document()); |
581 } | 593 } |
582 | 594 |
583 DEFINE_TRACE(InputMethodController) | 595 DEFINE_TRACE(InputMethodController) |
584 { | 596 { |
585 visitor->trace(m_frame); | 597 visitor->trace(m_frame); |
586 visitor->trace(m_compositionRange); | 598 visitor->trace(m_compositionRange); |
587 } | 599 } |
588 | 600 |
589 } // namespace blink | 601 } // namespace blink |
OLD | NEW |