Changeset 138515 in webkit
- Timestamp:
- Dec 27, 2012, 2:57:00 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/CMakeLists.txt
r138512 r138515 1247 1247 dom/UserTypingGestureIndicator.cpp 1248 1248 dom/ViewportArguments.cpp 1249 dom/VisitedLinkState.cpp 1249 1250 dom/WebCoreMemoryInstrumentation.cpp 1250 1251 dom/WebKitAnimationEvent.cpp -
trunk/Source/WebCore/ChangeLog
r138513 r138515 1 2012-12-27 Dimitri Glazkov <dglazkov@chromium.org> 2 3 Move visited link-checking (and caching) code out of SelectorChecker. 4 https://bugs.webkit.org/show_bug.cgi?id=105752 5 6 SelectorChecker knew too much about visited links and how links are stored in DOM. This change 7 moves the code to more relevant locations and moves the visited links cache all the way up to Document, 8 introducing VisitedLinkState class to manage the state of visited links. 9 Relanding without a null-ptr ref. 10 11 Reviewed by Antti Koivisto. 12 13 No change in behavior, covered by existing tests. 14 15 * CMakeLists.txt: Added VisitedLinkState to build system. 16 * GNUmakefile.list.am: Ditto. 17 * Target.pri: Ditto. 18 * WebCore.gypi: Ditto. 19 * WebCore.xcodeproj/project.pbxproj: Ditto. 20 * css/SelectorChecker.cpp: Moved visited-link state code out to VisitedLinkState class. 21 * css/SelectorChecker.h: Ditto. 22 * css/StyleResolver.cpp: 23 (WebCore::StyleResolver::initElement): Changed callsite to use VisitedLinkState. 24 * css/StyleResolver.h: Removed plumb-throughs that are now unnecessary. 25 * dom/DOMAllInOne.cpp: Added VisitedLinkState to build system. 26 * dom/Document.cpp: Added VisitedLinkState initalizer. 27 * dom/Document.h: Added VisitedLinkState member. 28 * dom/VisitedLinkState.cpp: Added. 29 * dom/VisitedLinkState.h: Added. 30 * history/CachedPage.cpp: 31 (WebCore::CachedPage::restore): Changed callsite to use VisitedLinkState. 32 * page/Page.cpp: 33 (WebCore::Page::allVisitedStateChanged): Ditto. 34 (WebCore::Page::visitedStateChanged): Ditto. 35 1 36 2012-12-27 Kondapally Kalyan <kalyan.kondapally@intel.com> 2 37 -
trunk/Source/WebCore/GNUmakefile.list.am
r138512 r138515 2990 2990 Source/WebCore/dom/ViewportArguments.cpp \ 2991 2991 Source/WebCore/dom/ViewportArguments.h \ 2992 Source/WebCore/dom/VisitedLinkState.cpp \ 2993 Source/WebCore/dom/VisitedLinkState.h \ 2992 2994 Source/WebCore/dom/WebCoreMemoryInstrumentation.cpp \ 2993 2995 Source/WebCore/dom/WebCoreMemoryInstrumentation.h \ -
trunk/Source/WebCore/Target.pri
r138512 r138515 472 472 dom/UserTypingGestureIndicator.cpp \ 473 473 dom/ViewportArguments.cpp \ 474 dom/VisitedLinkState.cpp \ 474 475 dom/WebCoreMemoryInstrumentation.cpp \ 475 476 dom/WebKitAnimationEvent.cpp \ -
trunk/Source/WebCore/WebCore.gypi
r138512 r138515 2945 2945 'dom/UserTypingGestureIndicator.cpp', 2946 2946 'dom/ViewportArguments.cpp', 2947 'dom/VisitedLinkState.cpp', 2948 'dom/VisitedLinkState.h', 2947 2949 'dom/WebCoreMemoryInstrumentation.cpp', 2948 2950 'dom/WebCoreMemoryInstrumentation.h', -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r138512 r138515 1093 1093 418F88040FF957AE0080F045 /* JSAbstractWorker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 418F88020FF957AE0080F045 /* JSAbstractWorker.cpp */; }; 1094 1094 418F88050FF957AF0080F045 /* JSAbstractWorker.h in Headers */ = {isa = PBXBuildFile; fileRef = 418F88030FF957AE0080F045 /* JSAbstractWorker.h */; }; 1095 419BC2DE1685329900D64D6D /* VisitedLinkState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 419BC2DC1685329900D64D6D /* VisitedLinkState.cpp */; }; 1096 419BC2DF1685329900D64D6D /* VisitedLinkState.h in Headers */ = {isa = PBXBuildFile; fileRef = 419BC2DD1685329900D64D6D /* VisitedLinkState.h */; }; 1095 1097 41A3D58E101C152D00316D07 /* DedicatedWorkerThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41A3D58C101C152D00316D07 /* DedicatedWorkerThread.cpp */; }; 1096 1098 41A3D58F101C152D00316D07 /* DedicatedWorkerThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 41A3D58D101C152D00316D07 /* DedicatedWorkerThread.h */; }; … … 8327 8329 418F88020FF957AE0080F045 /* JSAbstractWorker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAbstractWorker.cpp; sourceTree = "<group>"; }; 8328 8330 418F88030FF957AE0080F045 /* JSAbstractWorker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAbstractWorker.h; sourceTree = "<group>"; }; 8331 419BC2DC1685329900D64D6D /* VisitedLinkState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VisitedLinkState.cpp; sourceTree = "<group>"; }; 8332 419BC2DD1685329900D64D6D /* VisitedLinkState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VisitedLinkState.h; sourceTree = "<group>"; }; 8329 8333 41A3D58C101C152D00316D07 /* DedicatedWorkerThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DedicatedWorkerThread.cpp; path = workers/DedicatedWorkerThread.cpp; sourceTree = "<group>"; }; 8330 8334 41A3D58D101C152D00316D07 /* DedicatedWorkerThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DedicatedWorkerThread.h; path = workers/DedicatedWorkerThread.h; sourceTree = "<group>"; }; … … 22286 22290 CEF418CC1179678C009D112C /* ViewportArguments.cpp */, 22287 22291 CEF418CD1179678C009D112C /* ViewportArguments.h */, 22292 419BC2DC1685329900D64D6D /* VisitedLinkState.cpp */, 22293 419BC2DD1685329900D64D6D /* VisitedLinkState.h */, 22288 22294 F3BFC9D215C177EC004244E5 /* WebCoreMemoryInstrumentation.cpp */, 22289 22295 4F377FF415FA356A00E5D60D /* WebCoreMemoryInstrumentation.h */, … … 25993 25999 E13EF3441684ECF40034C83F /* NetworkStorageSession.h in Headers */, 25994 26000 415071581685067300C3C7B3 /* SelectorFilter.h in Headers */, 26001 419BC2DF1685329900D64D6D /* VisitedLinkState.h in Headers */, 25995 26002 ); 25996 26003 runOnlyForDeploymentPostprocessing = 0; … … 29113 29120 E13EF34916850C470034C83F /* NetworkStorageSessionCFNet.cpp in Sources */, 29114 29121 415071571685067300C3C7B3 /* SelectorFilter.cpp in Sources */, 29122 419BC2DE1685329900D64D6D /* VisitedLinkState.cpp in Sources */, 29115 29123 ); 29116 29124 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/WebCore/css/SelectorChecker.cpp
r138512 r138515 36 36 #include "Frame.h" 37 37 #include "FrameSelection.h" 38 #include "HTMLAnchorElement.h"39 38 #include "HTMLFrameElementBase.h" 40 39 #include "HTMLInputElement.h" … … 45 44 #include "InspectorInstrumentation.h" 46 45 #include "NodeRenderStyle.h" 47 #include "NodeTraversal.h"48 46 #include "Page.h" 49 #include "PageGroup.h"50 47 #include "RenderObject.h" 51 48 #include "RenderScrollbar.h" … … 57 54 #include "StyledElement.h" 58 55 #include "Text.h" 59 #include "XLinkNames.h"60 61 #if USE(PLATFORM_STRATEGIES)62 #include "PlatformStrategies.h"63 #include "VisitedLinkStrategy.h"64 #endif65 56 66 57 namespace WebCore { … … 76 67 , m_mode(ResolvingStyle) 77 68 { 78 }79 80 static inline const AtomicString* linkAttribute(Element* element)81 {82 if (!element->isLink())83 return 0;84 if (element->isHTMLElement())85 return &element->fastGetAttribute(hrefAttr);86 if (element->isSVGElement())87 return &element->getAttribute(XLinkNames::hrefAttr);88 return 0;89 }90 91 EInsideLink SelectorChecker::determineLinkStateSlowCase(Element* element) const92 {93 ASSERT(element->isLink());94 95 const AtomicString* attribute = linkAttribute(element);96 if (!attribute || attribute->isNull())97 return NotInsideLink;98 99 // An empty href refers to the document itself which is always visited. It is useful to check this explicitly so100 // that visited links can be tested in platform independent manner, without explicit support in the test harness.101 if (attribute->isEmpty())102 return InsideVisitedLink;103 104 LinkHash hash;105 if (element->hasTagName(aTag))106 hash = static_cast<HTMLAnchorElement*>(element)->visitedLinkHash();107 else108 hash = visitedLinkHash(m_document->baseURL(), *attribute);109 110 if (!hash)111 return InsideUnvisitedLink;112 113 Frame* frame = m_document->frame();114 if (!frame)115 return InsideUnvisitedLink;116 117 Page* page = frame->page();118 if (!page)119 return InsideUnvisitedLink;120 121 m_linksCheckedForVisitedState.add(hash);122 123 #if USE(PLATFORM_STRATEGIES)124 return platformStrategies()->visitedLinkStrategy()->isLinkVisited(page, hash, m_document->baseURL(), *attribute) ? InsideVisitedLink : InsideUnvisitedLink;125 #else126 return page->group().isLinkVisited(hash) ? InsideVisitedLink : InsideUnvisitedLink;127 #endif128 69 } 129 70 … … 1102 1043 } 1103 1044 1104 void SelectorChecker::allVisitedStateChanged()1105 {1106 if (m_linksCheckedForVisitedState.isEmpty())1107 return;1108 for (Element* element = ElementTraversal::firstWithin(m_document); element; element = ElementTraversal::next(element)) {1109 if (element->isLink())1110 element->setNeedsStyleRecalc();1111 }1112 }1113 1114 void SelectorChecker::visitedStateChanged(LinkHash visitedHash)1115 {1116 if (!m_linksCheckedForVisitedState.contains(visitedHash))1117 return;1118 for (Element* element = ElementTraversal::firstWithin(m_document); element; element = ElementTraversal::next(element)) {1119 LinkHash hash = 0;1120 if (element->hasTagName(aTag))1121 hash = static_cast<HTMLAnchorElement*>(element)->visitedLinkHash();1122 else if (const AtomicString* attr = linkAttribute(element))1123 hash = visitedLinkHash(m_document->baseURL(), *attr);1124 if (hash == visitedHash)1125 element->setNeedsStyleRecalc();1126 }1127 }1128 1129 1045 bool SelectorChecker::commonPseudoClassSelectorMatches(const Element* element, const CSSSelector* selector, VisitedMatchType visitedMatchType) const 1130 1046 { -
trunk/Source/WebCore/css/SelectorChecker.h
r138512 r138515 32 32 #include "CSSSelector.h" 33 33 #include "InspectorInstrumentation.h" 34 #include "LinkHash.h"35 #include "RenderStyleConstants.h"36 34 #include "SpaceSplitString.h" 37 35 #include "StyledElement.h" … … 89 87 bool fastCheckSelector(const CSSSelector*, const Element*) const; 90 88 91 EInsideLink determineLinkState(Element*) const;92 void allVisitedStateChanged();93 void visitedStateChanged(LinkHash visitedHash);94 95 89 Document* document() const { return m_document; } 96 90 bool strictParsing() const { return m_strictParsing; } … … 116 110 bool commonPseudoClassSelectorMatches(const Element*, const CSSSelector*, VisitedMatchType) const; 117 111 118 EInsideLink determineLinkStateSlowCase(Element*) const;119 120 112 Document* m_document; 121 113 bool m_strictParsing; 122 114 bool m_documentIsHTML; 123 115 Mode m_mode; 124 mutable HashSet<LinkHash, LinkHashHash> m_linksCheckedForVisitedState;125 116 }; 126 127 inline EInsideLink SelectorChecker::determineLinkState(Element* element) const128 {129 if (!element || !element->isLink())130 return NotInsideLink;131 return determineLinkStateSlowCase(element);132 }133 117 134 118 inline bool SelectorChecker::isCommonPseudoClassSelector(const CSSSelector* selector) -
trunk/Source/WebCore/css/StyleResolver.cpp
r138512 r138515 89 89 #include "NodeRenderingContext.h" 90 90 #include "Page.h" 91 #include "PageGroup.h"92 91 #include "Pair.h" 93 92 #include "PerspectiveTransformOperation.h" … … 125 124 #include "UserAgentStyleSheets.h" 126 125 #include "ViewportStyleResolver.h" 126 #include "VisitedLinkState.h" 127 127 #include "WebCoreMemoryInstrumentation.h" 128 128 #include "WebKitCSSKeyframeRule.h" … … 965 965 m_element = e; 966 966 m_styledElement = m_element && m_element->isStyledElement() ? static_cast<StyledElement*>(m_element) : 0; 967 m_elementLinkState = m_checker.d etermineLinkState(m_element);967 m_elementLinkState = m_checker.document()->visitedLinkState()->determineLinkState(m_element); 968 968 if (e && e == e->document()->documentElement()) { 969 969 e->document()->setDirectionSetOnDocumentElement(false); -
trunk/Source/WebCore/css/StyleResolver.h
r138512 r138515 264 264 bool affectedByViewportChange() const; 265 265 266 void allVisitedStateChanged() { m_checker.allVisitedStateChanged(); }267 void visitedStateChanged(LinkHash visitedHash) { m_checker.visitedStateChanged(visitedHash); }268 269 266 void addKeyframeStyle(PassRefPtr<StyleRuleKeyframes>); 270 267 -
trunk/Source/WebCore/dom/DOMAllInOne.cpp
r138512 r138515 150 150 #include "UserTypingGestureIndicator.cpp" 151 151 #include "ViewportArguments.cpp" 152 #include "VisitedLinkState.cpp" 152 153 #include "WebKitAnimationEvent.cpp" 153 154 #include "WebKitNamedFlow.cpp" -
trunk/Source/WebCore/dom/Document.cpp
r138512 r138515 162 162 #include "UserActionElementSet.h" 163 163 #include "UserContentURLPattern.h" 164 #include "VisitedLinkState.h" 164 165 #include "WebCoreMemoryInstrumentation.h" 165 166 #include "WebKitNamedFlow.h" … … 450 451 #endif 451 452 , m_styleSheetCollection(DocumentStyleSheetCollection::create(this)) 453 , m_visitedLinkState(VisitedLinkState::create(this)) 452 454 , m_readyState(Complete) 453 455 , m_styleRecalcTimer(this, &Document::styleRecalcTimerFired) -
trunk/Source/WebCore/dom/Document.h
r138512 r138515 141 141 class TextResourceDecoder; 142 142 class TreeWalker; 143 class VisitedLinkState; 143 144 class WebKitNamedFlow; 144 145 class XMLHttpRequest; … … 673 674 void resetVisitedLinkColor(); 674 675 void resetActiveLinkColor(); 675 676 VisitedLinkState* visitedLinkState() const { return m_visitedLinkState.get(); } 677 676 678 MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const LayoutPoint&, const PlatformMouseEvent&); 677 679 … … 1366 1368 Color m_visitedLinkColor; 1367 1369 Color m_activeLinkColor; 1370 OwnPtr<VisitedLinkState> m_visitedLinkState; 1368 1371 1369 1372 bool m_loadingSheet; -
trunk/Source/WebCore/history/CachedPage.cpp
r138512 r138515 34 34 #include "Node.h" 35 35 #include "Page.h" 36 #include " StyleResolver.h"36 #include "VisitedLinkState.h" 37 37 #include <wtf/CurrentTime.h> 38 38 #include <wtf/RefCountedLeakCounter.h> … … 88 88 89 89 if (m_needStyleRecalcForVisitedLinks) { 90 for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) { 91 if (StyleResolver* styleResolver = frame->document()->styleResolver()) 92 styleResolver->allVisitedStateChanged(); 93 } 90 for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) 91 frame->document()->visitedLinkState()->invalidateStyleForAllLinks(); 94 92 } 95 93 -
trunk/Source/WebCore/page/Page.cpp
r138512 r138515 70 70 #include "StorageArea.h" 71 71 #include "StorageNamespace.h" 72 #include "StyleResolver.h"73 72 #include "TextResourceDecoder.h" 73 #include "VisitedLinkState.h" 74 74 #include "VoidCallback.h" 75 75 #include "WebCoreMemoryInstrumentation.h" … … 941 941 if (page->m_group != group) 942 942 continue; 943 for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree()->traverseNext()) { 944 if (StyleResolver* styleResolver = frame->document()->styleResolver()) 945 styleResolver->allVisitedStateChanged(); 946 } 947 } 948 } 949 950 void Page::visitedStateChanged(PageGroup* group, LinkHash visitedLinkHash) 943 for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree()->traverseNext()) 944 frame->document()->visitedLinkState()->invalidateStyleForAllLinks(); 945 } 946 } 947 948 void Page::visitedStateChanged(PageGroup* group, LinkHash linkHash) 951 949 { 952 950 ASSERT(group); … … 959 957 if (page->m_group != group) 960 958 continue; 961 for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree()->traverseNext()) { 962 if (StyleResolver* styleResolver = frame->document()->styleResolver()) 963 styleResolver->visitedStateChanged(visitedLinkHash); 964 } 959 for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree()->traverseNext()) 960 frame->document()->visitedLinkState()->invalidateStyleForLink(linkHash); 965 961 } 966 962 }
Note:
See TracChangeset
for help on using the changeset viewer.