OLD | NEW |
---|---|
1 /* | 1 /* |
2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) | 2 * (C) 1999-2003 Lars Knoll (knoll@kde.org) |
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. |
4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. | 4 * Copyright (C) 2011 Research In Motion Limited. All rights reserved. |
5 * Copyright (C) 2013 Intel Corporation. All rights reserved. | 5 * Copyright (C) 2013 Intel Corporation. All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
277 return indexOfShorthandForLonghand(prefixedShorthand, matchingShorthandsForL onghand(prefixingVariant)); | 277 return indexOfShorthandForLonghand(prefixedShorthand, matchingShorthandsForL onghand(prefixingVariant)); |
278 } | 278 } |
279 | 279 |
280 bool MutableStylePropertySet::setVariableValue(const AtomicString& name, const S tring& value, bool important) | 280 bool MutableStylePropertySet::setVariableValue(const AtomicString& name, const S tring& value, bool important) |
281 { | 281 { |
282 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); | 282 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); |
283 if (value.isEmpty()) | 283 if (value.isEmpty()) |
284 return removeVariable(name); | 284 return removeVariable(name); |
285 | 285 |
286 size_t index = findVariableIndex(name); | 286 size_t index = findVariableIndex(name); |
287 if (index != notFound) { | 287 if (index == notFound) { |
288 CSSValue* cssValue = m_propertyVector.at(index).value(); | 288 VariablesIterators* iterators = activeVariablesIterators(); |
289 if (iterators) { | |
esprehn
2013/09/12 01:13:42
Put the assignment in the if: if (VariablesIterato
| |
290 VariablesIterators::iterator end = iterators->end(); | |
291 for (VariablesIterators::iterator it = iterators->begin(); it != end ; ++it) | |
292 (*it)->addedVariable(name); | |
293 } | |
294 } else { | |
295 const CSSValue* cssValue = m_propertyVector.at(index).value(); | |
289 if (toCSSVariableValue(cssValue)->value() == value) | 296 if (toCSSVariableValue(cssValue)->value() == value) |
290 return false; | 297 return false; |
291 } | 298 } |
292 | 299 |
293 CSSProperty property(CSSPropertyVariable, CSSVariableValue::create(name, val ue), important); | 300 CSSProperty property(CSSPropertyVariable, CSSVariableValue::create(name, val ue), important); |
294 if (index == notFound) | 301 if (index == notFound) |
295 m_propertyVector.append(property); | 302 m_propertyVector.append(property); |
296 else | 303 else |
297 m_propertyVector.at(index) = property; | 304 m_propertyVector.at(index) = property; |
298 return true; | 305 return true; |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
545 removeProperty(propertiesToRemove[i]); | 552 removeProperty(propertiesToRemove[i]); |
546 } | 553 } |
547 | 554 |
548 bool MutableStylePropertySet::removeVariable(const AtomicString& name) | 555 bool MutableStylePropertySet::removeVariable(const AtomicString& name) |
549 { | 556 { |
550 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); | 557 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); |
551 size_t index = findVariableIndex(name); | 558 size_t index = findVariableIndex(name); |
552 if (index == notFound) | 559 if (index == notFound) |
553 return false; | 560 return false; |
554 m_propertyVector.remove(index); | 561 m_propertyVector.remove(index); |
562 VariablesIterators* iterators = activeVariablesIterators(); | |
563 if (iterators) { | |
esprehn
2013/09/12 01:13:42
Same
| |
564 VariablesIterators::iterator end = iterators->end(); | |
565 for (VariablesIterators::iterator it = iterators->begin(); it != end; ++ it) | |
566 (*it)->removedVariable(name); | |
567 } | |
555 return true; | 568 return true; |
556 } | 569 } |
557 | 570 |
558 bool MutableStylePropertySet::clearVariables() | 571 bool MutableStylePropertySet::clearVariables() |
559 { | 572 { |
560 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); | 573 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); |
561 CSSPropertyID variablesId = CSSPropertyVariable; | 574 CSSPropertyID variablesId = CSSPropertyVariable; |
562 return removePropertiesInSet(&variablesId, 1); | 575 bool removed = removePropertiesInSet(&variablesId, 1); |
576 if (removed) { | |
577 VariablesIterators* iterators = activeVariablesIterators(); | |
578 if (iterators) { | |
579 VariablesIterators::iterator end = iterators->end(); | |
580 for (VariablesIterators::iterator it = iterators->begin(); it != end ; ++it) | |
581 (*it)->clearedVariables(); | |
582 } | |
583 } | |
584 return removed; | |
585 } | |
586 | |
587 PassRefPtr<MutableStylePropertySet::VariablesIterator> MutableStylePropertySet:: VariablesIterator::create(MutableStylePropertySet* propertySet) | |
588 { | |
589 ASSERT(RuntimeEnabledFeatures::cssVariablesEnabled()); | |
590 RefPtr<VariablesIterator> iterator = adoptRef(new VariablesIterator(property Set)); | |
591 const size_t propertyCount = propertySet->propertyCount(); | |
592 size_t variableCount = 0; | |
593 iterator->m_remainingNames.resize(propertyCount); | |
594 for (int i = propertyCount; i--;) { | |
595 const PropertyReference& property = propertySet->propertyAt(i); | |
596 if (property.id() == CSSPropertyVariable) | |
597 iterator->m_remainingNames[variableCount++] = toCSSVariableValue(pro perty.value())->name(); | |
598 } | |
599 iterator->m_remainingNames.shrink(variableCount); | |
600 | |
601 MutableStylePropertySet::VariablesIteratorsMap* map = MutableStylePropertySe t::activeVariablesIteratorsMap(); | |
602 if (map->contains(propertySet)) | |
603 map->find(propertySet)->value.append(iterator); | |
604 else | |
605 map->add(propertySet, VariablesIterators()).iterator->value.append(itera tor); | |
606 | |
607 return iterator.release(); | |
608 } | |
609 | |
610 void MutableStylePropertySet::VariablesIterator::addedVariable(const AtomicStrin g& name) | |
611 { | |
612 ASSERT(!m_remainingNames.contains(name)); | |
613 ASSERT(!m_newNames.contains(name)); | |
614 m_newNames.append(name); | |
615 } | |
616 | |
617 void MutableStylePropertySet::VariablesIterator::removedVariable(const AtomicStr ing& name) | |
618 { | |
619 size_t index = m_remainingNames.find(name); | |
620 if (index != notFound) | |
621 m_remainingNames.remove(index); | |
622 index = m_newNames.find(name); | |
623 if (index != notFound) | |
624 m_newNames.remove(index); | |
625 } | |
626 | |
627 void MutableStylePropertySet::VariablesIterator::clearedVariables() | |
628 { | |
629 m_remainingNames.clear(); | |
630 m_newNames.clear(); | |
631 } | |
632 | |
633 void MutableStylePropertySet::VariablesIterator::advance() | |
634 { | |
635 if (!atEnd()) | |
636 m_remainingNames.removeLast(); | |
637 if (!m_newNames.isEmpty()) { | |
638 m_remainingNames.appendVector(m_newNames); | |
639 m_newNames.clear(); | |
640 } | |
641 } | |
642 | |
643 MutableStylePropertySet::VariablesIterator::~VariablesIterator() | |
644 { | |
645 MutableStylePropertySet::VariablesIterators& iterators = MutableStylePropert ySet::activeVariablesIteratorsMap()->find(m_propertySet.get())->value; | |
646 iterators.remove(iterators.reverseFind(this)); | |
647 } | |
648 | |
649 MutableStylePropertySet::VariablesIterators* MutableStylePropertySet::activeVari ablesIterators() | |
650 { | |
651 VariablesIteratorsMap* map = activeVariablesIteratorsMap(); | |
652 VariablesIteratorsMap::iterator it = map->find(this); | |
653 if (it == map->end()) | |
654 return 0; | |
655 return &it->value; | |
656 } | |
657 | |
658 MutableStylePropertySet::VariablesIteratorsMap* MutableStylePropertySet::activeV ariablesIteratorsMap() | |
659 { | |
660 DEFINE_STATIC_LOCAL(VariablesIteratorsMap, map, ()); | |
esprehn
2013/09/12 01:13:42
This is scary, I'd rather we didn't have any stati
alancutter (OOO until 2018)
2013/09/13 03:06:14
Moved the vector of CSSVariablesIterators to the C
| |
661 return ↦ | |
563 } | 662 } |
564 | 663 |
565 PassRefPtr<MutableStylePropertySet> StylePropertySet::mutableCopy() const | 664 PassRefPtr<MutableStylePropertySet> StylePropertySet::mutableCopy() const |
566 { | 665 { |
567 return adoptRef(new MutableStylePropertySet(*this)); | 666 return adoptRef(new MutableStylePropertySet(*this)); |
568 } | 667 } |
569 | 668 |
570 PassRefPtr<MutableStylePropertySet> StylePropertySet::copyPropertiesInSet(const Vector<CSSPropertyID>& properties) const | 669 PassRefPtr<MutableStylePropertySet> StylePropertySet::copyPropertiesInSet(const Vector<CSSPropertyID>& properties) const |
571 { | 670 { |
572 Vector<CSSProperty, 256> list; | 671 Vector<CSSProperty, 256> list; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
627 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(CSSParserMod e cssParserMode) | 726 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(CSSParserMod e cssParserMode) |
628 { | 727 { |
629 return adoptRef(new MutableStylePropertySet(cssParserMode)); | 728 return adoptRef(new MutableStylePropertySet(cssParserMode)); |
630 } | 729 } |
631 | 730 |
632 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(const CSSPro perty* properties, unsigned count) | 731 PassRefPtr<MutableStylePropertySet> MutableStylePropertySet::create(const CSSPro perty* properties, unsigned count) |
633 { | 732 { |
634 return adoptRef(new MutableStylePropertySet(properties, count)); | 733 return adoptRef(new MutableStylePropertySet(properties, count)); |
635 } | 734 } |
636 | 735 |
736 MutableStylePropertySet::~MutableStylePropertySet() | |
737 { | |
738 activeVariablesIteratorsMap()->remove(this); | |
739 } | |
740 | |
637 String StylePropertySet::PropertyReference::cssName() const | 741 String StylePropertySet::PropertyReference::cssName() const |
638 { | 742 { |
639 if (id() == CSSPropertyVariable) { | 743 if (id() == CSSPropertyVariable) { |
640 if (!propertyValue()->isVariableValue()) | 744 if (!propertyValue()->isVariableValue()) |
641 return emptyString(); // Should not happen, but if it does, avoid a bad cast. | 745 return emptyString(); // Should not happen, but if it does, avoid a bad cast. |
642 return "var-" + toCSSVariableValue(propertyValue())->name(); | 746 return "var-" + toCSSVariableValue(propertyValue())->name(); |
643 } | 747 } |
644 return getPropertyNameString(id()); | 748 return getPropertyNameString(id()); |
645 } | 749 } |
646 | 750 |
647 String StylePropertySet::PropertyReference::cssText() const | 751 String StylePropertySet::PropertyReference::cssText() const |
648 { | 752 { |
649 StringBuilder result; | 753 StringBuilder result; |
650 result.append(cssName()); | 754 result.append(cssName()); |
651 result.appendLiteral(": "); | 755 result.appendLiteral(": "); |
652 result.append(propertyValue()->cssText()); | 756 result.append(propertyValue()->cssText()); |
653 if (isImportant()) | 757 if (isImportant()) |
654 result.appendLiteral(" !important"); | 758 result.appendLiteral(" !important"); |
655 result.append(';'); | 759 result.append(';'); |
656 return result.toString(); | 760 return result.toString(); |
657 } | 761 } |
658 | 762 |
659 | 763 |
660 } // namespace WebCore | 764 } // namespace WebCore |
OLD | NEW |