Changeset 196470 in webkit


Ignore:
Timestamp:
Feb 12, 2016 7:05:12 AM (8 years ago)
Author:
Antti Koivisto
Message:

Factor class change style invalidation code into a class
https://bugs.webkit.org/show_bug.cgi?id=154163

Reviewed by Andreas Kling.

Factor this piece of functionality out of Element and into ClassChangeInvalidation class.

  • CMakeLists.txt:
  • WebCore.vcxproj/WebCore.vcxproj:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/Element.cpp:

(WebCore::classStringHasClassName):
(WebCore::Element::classAttributeChanged):
(WebCore::collectClasses): Deleted.
(WebCore::computeClassChange): Deleted.
(WebCore::invalidateStyleForClassChange): Deleted.

  • style/ClassChangeInvalidation.cpp: Added.

(WebCore::Style::ClassChangeInvalidation::computeClassChange):
(WebCore::Style::ClassChangeInvalidation::invalidateStyle):

  • style/ClassChangeInvalidation.h: Added.

(WebCore::Style::ClassChangeInvalidation::needsInvalidation):
(WebCore::Style::ClassChangeInvalidation::ClassChangeInvalidation):
(WebCore::Style::ClassChangeInvalidation::~ClassChangeInvalidation):

Location:
trunk/Source/WebCore
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/CMakeLists.txt

    r196429 r196470  
    26222622    storage/StorageNamespaceProvider.cpp
    26232623
     2624    style/ClassChangeInvalidation.cpp
    26242625    style/InlineTextBoxStyle.cpp
    26252626    style/RenderTreePosition.cpp
  • trunk/Source/WebCore/ChangeLog

    r196469 r196470  
     12016-02-12  Antti Koivisto  <antti@apple.com>
     2
     3        Factor class change style invalidation code into a class
     4        https://bugs.webkit.org/show_bug.cgi?id=154163
     5
     6        Reviewed by Andreas Kling.
     7
     8        Factor this piece of functionality out of Element and into ClassChangeInvalidation class.
     9
     10        * CMakeLists.txt:
     11        * WebCore.vcxproj/WebCore.vcxproj:
     12        * WebCore.xcodeproj/project.pbxproj:
     13        * dom/Element.cpp:
     14        (WebCore::classStringHasClassName):
     15        (WebCore::Element::classAttributeChanged):
     16        (WebCore::collectClasses): Deleted.
     17        (WebCore::computeClassChange): Deleted.
     18        (WebCore::invalidateStyleForClassChange): Deleted.
     19        * style/ClassChangeInvalidation.cpp: Added.
     20        (WebCore::Style::ClassChangeInvalidation::computeClassChange):
     21        (WebCore::Style::ClassChangeInvalidation::invalidateStyle):
     22        * style/ClassChangeInvalidation.h: Added.
     23        (WebCore::Style::ClassChangeInvalidation::needsInvalidation):
     24        (WebCore::Style::ClassChangeInvalidation::ClassChangeInvalidation):
     25        (WebCore::Style::ClassChangeInvalidation::~ClassChangeInvalidation):
     26
    1272016-02-12  Csaba Osztrogonác  <ossy@webkit.org>
    228
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r196123 r196470  
    1922619226    <ClCompile Include="..\storage\StorageMap.cpp" />
    1922719227    <ClCompile Include="..\storage\StorageNamespaceProvider.cpp" />
     19228    <ClCompile Include="..\style\ClassChangeInvalidation.cpp" />
    1922819229    <ClCompile Include="..\style\InlineTextBoxStyle.cpp" />
    1922919230    <ClCompile Include="..\style\RenderTreePosition.cpp" />
     
    2279222793    <ClInclude Include="..\storage\StorageNamespace.h" />
    2279322794    <ClInclude Include="..\storage\StorageNamespaceProvider.h" />
     22795    <ClInclude Include="..\style\ClassChangeInvalidation.h" />
    2279422796    <ClInclude Include="..\style\InlineTextBoxStyle.h" />
    2279522797    <ClInclude Include="..\style\RenderTreePosition.h" />
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r196466 r196470  
    66186618                E4A007831B820EC8002C5A6E /* DataURLDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A007821B820EC8002C5A6E /* DataURLDecoder.h */; };
    66196619                E4A007851B820ED3002C5A6E /* DataURLDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A007841B820ED3002C5A6E /* DataURLDecoder.cpp */; };
     6620                E4A814D41C6DEC4000BF85AC /* ClassChangeInvalidation.h in Headers */ = {isa = PBXBuildFile; fileRef = E4A814D31C6DEC4000BF85AC /* ClassChangeInvalidation.h */; };
     6621                E4A814D61C6DEE8D00BF85AC /* ClassChangeInvalidation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4A814D51C6DEE8D00BF85AC /* ClassChangeInvalidation.cpp */; };
    66206622                E4AE7C1617D1BB950009FB31 /* ElementIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AE7C1517D1BB950009FB31 /* ElementIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
    66216623                E4AE7C1A17D232350009FB31 /* ElementAncestorIterator.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AE7C1917D232350009FB31 /* ElementAncestorIterator.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1460214604                E4A007821B820EC8002C5A6E /* DataURLDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataURLDecoder.h; sourceTree = "<group>"; };
    1460314605                E4A007841B820ED3002C5A6E /* DataURLDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataURLDecoder.cpp; sourceTree = "<group>"; };
     14606                E4A814D31C6DEC4000BF85AC /* ClassChangeInvalidation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClassChangeInvalidation.h; sourceTree = "<group>"; };
     14607                E4A814D51C6DEE8D00BF85AC /* ClassChangeInvalidation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ClassChangeInvalidation.cpp; sourceTree = "<group>"; };
    1460414608                E4AE7C1517D1BB950009FB31 /* ElementIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElementIterator.h; sourceTree = "<group>"; };
    1460514609                E4AE7C1917D232350009FB31 /* ElementAncestorIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElementAncestorIterator.h; sourceTree = "<group>"; };
     
    2337823382                        isa = PBXGroup;
    2337923383                        children = (
     23384                                E4A814D51C6DEE8D00BF85AC /* ClassChangeInvalidation.cpp */,
     23385                                E4A814D31C6DEC4000BF85AC /* ClassChangeInvalidation.h */,
    2338023386                                1C0106FE192594DF008A4201 /* InlineTextBoxStyle.cpp */,
    2338123387                                1C0106FF192594DF008A4201 /* InlineTextBoxStyle.h */,
     
    2592925935                                C5D4AA7A116BAFB60069CA93 /* GlyphMetricsMap.h in Headers */,
    2593025936                                0873B86B136064EA00A522C2 /* GlyphPage.h in Headers */,
     25937                                E4A814D41C6DEC4000BF85AC /* ClassChangeInvalidation.h in Headers */,
    2593125938                                BC53C5F50DA56B920021EB5D /* Gradient.h in Headers */,
    2593225939                                B22279640D00BF220071B782 /* GradientAttributes.h in Headers */,
     
    3020330210                                511EF2D117F0FDF100E4FA16 /* JSIDBObjectStoreCustom.cpp in Sources */,
    3020430211                                511EF2C817F0FD3500E4FA16 /* JSIDBOpenDBRequest.cpp in Sources */,
     30212                                E4A814D61C6DEE8D00BF85AC /* ClassChangeInvalidation.cpp in Sources */,
    3020530213                                511EF2C917F0FD3500E4FA16 /* JSIDBRequest.cpp in Sources */,
    3020630214                                511EF2CA17F0FD3500E4FA16 /* JSIDBTransaction.cpp in Sources */,
  • trunk/Source/WebCore/dom/Element.cpp

    r196430 r196470  
    3232#include "Chrome.h"
    3333#include "ChromeClient.h"
     34#include "ClassChangeInvalidation.h"
    3435#include "ClientRect.h"
    3536#include "ClientRectList.h"
     
    7778#include "SelectorQuery.h"
    7879#include "Settings.h"
    79 #include "StyleInvalidationAnalysis.h"
    8080#include "StyleProperties.h"
    8181#include "StyleResolver.h"
     
    13001300}
    13011301
    1302 static Vector<AtomicStringImpl*, 4> collectClasses(const SpaceSplitString& classes)
    1303 {
    1304     Vector<AtomicStringImpl*, 4> result;
    1305     result.reserveCapacity(classes.size());
    1306     for (unsigned i = 0; i < classes.size(); ++i)
    1307         result.uncheckedAppend(classes[i].impl());
    1308     return result;
    1309 }
    1310 
    1311 struct ClassChange {
    1312     Vector<AtomicStringImpl*, 4> added;
    1313     Vector<AtomicStringImpl*, 4> removed;
    1314 };
    1315 
    1316 static ClassChange computeClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses)
    1317 {
    1318     ClassChange classChange;
    1319 
    1320     unsigned oldSize = oldClasses.size();
    1321     unsigned newSize = newClasses.size();
    1322 
    1323     if (!oldSize) {
    1324         classChange.added = collectClasses(newClasses);
    1325         return classChange;
    1326     }
    1327     if (!newSize) {
    1328         classChange.removed = collectClasses(oldClasses);
    1329         return classChange;
    1330     }
    1331 
    1332     BitVector remainingClassBits;
    1333     remainingClassBits.ensureSize(oldSize);
    1334     // Class vectors tend to be very short. This is faster than using a hash table.
    1335     for (unsigned i = 0; i < newSize; ++i) {
    1336         bool foundFromBoth = false;
    1337         for (unsigned j = 0; j < oldSize; ++j) {
    1338             if (newClasses[i] == oldClasses[j]) {
    1339                 remainingClassBits.quickSet(j);
    1340                 foundFromBoth = true;
    1341             }
    1342         }
    1343         if (foundFromBoth)
    1344             continue;
    1345         classChange.added.append(newClasses[i].impl());
    1346     }
    1347     for (unsigned i = 0; i < oldSize; ++i) {
    1348         // If the bit is not set the the corresponding class has been removed.
    1349         if (remainingClassBits.quickGet(i))
    1350             continue;
    1351         classChange.removed.append(oldClasses[i].impl());
    1352     }
    1353 
    1354     return classChange;
    1355 }
    1356 
    1357 static void invalidateStyleForClassChange(Element& element, const Vector<AtomicStringImpl*, 4>& changedClasses, const DocumentRuleSets& ruleSets)
    1358 {
    1359     Vector<AtomicStringImpl*, 4> changedClassesAffectingStyle;
    1360     for (auto* changedClass : changedClasses) {
    1361         if (ruleSets.features().classesInRules.contains(changedClass))
    1362             changedClassesAffectingStyle.append(changedClass);
    1363     };
    1364 
    1365     if (changedClassesAffectingStyle.isEmpty())
    1366         return;
    1367 
    1368     if (element.shadowRoot() && ruleSets.authorStyle()->hasShadowPseudoElementRules()) {
    1369         element.setNeedsStyleRecalc(FullStyleChange);
    1370         return;
    1371     }
    1372 
    1373     element.setNeedsStyleRecalc(InlineStyleChange);
    1374 
    1375     if (!element.firstElementChild())
    1376         return;
    1377 
    1378     for (auto* changedClass : changedClassesAffectingStyle) {
    1379         auto* ancestorClassRules = ruleSets.ancestorClassRules(changedClass);
    1380         if (!ancestorClassRules)
    1381             continue;
    1382         StyleInvalidationAnalysis invalidationAnalysis(*ancestorClassRules);
    1383         invalidationAnalysis.invalidateStyle(element);
    1384     }
    1385 }
    1386 
    13871302void Element::classAttributeChanged(const AtomicString& newClassString)
    13881303{
     
    13961311    auto oldClassNames = elementData()->classNames();
    13971312    auto newClassNames = newStringHasClasses ? SpaceSplitString(newClassString, shouldFoldCase) : SpaceSplitString();
    1398 
    1399     StyleResolver* styleResolver = document().styleResolverIfExists();
    1400     bool shouldInvalidateStyle = inRenderedDocument() && styleResolver && styleChangeType() < FullStyleChange;
    1401 
    1402     ClassChange classChange;
    1403     if (shouldInvalidateStyle) {
    1404         classChange = computeClassChange(oldClassNames, newClassNames);
    1405         if (!classChange.removed.isEmpty())
    1406             invalidateStyleForClassChange(*this, classChange.removed, styleResolver->ruleSets());
    1407     }
    1408 
    1409     elementData()->setClassNames(newClassNames);
    1410 
    1411     if (shouldInvalidateStyle) {
    1412         if (!classChange.added.isEmpty())
    1413             invalidateStyleForClassChange(*this, classChange.added, styleResolver->ruleSets());
     1313    {
     1314        Style::ClassChangeInvalidation styleInvalidation(*this, oldClassNames, newClassNames);
     1315        elementData()->setClassNames(newClassNames);
    14141316    }
    14151317
Note: See TracChangeset for help on using the changeset viewer.