OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2009 Apple Computer, Inc. | 2 * Copyright (C) 2007, 2008, 2009 Apple Computer, Inc. |
3 * Copyright (C) 2010, 2011 Google Inc. All rights reserved. | 3 * Copyright (C) 2010, 2011 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 * 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 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
550 bool EditingStyle::textDirection(WritingDirection& writingDirection) const | 550 bool EditingStyle::textDirection(WritingDirection& writingDirection) const |
551 { | 551 { |
552 if (!m_mutableStyle) | 552 if (!m_mutableStyle) |
553 return false; | 553 return false; |
554 | 554 |
555 RefPtrWillBeRawPtr<CSSValue> unicodeBidi = m_mutableStyle->getPropertyCSSVal
ue(CSSPropertyUnicodeBidi); | 555 RefPtrWillBeRawPtr<CSSValue> unicodeBidi = m_mutableStyle->getPropertyCSSVal
ue(CSSPropertyUnicodeBidi); |
556 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) | 556 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) |
557 return false; | 557 return false; |
558 | 558 |
559 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi.get())->getVal
ueID(); | 559 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi.get())->getVal
ueID(); |
560 if (unicodeBidiValue == CSSValueEmbed) { | 560 if (isEmbedOrIsolate(unicodeBidiValue)) { |
561 RefPtrWillBeRawPtr<CSSValue> direction = m_mutableStyle->getPropertyCSSV
alue(CSSPropertyDirection); | 561 RefPtrWillBeRawPtr<CSSValue> direction = m_mutableStyle->getPropertyCSSV
alue(CSSPropertyDirection); |
562 if (!direction || !direction->isPrimitiveValue()) | 562 if (!direction || !direction->isPrimitiveValue()) |
563 return false; | 563 return false; |
564 | 564 |
565 writingDirection = toCSSPrimitiveValue(direction.get())->getValueID() ==
CSSValueLtr ? LeftToRightWritingDirection : RightToLeftWritingDirection; | 565 writingDirection = toCSSPrimitiveValue(direction.get())->getValueID() ==
CSSValueLtr ? LeftToRightWritingDirection : RightToLeftWritingDirection; |
566 | 566 |
567 return true; | 567 return true; |
568 } | 568 } |
569 | 569 |
570 if (unicodeBidiValue == CSSValueNormal) { | 570 if (unicodeBidiValue == CSSValueNormal) { |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 blockProperties->m_mutableStyle = m_mutableStyle->copyPropertiesInSet(blockP
ropertiesVector()); | 642 blockProperties->m_mutableStyle = m_mutableStyle->copyPropertiesInSet(blockP
ropertiesVector()); |
643 removeBlockProperties(); | 643 removeBlockProperties(); |
644 | 644 |
645 return blockProperties; | 645 return blockProperties; |
646 } | 646 } |
647 | 647 |
648 PassRefPtrWillBeRawPtr<EditingStyle> EditingStyle::extractAndRemoveTextDirection
() | 648 PassRefPtrWillBeRawPtr<EditingStyle> EditingStyle::extractAndRemoveTextDirection
() |
649 { | 649 { |
650 RefPtrWillBeRawPtr<EditingStyle> textDirection = EditingStyle::create(); | 650 RefPtrWillBeRawPtr<EditingStyle> textDirection = EditingStyle::create(); |
651 textDirection->m_mutableStyle = MutableStylePropertySet::create(HTMLQuirksMo
de); | 651 textDirection->m_mutableStyle = MutableStylePropertySet::create(HTMLQuirksMo
de); |
652 textDirection->m_mutableStyle->setProperty(CSSPropertyUnicodeBidi, CSSValueE
mbed, m_mutableStyle->propertyIsImportant(CSSPropertyUnicodeBidi)); | 652 textDirection->m_mutableStyle->setProperty(CSSPropertyUnicodeBidi, CSSValueI
solate, m_mutableStyle->propertyIsImportant(CSSPropertyUnicodeBidi)); |
653 textDirection->m_mutableStyle->setProperty(CSSPropertyDirection, m_mutableSt
yle->getPropertyValue(CSSPropertyDirection), | 653 textDirection->m_mutableStyle->setProperty(CSSPropertyDirection, m_mutableSt
yle->getPropertyValue(CSSPropertyDirection), |
654 m_mutableStyle->propertyIsImportant(CSSPropertyDirection)); | 654 m_mutableStyle->propertyIsImportant(CSSPropertyDirection)); |
655 | 655 |
656 m_mutableStyle->removeProperty(CSSPropertyUnicodeBidi); | 656 m_mutableStyle->removeProperty(CSSPropertyUnicodeBidi); |
657 m_mutableStyle->removeProperty(CSSPropertyDirection); | 657 m_mutableStyle->removeProperty(CSSPropertyDirection); |
658 | 658 |
659 return textDirection; | 659 return textDirection; |
660 } | 660 } |
661 | 661 |
662 void EditingStyle::removeBlockProperties() | 662 void EditingStyle::removeBlockProperties() |
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1339 // and find the background color of the common ancestor. | 1339 // and find the background color of the common ancestor. |
1340 if (shouldUseBackgroundColorInEffect && (selection.isRange() || hasTranspare
ntBackgroundColor(style->m_mutableStyle.get()))) { | 1340 if (shouldUseBackgroundColorInEffect && (selection.isRange() || hasTranspare
ntBackgroundColor(style->m_mutableStyle.get()))) { |
1341 const EphemeralRange range(selection.toNormalizedEphemeralRange()); | 1341 const EphemeralRange range(selection.toNormalizedEphemeralRange()); |
1342 if (PassRefPtrWillBeRawPtr<CSSValue> value = backgroundColorValueInEffec
t(Range::commonAncestorContainer(range.startPosition().computeContainerNode(), r
ange.endPosition().computeContainerNode()))) | 1342 if (PassRefPtrWillBeRawPtr<CSSValue> value = backgroundColorValueInEffec
t(Range::commonAncestorContainer(range.startPosition().computeContainerNode(), r
ange.endPosition().computeContainerNode()))) |
1343 style->setProperty(CSSPropertyBackgroundColor, value->cssText()); | 1343 style->setProperty(CSSPropertyBackgroundColor, value->cssText()); |
1344 } | 1344 } |
1345 | 1345 |
1346 return style; | 1346 return style; |
1347 } | 1347 } |
1348 | 1348 |
| 1349 static bool isUnicodeBidiNestedOrMultipleEmbeddings(CSSValueID valueID) |
| 1350 { |
| 1351 return valueID == CSSValueEmbed || valueID == CSSValueBidiOverride |
| 1352 || valueID == CSSValueWebkitIsolate || valueID == CSSValueWebkitIsolateO
verride || valueID == CSSValueWebkitPlaintext |
| 1353 || valueID == CSSValueIsolate || valueID == CSSValueIsolateOverride || v
alueID == CSSValuePlaintext; |
| 1354 } |
| 1355 |
1349 WritingDirection EditingStyle::textDirectionForSelection(const VisibleSelection&
selection, EditingStyle* typingStyle, bool& hasNestedOrMultipleEmbeddings) | 1356 WritingDirection EditingStyle::textDirectionForSelection(const VisibleSelection&
selection, EditingStyle* typingStyle, bool& hasNestedOrMultipleEmbeddings) |
1350 { | 1357 { |
1351 hasNestedOrMultipleEmbeddings = true; | 1358 hasNestedOrMultipleEmbeddings = true; |
1352 | 1359 |
1353 if (selection.isNone()) | 1360 if (selection.isNone()) |
1354 return NaturalWritingDirection; | 1361 return NaturalWritingDirection; |
1355 | 1362 |
1356 Position position = mostForwardCaretPosition(selection.start()); | 1363 Position position = mostForwardCaretPosition(selection.start()); |
1357 | 1364 |
1358 Node* node = position.anchorNode(); | 1365 Node* node = position.anchorNode(); |
1359 if (!node) | 1366 if (!node) |
1360 return NaturalWritingDirection; | 1367 return NaturalWritingDirection; |
1361 | 1368 |
1362 Position end; | 1369 Position end; |
1363 if (selection.isRange()) { | 1370 if (selection.isRange()) { |
1364 end = mostBackwardCaretPosition(selection.end()); | 1371 end = mostBackwardCaretPosition(selection.end()); |
1365 | 1372 |
1366 ASSERT(end.document()); | 1373 ASSERT(end.document()); |
1367 Node* pastLast = Range::create(*end.document(), position.parentAnchoredE
quivalent(), end.parentAnchoredEquivalent())->pastLastNode(); | 1374 Node* pastLast = Range::create(*end.document(), position.parentAnchoredE
quivalent(), end.parentAnchoredEquivalent())->pastLastNode(); |
1368 for (Node* n = node; n && n != pastLast; n = NodeTraversal::next(*n)) { | 1375 for (Node* n = node; n && n != pastLast; n = NodeTraversal::next(*n)) { |
1369 if (!n->isStyledElement()) | 1376 if (!n->isStyledElement()) |
1370 continue; | 1377 continue; |
1371 | 1378 |
1372 RefPtrWillBeRawPtr<CSSComputedStyleDeclaration> style = CSSComputedS
tyleDeclaration::create(n); | 1379 RefPtrWillBeRawPtr<CSSComputedStyleDeclaration> style = CSSComputedS
tyleDeclaration::create(n); |
1373 RefPtrWillBeRawPtr<CSSValue> unicodeBidi = style->getPropertyCSSValu
e(CSSPropertyUnicodeBidi); | 1380 RefPtrWillBeRawPtr<CSSValue> unicodeBidi = style->getPropertyCSSValu
e(CSSPropertyUnicodeBidi); |
1374 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) | 1381 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) |
1375 continue; | 1382 continue; |
1376 | 1383 |
1377 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi.get())
->getValueID(); | 1384 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi.get())
->getValueID(); |
1378 if (unicodeBidiValue == CSSValueEmbed || unicodeBidiValue == CSSValu
eBidiOverride) | 1385 if (isUnicodeBidiNestedOrMultipleEmbeddings(unicodeBidiValue)) |
1379 return NaturalWritingDirection; | 1386 return NaturalWritingDirection; |
1380 } | 1387 } |
1381 } | 1388 } |
1382 | 1389 |
1383 if (selection.isCaret()) { | 1390 if (selection.isCaret()) { |
1384 WritingDirection direction; | 1391 WritingDirection direction; |
1385 if (typingStyle && typingStyle->textDirection(direction)) { | 1392 if (typingStyle && typingStyle->textDirection(direction)) { |
1386 hasNestedOrMultipleEmbeddings = false; | 1393 hasNestedOrMultipleEmbeddings = false; |
1387 return direction; | 1394 return direction; |
1388 } | 1395 } |
(...skipping 15 matching lines...) Expand all Loading... |
1404 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) | 1411 if (!unicodeBidi || !unicodeBidi->isPrimitiveValue()) |
1405 continue; | 1412 continue; |
1406 | 1413 |
1407 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi.get())->ge
tValueID(); | 1414 CSSValueID unicodeBidiValue = toCSSPrimitiveValue(unicodeBidi.get())->ge
tValueID(); |
1408 if (unicodeBidiValue == CSSValueNormal) | 1415 if (unicodeBidiValue == CSSValueNormal) |
1409 continue; | 1416 continue; |
1410 | 1417 |
1411 if (unicodeBidiValue == CSSValueBidiOverride) | 1418 if (unicodeBidiValue == CSSValueBidiOverride) |
1412 return NaturalWritingDirection; | 1419 return NaturalWritingDirection; |
1413 | 1420 |
1414 ASSERT(unicodeBidiValue == CSSValueEmbed); | 1421 ASSERT(isEmbedOrIsolate(unicodeBidiValue)); |
1415 RefPtrWillBeRawPtr<CSSValue> direction = style->getPropertyCSSValue(CSSP
ropertyDirection); | 1422 RefPtrWillBeRawPtr<CSSValue> direction = style->getPropertyCSSValue(CSSP
ropertyDirection); |
1416 if (!direction || !direction->isPrimitiveValue()) | 1423 if (!direction || !direction->isPrimitiveValue()) |
1417 continue; | 1424 continue; |
1418 | 1425 |
1419 int directionValue = toCSSPrimitiveValue(direction.get())->getValueID(); | 1426 int directionValue = toCSSPrimitiveValue(direction.get())->getValueID(); |
1420 if (directionValue != CSSValueLtr && directionValue != CSSValueRtl) | 1427 if (directionValue != CSSValueLtr && directionValue != CSSValueRtl) |
1421 continue; | 1428 continue; |
1422 | 1429 |
1423 if (foundDirection != NaturalWritingDirection) | 1430 if (foundDirection != NaturalWritingDirection) |
1424 return NaturalWritingDirection; | 1431 return NaturalWritingDirection; |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 { | 1725 { |
1719 for (Node* ancestor = node; ancestor; ancestor = ancestor->parentNode()) { | 1726 for (Node* ancestor = node; ancestor; ancestor = ancestor->parentNode()) { |
1720 RefPtrWillBeRawPtr<CSSComputedStyleDeclaration> ancestorStyle = CSSCompu
tedStyleDeclaration::create(ancestor); | 1727 RefPtrWillBeRawPtr<CSSComputedStyleDeclaration> ancestorStyle = CSSCompu
tedStyleDeclaration::create(ancestor); |
1721 if (!hasTransparentBackgroundColor(ancestorStyle.get())) | 1728 if (!hasTransparentBackgroundColor(ancestorStyle.get())) |
1722 return ancestorStyle->getPropertyCSSValue(CSSPropertyBackgroundColor
); | 1729 return ancestorStyle->getPropertyCSSValue(CSSPropertyBackgroundColor
); |
1723 } | 1730 } |
1724 return nullptr; | 1731 return nullptr; |
1725 } | 1732 } |
1726 | 1733 |
1727 } | 1734 } |
OLD | NEW |