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

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

Issue 299353004: Oilpan: move editing objects to the heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased + tidied Created 6 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) 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 , m_isCaretBlinkingSuspended(false) 100 , m_isCaretBlinkingSuspended(false)
101 , m_focused(frame && frame->page() && frame->page()->focusController().focus edFrame() == frame) 101 , m_focused(frame && frame->page() && frame->page()->focusController().focus edFrame() == frame)
102 , m_shouldShowBlockCursor(false) 102 , m_shouldShowBlockCursor(false)
103 { 103 {
104 if (shouldAlwaysUseDirectionalSelection(m_frame)) 104 if (shouldAlwaysUseDirectionalSelection(m_frame))
105 m_selection.setIsDirectional(true); 105 m_selection.setIsDirectional(true);
106 } 106 }
107 107
108 FrameSelection::~FrameSelection() 108 FrameSelection::~FrameSelection()
109 { 109 {
110 stopObservingVisibleSelectionChangeIfNecessary(); 110 stopObservingVisibleSelectionChangeIfNecessary();
haraken 2014/05/28 15:35:25 This destructor touches m_selection, which is an o
sof 2014/05/28 22:06:06 Yes, the observer clearing is not needed at all wi
111 } 111 }
112 112
113 Element* FrameSelection::rootEditableElementOrDocumentElement() const 113 Element* FrameSelection::rootEditableElementOrDocumentElement() const
114 { 114 {
115 Element* selectionRoot = m_selection.rootEditableElement(); 115 Element* selectionRoot = m_selection.rootEditableElement();
116 return selectionRoot ? selectionRoot : m_frame->document()->documentElement( ); 116 return selectionRoot ? selectionRoot : m_frame->document()->documentElement( );
117 } 117 }
118 118
119 Node* FrameSelection::rootEditableElementOrTreeScopeRootNode() const 119 Node* FrameSelection::rootEditableElementOrTreeScopeRootNode() const
120 { 120 {
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 } 927 }
928 928
929 static bool isBoundary(TextGranularity granularity) 929 static bool isBoundary(TextGranularity granularity)
930 { 930 {
931 return granularity == LineBoundary || granularity == ParagraphBoundary || gr anularity == DocumentBoundary; 931 return granularity == LineBoundary || granularity == ParagraphBoundary || gr anularity == DocumentBoundary;
932 } 932 }
933 933
934 bool FrameSelection::modify(EAlteration alter, SelectionDirection direction, Tex tGranularity granularity, EUserTriggered userTriggered) 934 bool FrameSelection::modify(EAlteration alter, SelectionDirection direction, Tex tGranularity granularity, EUserTriggered userTriggered)
935 { 935 {
936 if (userTriggered == UserTriggered) { 936 if (userTriggered == UserTriggered) {
937 FrameSelection trialFrameSelection; 937 OwnPtrWillBeRawPtr<FrameSelection> trialFrameSelection = FrameSelection: :create();
938 trialFrameSelection.setSelection(m_selection); 938 trialFrameSelection->setSelection(m_selection);
939 trialFrameSelection.modify(alter, direction, granularity, NotUserTrigger ed); 939 trialFrameSelection->modify(alter, direction, granularity, NotUserTrigge red);
940 940
941 if (trialFrameSelection.selection().isRange() && m_selection.isCaret() & & !dispatchSelectStart()) 941 if (trialFrameSelection->selection().isRange() && m_selection.isCaret() && !dispatchSelectStart())
942 return false; 942 return false;
943 } 943 }
944 944
945 willBeModified(alter, direction); 945 willBeModified(alter, direction);
946 946
947 bool wasRange = m_selection.isRange(); 947 bool wasRange = m_selection.isRange();
948 VisiblePosition originalStartPosition = m_selection.visibleStart(); 948 VisiblePosition originalStartPosition = m_selection.visibleStart();
949 VisiblePosition position; 949 VisiblePosition position;
950 switch (direction) { 950 switch (direction) {
951 case DirectionRight: 951 case DirectionRight:
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1041 y = rect.y() + rect.height() / 2; 1041 y = rect.y() + rect.height() / 2;
1042 return true; 1042 return true;
1043 } 1043 }
1044 1044
1045 bool FrameSelection::modify(EAlteration alter, unsigned verticalDistance, Vertic alDirection direction, EUserTriggered userTriggered, CursorAlignOnScroll align) 1045 bool FrameSelection::modify(EAlteration alter, unsigned verticalDistance, Vertic alDirection direction, EUserTriggered userTriggered, CursorAlignOnScroll align)
1046 { 1046 {
1047 if (!verticalDistance) 1047 if (!verticalDistance)
1048 return false; 1048 return false;
1049 1049
1050 if (userTriggered == UserTriggered) { 1050 if (userTriggered == UserTriggered) {
1051 FrameSelection trialFrameSelection; 1051 OwnPtrWillBeRawPtr<FrameSelection> trialFrameSelection = FrameSelection: :create();
1052 trialFrameSelection.setSelection(m_selection); 1052 trialFrameSelection->setSelection(m_selection);
1053 trialFrameSelection.modify(alter, verticalDistance, direction, NotUserTr iggered); 1053 trialFrameSelection->modify(alter, verticalDistance, direction, NotUserT riggered);
1054 } 1054 }
1055 1055
1056 willBeModified(alter, direction == DirectionUp ? DirectionBackward : Directi onForward); 1056 willBeModified(alter, direction == DirectionUp ? DirectionBackward : Directi onForward);
1057 1057
1058 VisiblePosition pos; 1058 VisiblePosition pos;
1059 LayoutUnit xPos = 0; 1059 LayoutUnit xPos = 0;
1060 switch (alter) { 1060 switch (alter) {
1061 case AlterationMove: 1061 case AlterationMove:
1062 pos = VisiblePosition(direction == DirectionUp ? m_selection.start() : m _selection.end(), m_selection.affinity()); 1062 pos = VisiblePosition(direction == DirectionUp ? m_selection.start() : m _selection.end(), m_selection.affinity());
1063 xPos = lineDirectionPointForBlockDirectionNavigation(direction == Direct ionUp ? START : END); 1063 xPos = lineDirectionPointForBlockDirectionNavigation(direction == Direct ionUp ? START : END);
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
1363 Document* document = m_frame->document(); 1363 Document* document = m_frame->document();
1364 1364
1365 if (isHTMLSelectElement(document->focusedElement())) { 1365 if (isHTMLSelectElement(document->focusedElement())) {
1366 HTMLSelectElement* selectElement = toHTMLSelectElement(document->focused Element()); 1366 HTMLSelectElement* selectElement = toHTMLSelectElement(document->focused Element());
1367 if (selectElement->canSelectAll()) { 1367 if (selectElement->canSelectAll()) {
1368 selectElement->selectAll(); 1368 selectElement->selectAll();
1369 return; 1369 return;
1370 } 1370 }
1371 } 1371 }
1372 1372
1373 RefPtr<Node> root = nullptr; 1373 RefPtrWillBeRawPtr<Node> root = nullptr;
1374 Node* selectStartTarget = 0; 1374 Node* selectStartTarget = 0;
1375 if (isContentEditable()) { 1375 if (isContentEditable()) {
1376 root = highestEditableRoot(m_selection.start()); 1376 root = highestEditableRoot(m_selection.start());
1377 if (Node* shadowRoot = m_selection.nonBoundaryShadowTreeRootNode()) 1377 if (Node* shadowRoot = m_selection.nonBoundaryShadowTreeRootNode())
1378 selectStartTarget = shadowRoot->shadowHost(); 1378 selectStartTarget = shadowRoot->shadowHost();
1379 else 1379 else
1380 selectStartTarget = root.get(); 1380 selectStartTarget = root.get();
1381 } else { 1381 } else {
1382 root = m_selection.nonBoundaryShadowTreeRootNode(); 1382 root = m_selection.nonBoundaryShadowTreeRootNode();
1383 if (root) 1383 if (root)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 if (m_selection.start().isNotNull() && m_selection.end().isNotNull()) { 1441 if (m_selection.start().isNotNull() && m_selection.end().isNotNull()) {
1442 if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache()) 1442 if (AXObjectCache* cache = m_frame->document()->existingAXObjectCache())
1443 cache->selectionChanged(m_selection.start().containerNode()); 1443 cache->selectionChanged(m_selection.start().containerNode());
1444 } 1444 }
1445 } 1445 }
1446 1446
1447 void FrameSelection::focusedOrActiveStateChanged() 1447 void FrameSelection::focusedOrActiveStateChanged()
1448 { 1448 {
1449 bool activeAndFocused = isFocusedAndActive(); 1449 bool activeAndFocused = isFocusedAndActive();
1450 1450
1451 RefPtr<Document> document = m_frame->document(); 1451 RefPtrWillBeRawPtr<Document> document = m_frame->document();
1452 document->updateRenderTreeIfNeeded(); 1452 document->updateRenderTreeIfNeeded();
1453 1453
1454 // Because RenderObject::selectionBackgroundColor() and 1454 // Because RenderObject::selectionBackgroundColor() and
1455 // RenderObject::selectionForegroundColor() check if the frame is active, 1455 // RenderObject::selectionForegroundColor() check if the frame is active,
1456 // we have to update places those colors were painted. 1456 // we have to update places those colors were painted.
1457 if (RenderView* view = document->renderView()) 1457 if (RenderView* view = document->renderView())
1458 view->repaintSelection(); 1458 view->repaintSelection();
1459 1459
1460 // Caret appears in the active frame. 1460 // Caret appears in the active frame.
1461 if (activeAndFocused) 1461 if (activeAndFocused)
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
1856 m_selection.formatForDebugger(buffer, length); 1856 m_selection.formatForDebugger(buffer, length);
1857 } 1857 }
1858 1858
1859 void FrameSelection::showTreeForThis() const 1859 void FrameSelection::showTreeForThis() const
1860 { 1860 {
1861 m_selection.showTreeForThis(); 1861 m_selection.showTreeForThis();
1862 } 1862 }
1863 1863
1864 #endif 1864 #endif
1865 1865
1866 void FrameSelection::trace(Visitor* visitor)
1867 {
1868 visitor->trace(m_selection);
1869 visitor->trace(m_originalBase);
1870 visitor->trace(m_logicalRange);
1871 visitor->trace(m_previousCaretNode);
1872 visitor->trace(m_typingStyle);
1873 }
1874
1866 } 1875 }
1867 1876
1868 #ifndef NDEBUG 1877 #ifndef NDEBUG
1869 1878
1870 void showTree(const WebCore::FrameSelection& sel) 1879 void showTree(const WebCore::FrameSelection& sel)
1871 { 1880 {
1872 sel.showTreeForThis(); 1881 sel.showTreeForThis();
1873 } 1882 }
1874 1883
1875 void showTree(const WebCore::FrameSelection* sel) 1884 void showTree(const WebCore::FrameSelection* sel)
1876 { 1885 {
1877 if (sel) 1886 if (sel)
1878 sel->showTreeForThis(); 1887 sel->showTreeForThis();
1879 } 1888 }
1880 1889
1881 #endif 1890 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698