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

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

Issue 2665823002: Invalidate caret during paint invalidation (Closed)
Patch Set: NeedsRebaseline Created 3 years, 10 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) 2004, 2008, 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2008, 2009, 2010 Apple 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 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 notifyLayoutObjectOfSelectionChange(userTriggered); 217 notifyLayoutObjectOfSelectionChange(userTriggered);
218 return; 218 return;
219 } 219 }
220 220
221 const VisibleSelectionTemplate<Strategy> oldSelection = 221 const VisibleSelectionTemplate<Strategy> oldSelection =
222 visibleSelection<Strategy>(); 222 visibleSelection<Strategy>();
223 const Position& oldSelectionStart = selection().start(); 223 const Position& oldSelectionStart = selection().start();
224 224
225 m_handleVisibility = handleVisibility; 225 m_handleVisibility = handleVisibility;
226 m_selectionEditor->setVisibleSelection(s, options); 226 m_selectionEditor->setVisibleSelection(s, options);
227 m_frameCaret->setCaretRectNeedsUpdate(); 227 scheduleVisualUpdateForPaintInvalidationIfNeeded();
228 228
229 if (!s.isNone() && !(options & DoNotSetFocus)) { 229 if (!s.isNone() && !(options & DoNotSetFocus)) {
230 setFocusedNodeIfNeeded(); 230 setFocusedNodeIfNeeded();
231 // |setFocusedNodeIfNeeded()| dispatches sync events "FocusOut" and 231 // |setFocusedNodeIfNeeded()| dispatches sync events "FocusOut" and
232 // "FocusIn", |m_frame| may associate to another document. 232 // "FocusIn", |m_frame| may associate to another document.
233 if (!isAvailable() || document() != currentDocument) { 233 if (!isAvailable() || document() != currentDocument) {
234 // Once we get test case to reach here, we should change this 234 // Once we get test case to reach here, we should change this
235 // if-statement to |DCHECK()|. 235 // if-statement to |DCHECK()|.
236 NOTREACHED(); 236 NOTREACHED();
237 return; 237 return;
238 } 238 }
239 } 239 }
240 240
241 if (!(options & DoNotUpdateAppearance)) { 241 if (!(options & DoNotUpdateAppearance)) {
242 // Hits in
243 // compositing/overflow/do-not-paint-outline-into-composited-scrolling-conte nts.html
244 DisableCompositingQueryAsserts disabler;
245 m_frameCaret->stopCaretBlinkTimer(); 242 m_frameCaret->stopCaretBlinkTimer();
246 updateAppearance(); 243 updateAppearance();
247 } 244 }
248 245
249 // Always clear the x position used for vertical arrow navigation. 246 // Always clear the x position used for vertical arrow navigation.
250 // It will be restored by the vertical arrow navigation code if necessary. 247 // It will be restored by the vertical arrow navigation code if necessary.
251 m_xPosForVerticalArrowNavigation = NoXPosForVerticalArrowNavigation(); 248 m_xPosForVerticalArrowNavigation = NoXPosForVerticalArrowNavigation();
252 // This may dispatch a synchronous focus-related events. 249 // This may dispatch a synchronous focus-related events.
253 selectFrameElementInParentIfFullySelected(); 250 selectFrameElementInParentIfFullySelected();
254 if (!isAvailable() || document() != currentDocument) { 251 if (!isAvailable() || document() != currentDocument) {
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 const Position& oldExtent = selection().extent(); 376 const Position& oldExtent = selection().extent();
380 const Position& newExtent = 377 const Position& newExtent =
381 computePositionForChildrenRemoval(oldExtent, container); 378 computePositionForChildrenRemoval(oldExtent, container);
382 if (newStart == oldStart && newEnd == oldEnd && newBase == oldBase && 379 if (newStart == oldStart && newEnd == oldEnd && newBase == oldBase &&
383 newExtent == oldExtent) 380 newExtent == oldExtent)
384 return; 381 return;
385 if (selection().isBaseFirst()) 382 if (selection().isBaseFirst())
386 m_selectionEditor->setWithoutValidation(newStart, newEnd); 383 m_selectionEditor->setWithoutValidation(newStart, newEnd);
387 else 384 else
388 m_selectionEditor->setWithoutValidation(newEnd, newStart); 385 m_selectionEditor->setWithoutValidation(newEnd, newStart);
389 m_frameCaret->setCaretRectNeedsUpdate();
390 if (document().isRunningExecCommand()) 386 if (document().isRunningExecCommand())
391 return; 387 return;
392 TypingCommand::closeTyping(m_frame); 388 TypingCommand::closeTyping(m_frame);
393 } 389 }
394 390
395 void FrameSelection::nodeWillBeRemoved(Node& node) { 391 void FrameSelection::nodeWillBeRemoved(Node& node) {
396 // There can't be a selection inside a fragment, so if a fragment's node is 392 // There can't be a selection inside a fragment, so if a fragment's node is
397 // being removed, the selection in the document that created the fragment 393 // being removed, the selection in the document that created the fragment
398 // needs no adjustment. 394 // needs no adjustment.
399 if (isNone() || !node.inActiveDocument()) 395 if (isNone() || !node.inActiveDocument())
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 // TODO(yosin): We should paint changed area only rather than whole 455 // TODO(yosin): We should paint changed area only rather than whole
460 // selected range. 456 // selected range.
461 clearLayoutTreeSelection = true; 457 clearLayoutTreeSelection = true;
462 } 458 }
463 459
464 if (clearLayoutTreeSelection) 460 if (clearLayoutTreeSelection)
465 selection().start().document()->layoutViewItem().clearSelection(); 461 selection().start().document()->layoutViewItem().clearSelection();
466 462
467 if (clearDOMTreeSelection) 463 if (clearDOMTreeSelection)
468 setSelection(SelectionInDOMTree(), DoNotSetFocus); 464 setSelection(SelectionInDOMTree(), DoNotSetFocus);
469 m_frameCaret->setCaretRectNeedsUpdate();
470 465
471 // TODO(yosin): We should move to call |TypingCommand::closeTyping()| to 466 // TODO(yosin): We should move to call |TypingCommand::closeTyping()| to
472 // |Editor| class. 467 // |Editor| class.
473 if (!document().isRunningExecCommand()) 468 if (!document().isRunningExecCommand())
474 TypingCommand::closeTyping(m_frame); 469 TypingCommand::closeTyping(m_frame);
475 } 470 }
476 471
477 static Position updatePositionAfterAdoptingTextReplacement( 472 static Position updatePositionAfterAdoptingTextReplacement(
478 const Position& position, 473 const Position& position,
479 CharacterData* node, 474 CharacterData* node,
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 CloseTyping | ClearTypingStyle | userTriggered; 665 CloseTyping | ClearTypingStyle | userTriggered;
671 setSelection(selectionModifier.selection(), options); 666 setSelection(selectionModifier.selection(), options);
672 667
673 if (granularity == LineGranularity || granularity == ParagraphGranularity) 668 if (granularity == LineGranularity || granularity == ParagraphGranularity)
674 m_xPosForVerticalArrowNavigation = 669 m_xPosForVerticalArrowNavigation =
675 selectionModifier.xPosForVerticalArrowNavigation(); 670 selectionModifier.xPosForVerticalArrowNavigation();
676 671
677 if (userTriggered == UserTriggered) 672 if (userTriggered == UserTriggered)
678 m_granularity = CharacterGranularity; 673 m_granularity = CharacterGranularity;
679 674
680 m_frameCaret->setCaretRectNeedsUpdate(); 675 scheduleVisualUpdateForPaintInvalidationIfNeeded();
681 676
682 return true; 677 return true;
683 } 678 }
684 679
685 bool FrameSelection::modify(EAlteration alter, 680 bool FrameSelection::modify(EAlteration alter,
686 unsigned verticalDistance, 681 unsigned verticalDistance,
687 VerticalDirection direction) { 682 VerticalDirection direction) {
688 SelectionModifier selectionModifier(*frame(), selection()); 683 SelectionModifier selectionModifier(*frame(), selection());
689 if (!selectionModifier.modifyWithPageGranularity(alter, verticalDistance, 684 if (!selectionModifier.modifyWithPageGranularity(alter, verticalDistance,
690 direction)) { 685 direction)) {
(...skipping 14 matching lines...) Expand all
705 m_granularity = CharacterGranularity; 700 m_granularity = CharacterGranularity;
706 if (m_granularityStrategy) 701 if (m_granularityStrategy)
707 m_granularityStrategy->Clear(); 702 m_granularityStrategy->Clear();
708 setSelection(SelectionInDOMTree()); 703 setSelection(SelectionInDOMTree());
709 } 704 }
710 705
711 void FrameSelection::documentAttached(Document* document) { 706 void FrameSelection::documentAttached(Document* document) {
712 DCHECK(document); 707 DCHECK(document);
713 m_useSecureKeyboardEntryWhenActive = false; 708 m_useSecureKeyboardEntryWhenActive = false;
714 m_selectionEditor->documentAttached(document); 709 m_selectionEditor->documentAttached(document);
715 m_frameCaret->documentAttached(document);
716 setContext(document); 710 setContext(document);
717 } 711 }
718 712
719 void FrameSelection::contextDestroyed(Document* document) { 713 void FrameSelection::contextDestroyed(Document* document) {
720 m_granularity = CharacterGranularity; 714 m_granularity = CharacterGranularity;
721 715
722 LayoutViewItem view = m_frame->contentLayoutItem(); 716 LayoutViewItem view = m_frame->contentLayoutItem();
723 if (!view.isNull()) 717 if (!view.isNull())
724 view.clearSelection(); 718 view.clearSelection();
725 719
726 m_frame->editor().clearTypingStyle(); 720 m_frame->editor().clearTypingStyle();
727 m_selectionEditor->documentDetached(*document); 721 m_selectionEditor->documentDetached(*document);
728 } 722 }
729 723
730 bool FrameSelection::hasCaretIn(const LayoutBlock& layoubBlock) const { 724 void FrameSelection::clearPreviousCaretVisualRect(const LayoutBlock& block) {
725 m_frameCaret->clearPreviousVisualRect(block);
726 }
727
728 void FrameSelection::layoutBlockWillBeDestroyed(const LayoutBlock& block) {
729 m_frameCaret->layoutBlockWillBeDestroyed(block);
730 }
731
732 void FrameSelection::updateStyleAndLayoutIfNeeded() {
733 m_frameCaret->updateStyleAndLayoutIfNeeded();
734 }
735
736 void FrameSelection::invalidatePaintIfNeeded(
737 const LayoutBlock& block,
738 const PaintInvalidatorContext& context,
739 PaintInvalidationReason reason) {
740 m_frameCaret->invalidatePaintIfNeeded(block, context, reason);
741 }
742
743 bool FrameSelection::shouldPaintCaret(const LayoutBlock& block) const {
731 DCHECK(selection().isValidFor(document())); 744 DCHECK(selection().isValidFor(document()));
732 if (!isCaret()) 745
733 return false; 746 bool result = m_frameCaret->shouldPaintCaret(block);
734 return CaretDisplayItemClient::caretLayoutObject( 747 DCHECK(!result || (isCaret() && hasEditableStyle()));
735 selection().start().anchorNode()) == layoubBlock && 748 return result;
736 hasEditableStyle();
737 } 749 }
738 750
739 IntRect FrameSelection::absoluteCaretBounds() { 751 IntRect FrameSelection::absoluteCaretBounds() {
740 DCHECK(selection().isValidFor(*m_frame->document())); 752 DCHECK(selection().isValidFor(*m_frame->document()));
741 return m_frameCaret->absoluteCaretBounds(); 753 return m_frameCaret->absoluteCaretBounds();
742 } 754 }
743 755
744 void FrameSelection::invalidateCaretRect(bool forceInvalidation) {
745 m_frameCaret->invalidateCaretRect(forceInvalidation);
746 }
747
748 void FrameSelection::dataWillChange(const CharacterData& node) {
749 m_frameCaret->dataWillChange(node);
750 }
751
752 void FrameSelection::paintCaret(GraphicsContext& context, 756 void FrameSelection::paintCaret(GraphicsContext& context,
753 const LayoutPoint& paintOffset) { 757 const LayoutPoint& paintOffset) {
754 m_frameCaret->paintCaret(context, paintOffset); 758 m_frameCaret->paintCaret(context, paintOffset);
755 } 759 }
756 760
757 bool FrameSelection::contains(const LayoutPoint& point) { 761 bool FrameSelection::contains(const LayoutPoint& point) {
758 if (document().layoutViewItem().isNull()) 762 if (document().layoutViewItem().isNull())
759 return false; 763 return false;
760 764
761 // Treat a collapsed selection like no selection. 765 // Treat a collapsed selection like no selection.
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 1048
1045 bool FrameSelection::isAppearanceDirty() const { 1049 bool FrameSelection::isAppearanceDirty() const {
1046 return m_pendingSelection->hasPendingSelection(); 1050 return m_pendingSelection->hasPendingSelection();
1047 } 1051 }
1048 1052
1049 void FrameSelection::commitAppearanceIfNeeded(LayoutView& layoutView) { 1053 void FrameSelection::commitAppearanceIfNeeded(LayoutView& layoutView) {
1050 return m_pendingSelection->commit(layoutView); 1054 return m_pendingSelection->commit(layoutView);
1051 } 1055 }
1052 1056
1053 void FrameSelection::didLayout() { 1057 void FrameSelection::didLayout() {
1054 setCaretRectNeedsUpdate();
1055 updateAppearance(); 1058 updateAppearance();
1056 } 1059 }
1057 1060
1058 void FrameSelection::updateAppearance() { 1061 void FrameSelection::updateAppearance() {
1059 m_frameCaret->updateAppearance(); 1062 m_frameCaret->updateAppearance();
1060 1063
1061 if (m_frame->contentLayoutItem().isNull()) 1064 if (m_frame->contentLayoutItem().isNull())
1062 return; 1065 return;
1063 m_pendingSelection->setHasPendingSelection(); 1066 m_pendingSelection->setHasPendingSelection();
1064 } 1067 }
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1304 visitor->trace(m_selectionEditor); 1307 visitor->trace(m_selectionEditor);
1305 visitor->trace(m_frameCaret); 1308 visitor->trace(m_frameCaret);
1306 SynchronousMutationObserver::trace(visitor); 1309 SynchronousMutationObserver::trace(visitor);
1307 } 1310 }
1308 1311
1309 void FrameSelection::scheduleVisualUpdate() const { 1312 void FrameSelection::scheduleVisualUpdate() const {
1310 if (Page* page = m_frame->page()) 1313 if (Page* page = m_frame->page())
1311 page->animator().scheduleVisualUpdate(m_frame->localFrameRoot()); 1314 page->animator().scheduleVisualUpdate(m_frame->localFrameRoot());
1312 } 1315 }
1313 1316
1317 void FrameSelection::scheduleVisualUpdateForPaintInvalidationIfNeeded() const {
1318 if (FrameView* frameView = m_frame->view())
1319 frameView->scheduleVisualUpdateForPaintInvalidationIfNeeded();
1320 }
1321
1314 bool FrameSelection::selectWordAroundPosition(const VisiblePosition& position) { 1322 bool FrameSelection::selectWordAroundPosition(const VisiblePosition& position) {
1315 static const EWordSide wordSideList[2] = {RightWordIfOnBoundary, 1323 static const EWordSide wordSideList[2] = {RightWordIfOnBoundary,
1316 LeftWordIfOnBoundary}; 1324 LeftWordIfOnBoundary};
1317 for (EWordSide wordSide : wordSideList) { 1325 for (EWordSide wordSide : wordSideList) {
1318 VisiblePosition start = startOfWord(position, wordSide); 1326 VisiblePosition start = startOfWord(position, wordSide);
1319 VisiblePosition end = endOfWord(position, wordSide); 1327 VisiblePosition end = endOfWord(position, wordSide);
1320 String text = 1328 String text =
1321 plainText(EphemeralRange(start.deepEquivalent(), end.deepEquivalent())); 1329 plainText(EphemeralRange(start.deepEquivalent(), end.deepEquivalent()));
1322 if (!text.isEmpty() && !isSeparator(text.characterStartingAt(0))) { 1330 if (!text.isEmpty() && !isSeparator(text.characterStartingAt(0))) {
1323 setSelection(SelectionInDOMTree::Builder() 1331 setSelection(SelectionInDOMTree::Builder()
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 void FrameSelection::updateIfNeeded() { 1401 void FrameSelection::updateIfNeeded() {
1394 DCHECK(!m_frame->document()->needsLayoutTreeUpdate()); 1402 DCHECK(!m_frame->document()->needsLayoutTreeUpdate());
1395 m_selectionEditor->updateIfNeeded(); 1403 m_selectionEditor->updateIfNeeded();
1396 } 1404 }
1397 1405
1398 void FrameSelection::setCaretVisible(bool caretIsVisible) { 1406 void FrameSelection::setCaretVisible(bool caretIsVisible) {
1399 m_frameCaret->setCaretVisibility(caretIsVisible ? CaretVisibility::Visible 1407 m_frameCaret->setCaretVisibility(caretIsVisible ? CaretVisibility::Visible
1400 : CaretVisibility::Hidden); 1408 : CaretVisibility::Hidden);
1401 } 1409 }
1402 1410
1403 bool FrameSelection::shouldPaintCaretForTesting() const {
1404 return m_frameCaret->shouldPaintCaretForTesting();
1405 }
1406
1407 bool FrameSelection::isPreviousCaretDirtyForTesting() const {
1408 return m_frameCaret->isPreviousCaretDirtyForTesting();
1409 }
1410
1411 void FrameSelection::setCaretRectNeedsUpdate() {
1412 m_frameCaret->setCaretRectNeedsUpdate();
1413 }
1414
1415 void FrameSelection::setCaretBlinkingSuspended(bool suspended) { 1411 void FrameSelection::setCaretBlinkingSuspended(bool suspended) {
1416 m_frameCaret->setCaretBlinkingSuspended(suspended); 1412 m_frameCaret->setCaretBlinkingSuspended(suspended);
1417 } 1413 }
1418 1414
1419 bool FrameSelection::isCaretBlinkingSuspended() const { 1415 bool FrameSelection::isCaretBlinkingSuspended() const {
1420 return m_frameCaret->isCaretBlinkingSuspended(); 1416 return m_frameCaret->isCaretBlinkingSuspended();
1421 } 1417 }
1422 1418
1423 } // namespace blink 1419 } // namespace blink
1424 1420
1425 #ifndef NDEBUG 1421 #ifndef NDEBUG
1426 1422
1427 void showTree(const blink::FrameSelection& sel) { 1423 void showTree(const blink::FrameSelection& sel) {
1428 sel.showTreeForThis(); 1424 sel.showTreeForThis();
1429 } 1425 }
1430 1426
1431 void showTree(const blink::FrameSelection* sel) { 1427 void showTree(const blink::FrameSelection* sel) {
1432 if (sel) 1428 if (sel)
1433 sel->showTreeForThis(); 1429 sel->showTreeForThis();
1434 else 1430 else
1435 LOG(INFO) << "Cannot showTree for <null> FrameSelection."; 1431 LOG(INFO) << "Cannot showTree for <null> FrameSelection.";
1436 } 1432 }
1437 1433
1438 #endif 1434 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/FrameSelection.h ('k') | third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698