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

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

Issue 1463473002: Make unicode-bidi:isolate the default for elements with dir attributes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: leviw review Created 5 years 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) 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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698