OLD | NEW |
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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 if (shouldClearTypingStyle) | 223 if (shouldClearTypingStyle) |
224 m_frame->editor().clearTypingStyle(); | 224 m_frame->editor().clearTypingStyle(); |
225 | 225 |
226 const SelectionInDOMTree oldSelectionInDOMTree = | 226 const SelectionInDOMTree oldSelectionInDOMTree = |
227 m_selectionEditor->selectionInDOMTree(); | 227 m_selectionEditor->selectionInDOMTree(); |
228 if (oldSelectionInDOMTree == newSelection) | 228 if (oldSelectionInDOMTree == newSelection) |
229 return; | 229 return; |
230 m_selectionEditor->setSelection(newSelection); | 230 m_selectionEditor->setSelection(newSelection); |
231 scheduleVisualUpdateForPaintInvalidationIfNeeded(); | 231 scheduleVisualUpdateForPaintInvalidationIfNeeded(); |
232 | 232 |
233 // TODO(yosin): The use of updateStyleAndLayoutIgnorePendingStylesheets | |
234 // needs to be audited. see http://crbug.com/590369 for more details. | |
235 document().updateStyleAndLayoutIgnorePendingStylesheets(); | |
236 | |
237 const Document& currentDocument = document(); | 233 const Document& currentDocument = document(); |
238 // TODO(yosin): We should get rid of unsued |options| for | 234 // TODO(yosin): We should get rid of unsued |options| for |
239 // |Editor::respondToChangedSelection()|. | 235 // |Editor::respondToChangedSelection()|. |
240 // Note: Since, setting focus can modify DOM tree, we should use | 236 // Note: Since, setting focus can modify DOM tree, we should use |
241 // |oldSelection| before setting focus | 237 // |oldSelection| before setting focus |
242 m_frame->editor().respondToChangedSelection( | 238 m_frame->editor().respondToChangedSelection( |
243 createVisibleSelection(oldSelectionInDOMTree).start(), options); | 239 oldSelectionInDOMTree.computeStartPosition(), options); |
244 DCHECK_EQ(currentDocument, document()); | 240 DCHECK_EQ(currentDocument, document()); |
245 | 241 |
246 if (!computeVisibleSelectionInDOMTree().isNone() && | 242 if (!selectionInDOMTree().isNone() && !(options & DoNotSetFocus)) { |
247 !(options & DoNotSetFocus)) { | |
248 setFocusedNodeIfNeeded(); | 243 setFocusedNodeIfNeeded(); |
249 // |setFocusedNodeIfNeeded()| dispatches sync events "FocusOut" and | 244 // |setFocusedNodeIfNeeded()| dispatches sync events "FocusOut" and |
250 // "FocusIn", |m_frame| may associate to another document. | 245 // "FocusIn", |m_frame| may associate to another document. |
251 if (!isAvailable() || document() != currentDocument) { | 246 if (!isAvailable() || document() != currentDocument) { |
252 // Once we get test case to reach here, we should change this | 247 // Once we get test case to reach here, we should change this |
253 // if-statement to |DCHECK()|. | 248 // if-statement to |DCHECK()|. |
254 NOTREACHED(); | 249 NOTREACHED(); |
255 return; | 250 return; |
256 } | 251 } |
257 } | 252 } |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 // Find the parent frame; if there is none, then we have nothing to do. | 774 // Find the parent frame; if there is none, then we have nothing to do. |
780 Frame* parent = m_frame->tree().parent(); | 775 Frame* parent = m_frame->tree().parent(); |
781 if (!parent) | 776 if (!parent) |
782 return; | 777 return; |
783 Page* page = m_frame->page(); | 778 Page* page = m_frame->page(); |
784 if (!page) | 779 if (!page) |
785 return; | 780 return; |
786 | 781 |
787 // Check if the selection contains the entire frame contents; if not, then | 782 // Check if the selection contains the entire frame contents; if not, then |
788 // there is nothing to do. | 783 // there is nothing to do. |
789 if (!isRange()) | 784 if (selectionInDOMTree().selectionTypeWithLegacyGranularity() != |
| 785 RangeSelection) { |
790 return; | 786 return; |
| 787 } |
791 | 788 |
792 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | 789 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets |
793 // needs to be audited. See http://crbug.com/590369 for more details. | 790 // needs to be audited. See http://crbug.com/590369 for more details. |
794 document().updateStyleAndLayoutIgnorePendingStylesheets(); | 791 document().updateStyleAndLayoutIgnorePendingStylesheets(); |
795 | 792 |
796 if (!isStartOfDocument(selection().visibleStart())) | 793 if (!isStartOfDocument(selection().visibleStart())) |
797 return; | 794 return; |
798 if (!isEndOfDocument(selection().visibleEnd())) | 795 if (!isEndOfDocument(selection().visibleEnd())) |
799 return; | 796 return; |
800 | 797 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 return m_selectionEditor->firstRange(); | 926 return m_selectionEditor->firstRange(); |
930 } | 927 } |
931 | 928 |
932 bool FrameSelection::isInPasswordField() const { | 929 bool FrameSelection::isInPasswordField() const { |
933 TextControlElement* textControl = enclosingTextControl(start()); | 930 TextControlElement* textControl = enclosingTextControl(start()); |
934 return isHTMLInputElement(textControl) && | 931 return isHTMLInputElement(textControl) && |
935 toHTMLInputElement(textControl)->type() == InputTypeNames::password; | 932 toHTMLInputElement(textControl)->type() == InputTypeNames::password; |
936 } | 933 } |
937 | 934 |
938 void FrameSelection::notifyAccessibilityForSelectionChange() { | 935 void FrameSelection::notifyAccessibilityForSelectionChange() { |
939 if (selection().start().isNotNull() && selection().end().isNotNull()) { | 936 if (selectionInDOMTree().isNone()) |
940 if (AXObjectCache* cache = document().existingAXObjectCache()) | 937 return; |
941 cache->selectionChanged(selection().start().computeContainerNode()); | 938 AXObjectCache* cache = document().existingAXObjectCache(); |
942 } | 939 if (!cache) |
| 940 return; |
| 941 const Position& start = selectionInDOMTree().computeStartPosition(); |
| 942 cache->selectionChanged(start.computeContainerNode()); |
943 } | 943 } |
944 | 944 |
945 void FrameSelection::notifyCompositorForSelectionChange() { | 945 void FrameSelection::notifyCompositorForSelectionChange() { |
946 if (!RuntimeEnabledFeatures::compositedSelectionUpdateEnabled()) | 946 if (!RuntimeEnabledFeatures::compositedSelectionUpdateEnabled()) |
947 return; | 947 return; |
948 | 948 |
949 scheduleVisualUpdate(); | 949 scheduleVisualUpdate(); |
950 } | 950 } |
951 | 951 |
952 void FrameSelection::notifyEventHandlerForSelectionChange() { | 952 void FrameSelection::notifyEventHandlerForSelectionChange() { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1038 } | 1038 } |
1039 | 1039 |
1040 void FrameSelection::updateAppearance() { | 1040 void FrameSelection::updateAppearance() { |
1041 DCHECK(!m_frame->contentLayoutItem().isNull()); | 1041 DCHECK(!m_frame->contentLayoutItem().isNull()); |
1042 m_frameCaret->scheduleVisualUpdateForPaintInvalidationIfNeeded(); | 1042 m_frameCaret->scheduleVisualUpdateForPaintInvalidationIfNeeded(); |
1043 m_pendingSelection->setHasPendingSelection(); | 1043 m_pendingSelection->setHasPendingSelection(); |
1044 } | 1044 } |
1045 | 1045 |
1046 void FrameSelection::notifyLayoutObjectOfSelectionChange( | 1046 void FrameSelection::notifyLayoutObjectOfSelectionChange( |
1047 EUserTriggered userTriggered) { | 1047 EUserTriggered userTriggered) { |
1048 if (TextControlElement* textControl = enclosingTextControl(start())) | 1048 TextControlElement* textControl = |
1049 textControl->selectionChanged(userTriggered == UserTriggered); | 1049 enclosingTextControl(selectionInDOMTree().base()); |
| 1050 if (!textControl) |
| 1051 return; |
| 1052 textControl->selectionChanged(userTriggered == UserTriggered); |
1050 } | 1053 } |
1051 | 1054 |
1052 // Helper function that tells whether a particular node is an element that has | 1055 // Helper function that tells whether a particular node is an element that has |
1053 // an entire LocalFrame and FrameView, a <frame>, <iframe>, or <object>. | 1056 // an entire LocalFrame and FrameView, a <frame>, <iframe>, or <object>. |
1054 static bool isFrameElement(const Node* n) { | 1057 static bool isFrameElement(const Node* n) { |
1055 if (!n) | 1058 if (!n) |
1056 return false; | 1059 return false; |
1057 LayoutObject* layoutObject = n->layoutObject(); | 1060 LayoutObject* layoutObject = n->layoutObject(); |
1058 if (!layoutObject || !layoutObject->isLayoutPart()) | 1061 if (!layoutObject || !layoutObject->isLayoutPart()) |
1059 return false; | 1062 return false; |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1407 } | 1410 } |
1408 | 1411 |
1409 void showTree(const blink::FrameSelection* sel) { | 1412 void showTree(const blink::FrameSelection* sel) { |
1410 if (sel) | 1413 if (sel) |
1411 sel->showTreeForThis(); | 1414 sel->showTreeForThis(); |
1412 else | 1415 else |
1413 LOG(INFO) << "Cannot showTree for <null> FrameSelection."; | 1416 LOG(INFO) << "Cannot showTree for <null> FrameSelection."; |
1414 } | 1417 } |
1415 | 1418 |
1416 #endif | 1419 #endif |
OLD | NEW |