| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2012 Google Inc. All rights reserved. | 3 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 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 * | 8 * |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "core/editing/EditingUtilities.h" | 40 #include "core/editing/EditingUtilities.h" |
| 41 #include "core/editing/FrameSelection.h" | 41 #include "core/editing/FrameSelection.h" |
| 42 #include "core/editing/iterators/TextIterator.h" | 42 #include "core/editing/iterators/TextIterator.h" |
| 43 #include "core/frame/LocalFrame.h" | 43 #include "core/frame/LocalFrame.h" |
| 44 #include "core/frame/UseCounter.h" | 44 #include "core/frame/UseCounter.h" |
| 45 #include "core/inspector/ConsoleMessage.h" | 45 #include "core/inspector/ConsoleMessage.h" |
| 46 #include "wtf/text/WTFString.h" | 46 #include "wtf/text/WTFString.h" |
| 47 | 47 |
| 48 namespace blink { | 48 namespace blink { |
| 49 | 49 |
| 50 static Position createPosition(Node* node, int offset) { | |
| 51 DCHECK_GE(offset, 0); | |
| 52 if (!node) | |
| 53 return Position(); | |
| 54 return Position(node, offset); | |
| 55 } | |
| 56 | |
| 57 static Node* selectionShadowAncestor(LocalFrame* frame) { | 50 static Node* selectionShadowAncestor(LocalFrame* frame) { |
| 58 Node* node = frame->selection().selection().base().anchorNode(); | 51 Node* node = frame->selection().selection().base().anchorNode(); |
| 59 if (!node) | 52 if (!node) |
| 60 return 0; | 53 return 0; |
| 61 | 54 |
| 62 if (!node->isInShadowTree()) | 55 if (!node->isInShadowTree()) |
| 63 return 0; | 56 return 0; |
| 64 | 57 |
| 65 return frame->document()->ancestorInThisScope(node); | 58 return frame->document()->ancestorInThisScope(node); |
| 66 } | 59 } |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 String::number(extentOffset) + " is not a valid extent offset."); | 285 String::number(extentOffset) + " is not a valid extent offset."); |
| 293 return; | 286 return; |
| 294 } | 287 } |
| 295 | 288 |
| 296 if (!baseNode || !extentNode) | 289 if (!baseNode || !extentNode) |
| 297 UseCounter::count(frame(), UseCounter::SelectionSetBaseAndExtentNull); | 290 UseCounter::count(frame(), UseCounter::SelectionSetBaseAndExtentNull); |
| 298 | 291 |
| 299 if (!isValidForPosition(baseNode) || !isValidForPosition(extentNode)) | 292 if (!isValidForPosition(baseNode) || !isValidForPosition(extentNode)) |
| 300 return; | 293 return; |
| 301 | 294 |
| 302 Position base = createPosition(baseNode, baseOffset); | 295 // TODO(editing-dev): The use of updateStyleAndLayoutIgnorePendingStylesheets |
| 303 Position extent = createPosition(extentNode, extentOffset); | |
| 304 const bool selectionHasDirection = true; | |
| 305 | |
| 306 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | |
| 307 // needs to be audited. See http://crbug.com/590369 for more details. | 296 // needs to be audited. See http://crbug.com/590369 for more details. |
| 308 // In the long term, we should change FrameSelection::setSelection to take a | 297 // In the long term, we should change FrameSelection::setSelection to take a |
| 309 // parameter that does not require clean layout, so that modifying selection | 298 // parameter that does not require clean layout, so that modifying selection |
| 310 // no longer performs synchronous layout by itself. | 299 // no longer performs synchronous layout by itself. |
| 300 // TODO(editing-dev): Once SVG USE element doesn't modifies DOM tree, we |
| 301 // should get rid of this update layout call. |
| 302 // See http://crbug.com/566281 |
| 303 // See "svg/text/textpath-reference-crash.html" |
| 311 frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); | 304 frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); |
| 312 | 305 |
| 313 frame()->selection().setSelection(createVisibleSelection( | 306 frame()->selection().setSelection( |
| 314 base, extent, SelDefaultAffinity, selectionHasDirection)); | 307 SelectionInDOMTree::Builder() |
| 308 .setBaseAndExtentDeprecated(Position(baseNode, baseOffset), |
| 309 Position(extentNode, extentOffset)) |
| 310 .setIsDirectional(true) |
| 311 .build()); |
| 315 } | 312 } |
| 316 | 313 |
| 317 void DOMSelection::modify(const String& alterString, | 314 void DOMSelection::modify(const String& alterString, |
| 318 const String& directionString, | 315 const String& directionString, |
| 319 const String& granularityString) { | 316 const String& granularityString) { |
| 320 if (!isAvailable()) | 317 if (!isAvailable()) |
| 321 return; | 318 return; |
| 322 | 319 |
| 323 FrameSelection::EAlteration alter; | 320 FrameSelection::EAlteration alter; |
| 324 if (equalIgnoringCase(alterString, "extend")) | 321 if (equalIgnoringCase(alterString, "extend")) |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 exceptionState.throwDOMException( | 383 exceptionState.throwDOMException( |
| 387 IndexSizeError, | 384 IndexSizeError, |
| 388 String::number(offset) + " is larger than the given node's length."); | 385 String::number(offset) + " is larger than the given node's length."); |
| 389 return; | 386 return; |
| 390 } | 387 } |
| 391 | 388 |
| 392 if (!isValidForPosition(node)) | 389 if (!isValidForPosition(node)) |
| 393 return; | 390 return; |
| 394 | 391 |
| 395 const Position& base = frame()->selection().base(); | 392 const Position& base = frame()->selection().base(); |
| 396 const Position& extent = createPosition(node, offset); | 393 if (base.isNull()) { |
| 397 const bool selectionHasDirection = true; | 394 // TODO(editing-dev): We should throw |InvalidStateError| if selection is |
| 398 | 395 // none to follow the spec. |
| 399 // TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets | 396 frame()->selection().setSelection(SelectionInDOMTree::Builder() |
| 400 // needs to be audited. See http://crbug.com/590369 for more details. | 397 .collapse(Position(node, offset)) |
| 401 // In the long term, we should change FrameSelection::setSelection to take a | 398 .setIsDirectional(true) |
| 402 // parameter that does not require clean layout, so that modifying selection | 399 .build()); |
| 403 // no longer performs synchronous layout by itself. | 400 return; |
| 404 frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets(); | 401 } |
| 405 | 402 frame()->selection().setSelection(SelectionInDOMTree::Builder() |
| 406 const VisibleSelection newSelection = createVisibleSelection( | 403 .collapse(base) |
| 407 base, extent, TextAffinity::Downstream, selectionHasDirection); | 404 .extend(Position(node, offset)) |
| 408 frame()->selection().setSelection(newSelection); | 405 .setIsDirectional(true) |
| 406 .build()); |
| 409 } | 407 } |
| 410 | 408 |
| 411 Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { | 409 Range* DOMSelection::getRangeAt(int index, ExceptionState& exceptionState) { |
| 412 if (!isAvailable()) | 410 if (!isAvailable()) |
| 413 return nullptr; | 411 return nullptr; |
| 414 | 412 |
| 415 if (index < 0 || index >= rangeCount()) { | 413 if (index < 0 || index >= rangeCount()) { |
| 416 exceptionState.throwDOMException( | 414 exceptionState.throwDOMException( |
| 417 IndexSizeError, String::number(index) + " is not a valid index."); | 415 IndexSizeError, String::number(index) + " is not a valid index."); |
| 418 return nullptr; | 416 return nullptr; |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 m_treeScope->document().addConsoleMessage( | 671 m_treeScope->document().addConsoleMessage( |
| 674 ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); | 672 ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, message)); |
| 675 } | 673 } |
| 676 | 674 |
| 677 DEFINE_TRACE(DOMSelection) { | 675 DEFINE_TRACE(DOMSelection) { |
| 678 visitor->trace(m_treeScope); | 676 visitor->trace(m_treeScope); |
| 679 DOMWindowProperty::trace(visitor); | 677 DOMWindowProperty::trace(visitor); |
| 680 } | 678 } |
| 681 | 679 |
| 682 } // namespace blink | 680 } // namespace blink |
| OLD | NEW |