Streamline icon-related code, mostly unused
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 5 Apr 2015 01:01:49 +0000 (01:01 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 5 Apr 2015 01:01:49 +0000 (01:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=143306

Reviewed by Antti Koivisto.

Source/WebCore:

I started on this path because Document::iconURLs had a poor implementation,
storing results in a data member with no benefit, using HTMLCollection for
iteration of the children of the head element instead of using the simpler
faster technique we use inside the engine. Then, I discovered this function was
mostly-unused code left over from before the Blink fork. I removed most of it.
We can add this back later if someone finds a use for it, but if we do we
should do a higher quality implementation without the quirks of the old one.

Refactoring also made it clear that logic isn't exactly sensible. There's a
set of rules about what order to return the list in that is not followed by
the code that tries to find the "default touch icon". Later we could add some
more test coverage and tighten up the logic. But the reality is that at this
time, with some small exceptions, icon logic is in the web browsers, not in WebKit.

* CMakeLists.txt: Removed IconURL.cpp.
* WebCore.vcxproj/WebCore.vcxproj: Ditto.
* WebCore.vcxproj/WebCore.vcxproj.filters: Ditto.
* WebCore.xcodeproj/project.pbxproj: Ditto.
* dom/DOMAllInOne.cpp: Ditto.

* dom/Document.cpp:
(WebCore::Document::evaluate): Tweaked formatting.
(WebCore::Document::shortcutIconURLs): Removed. Unused function.
(WebCore::Document::iconURLs): Removed. Moved code to IconController.
(WebCore::Document::addIconURL): Removed. Moved code to LinkLoader.

* dom/Document.h: Removed shortcutIconURLs, iconURLs, addIconURL,
and m_iconURLs.

* dom/IconURL.cpp: Removed.
* dom/IconURL.h: Removed everything from this header except for the
IconType enum. Added a FIXME about possibly renaming the header.

* html/HTMLLinkElement.cpp:
(WebCore::HTMLLinkElement::HTMLLinkElement): Pass a reference when creating
the link loading.
(WebCore::HTMLLinkElement::setDisabledState): Access members of the struct
LinkRelElement without "m_" prefix.
(WebCore::HTMLLinkElement::parseAttribute): Changed to use early return style,
and made the part of this for parsing title use a more normal idiom.
(WebCore::HTMLLinkElement::process): Removed many unneeded arguments, made the
logic of the code a little easier to follow.
(WebCore::HTMLLinkElement::removedFrom): Removed a call to a function that had
an empty body.
(WebCore::HTMLLinkElement::iconType): Updated for change to LinkRelElement.
(WebCore::HTMLLinkElement::addSubresourceAttributeURLs): Ditto.
* html/HTMLLinkElement.h: More of the same.

* html/LinkRelAttribute.cpp:
(WebCore::LinkRelAttribute::LinkRelAttribute): Initialize data members in the
struct itself. Got rid of "m_" prefix since this is a struct, not a class.
Changed code to use modern for loop; even better would be to eliminate the
splitting into a vector entirely and use StringView (do that next time).
* html/LinkRelAttribute.h: See above.

* html/parser/HTMLPreloadScanner.cpp:
(WebCore::TokenPreloadScanner::StartTagScanner::relAttributeIsStyleSheet):
Updated for chnages to LinkRelAttribute and give the local variable a clearer name.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::didChangeIcons): Removed.
* loader/FrameLoader.h: Removed didChangeIcons.

* loader/FrameLoaderClient.h: Added include for String since it's no longer
taken care of by IconURLs.h.

* loader/LinkLoader.cpp:
(WebCore::LinkLoader::LinkLoader): Take a reference instead of a pointer.
(WebCore::LinkLoader::linkLoadTimerFired): Use m_client reference instead of pointer.
(WebCore::LinkLoader::linkLoadingErrorTimerFired): Ditto.
(WebCore::LinkLoader::notifyFinished): Use nullptr.
(WebCore::LinkLoader::loadLink): Tweak formatting. Move the dispatchDidChangeIcons
call in here instead of going through Document to FrameLoader and then FrameLoader to
FrameLoaderClient, and passing extra unused arguments, the way the old code did.
Use a reference instead of a pointer for the document.
(WebCore::LinkLoader::released): Removed. Empty function.

* loader/LinkLoader.h: Changed constructor argument to be a reference. Made more
things private. Removed empty released function.

* loader/icon/IconController.cpp:
(WebCore::IconController::IconController): Moved initialization of data members to
the class definition in the header.
(WebCore::iconsFromLinkElements): Added. This function replaces the existing
Document::iconURLs function, but has a simpler implementation and interface.
It focuses on exactly what the code in this file needs. If we want to add some
more features to the icon controller we might make this more complex again.
Even now, building a vector is not necessarily helpful; the only client of this
function ends up extracting only one of the URLs this function returns.
(WebCore::IconController::url): Rewrote this. It's the only function actually
using the icon URLs. This contains a combination of the logic from the various
functions in this class before, including iconURL, urlsForTypes, appendToIconURLs,
and defaultURL. Among other improvements, replaced the unusual code to construct
the icon URL with a call to Document::completeURL.
(WebCore::IconController::startLoader): Refactored a bit to remove a local variable.
(WebCore::IconController::continueLoadWithDecision): Ditto.

* loader/icon/IconController.h: Removed unneeded includes, unneeded use of
WTF_MAKE_NONCOPYABLE (since classes with data members of reference type are
automatically noncopyable), unused fucntions. Also initialize m_waitingForLoadDecision.

* testing/Internals.cpp:
(WebCore::Internals::iconURLs): Removed.
(WebCore::Internals::shortcutIconURLs): Left this in place since it is used by
tests. Changed it to return the actual value from the IconController::url function,
since that's the interface to our icon machinery that is actually exposed on some
platforms. That means this returns only a single URL.
(WebCore::Internals::allIconURLs): Removed.
* testing/Internals.h: Removed allIconURLs and iconURLs.
* testing/Internals.idl: Removed allIconURLs.

LayoutTests:

* fast/dom/icon-url-list-apple-touch-expected.txt: Removed.
* fast/dom/icon-url-list-apple-touch.html: Removed. This tested code that was
not actually used in any WebKit port.

* fast/dom/icon-url-list.html: Updated to expect only a single icon URL;
the icon machinery in WebKit doesn't return arrays at this time. It's better to
test what we actually expose.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@182351 268f45cc-cd09-0410-ab3c-d52691b4dbfc

29 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/icon-url-list-apple-touch-expected.txt [deleted file]
LayoutTests/fast/dom/icon-url-list-apple-touch.html [deleted file]
LayoutTests/fast/dom/icon-url-list.html
Source/WebCore/CMakeLists.txt
Source/WebCore/ChangeLog
Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/dom/DOMAllInOne.cpp
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/Document.h
Source/WebCore/dom/IconURL.cpp [deleted file]
Source/WebCore/dom/IconURL.h
Source/WebCore/html/HTMLLinkElement.cpp
Source/WebCore/html/HTMLLinkElement.h
Source/WebCore/html/LinkRelAttribute.cpp
Source/WebCore/html/LinkRelAttribute.h
Source/WebCore/html/parser/HTMLPreloadScanner.cpp
Source/WebCore/loader/FrameLoader.cpp
Source/WebCore/loader/FrameLoader.h
Source/WebCore/loader/FrameLoaderClient.h
Source/WebCore/loader/LinkLoader.cpp
Source/WebCore/loader/LinkLoader.h
Source/WebCore/loader/icon/IconController.cpp
Source/WebCore/loader/icon/IconController.h
Source/WebCore/testing/Internals.cpp
Source/WebCore/testing/Internals.h
Source/WebCore/testing/Internals.idl

index 594823f..192b7e7 100644 (file)
@@ -1,3 +1,18 @@
+2015-04-02  Darin Adler  <darin@apple.com>
+
+        Streamline icon-related code, mostly unused
+        https://bugs.webkit.org/show_bug.cgi?id=143306
+
+        Reviewed by Antti Koivisto.
+
+        * fast/dom/icon-url-list-apple-touch-expected.txt: Removed.
+        * fast/dom/icon-url-list-apple-touch.html: Removed. This tested code that was
+        not actually used in any WebKit port.
+
+        * fast/dom/icon-url-list.html: Updated to expect only a single icon URL;
+        the icon machinery in WebKit doesn't return arrays at this time. It's better to
+        test what we actually expose.
+
 2015-04-04  Simon Fraser  <simon.fraser@apple.com>
 
         Crash under Document::absoluteRegionForEventTargets on build.webkit.org/dashboard
diff --git a/LayoutTests/fast/dom/icon-url-list-apple-touch-expected.txt b/LayoutTests/fast/dom/icon-url-list-apple-touch-expected.txt
deleted file mode 100644 (file)
index 77442f0..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-Tests that all favicons and touch icons (if ENABLE(TOUCH_ICON_LOADING)) are in document.iconURLs()
-http://test.com/oldfavicon.ico
-
diff --git a/LayoutTests/fast/dom/icon-url-list-apple-touch.html b/LayoutTests/fast/dom/icon-url-list-apple-touch.html
deleted file mode 100644 (file)
index 76dc62a..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<html>
-<head>
-<title>Original Title</title>
-<link rel="shortcut icon" type="image/x-icon" href="http://test.com/oldfavicon.ico"/>
-<link rel="apple-touch-icon" type="image/png" href="http://test.com/i/touch.png"/>
-<link rel="apple-touch-icon-precomposed" type="image/png" href="http://test.com/i/touch-precomposed.png"/>
-<script src="../../resources/js-test-pre.js"></script>
-<script>
-function runTests() {
-    if (window.testRunner)
-        testRunner.dumpAsText();
-
-    debug('Tests that all favicons and touch icons (if ENABLE(TOUCH_ICON_LOADING)) are in document.iconURLs()');
-
-    // Fetch the actual list of icon URLs.
-    var actualURLs = window.internals.allIconURLs();
-
-    // Print out the URL list in the document to match it against the expected list.
-    // Note that the expected order is reverse to ensure that icons seen later
-    // take precedence as required by the spec.
-    for (var i = 0; i < actualURLs.length; i++)
-        debug(actualURLs[i]);
-}
-</script>
-</head>
-<body onload='runTests();'>
-</body>
-</html>
index 06cd961..8debf07 100644 (file)
@@ -49,10 +49,13 @@ function runTests() {
     var expectedURL1 = "http://test.com/foofavicon.ico";
     var expectedURL2 = "http://test.com/newfavicon.ico";
     var iconURLs = window.internals.shortcutIconURLs();
-    if (expectedURL0 == iconURLs[0] && expectedURL1 == iconURLs[1] && expectedURL2 == iconURLs[2]) 
+    // Expect the array to contain only the last URL because that's what WebKit icon controller provides,
+    // despite the fact that the internals API returns it as an array. We can change this to check for
+    // all three if we add "array of icon URLs" support to WebKit.
+    if (iconURLs.length === 1 && expectedURL2 === iconURLs[0])
         testPassed('URL list matches expected');
     else
-        testFailed('URL list does not match expected');
+        testFailed('URL list does not match expected: length = ' + iconURLs.length + ', URL=' + iconURLs[0]);
 }
 
 </script>
index 5fc6215..98dfd89 100644 (file)
@@ -1385,7 +1385,6 @@ set(WebCore_SOURCES
     dom/ExceptionCodePlaceholder.cpp
     dom/FocusEvent.cpp
     dom/GenericEventQueue.cpp
-    dom/IconURL.cpp
     dom/IdTargetObserver.cpp
     dom/IdTargetObserverRegistry.cpp
     dom/InlineStyleSheetOwner.cpp
index 28d2490..698fac1 100644 (file)
@@ -1,3 +1,121 @@
+2015-04-02  Darin Adler  <darin@apple.com>
+
+        Streamline icon-related code, mostly unused
+        https://bugs.webkit.org/show_bug.cgi?id=143306
+
+        Reviewed by Antti Koivisto.
+
+        I started on this path because Document::iconURLs had a poor implementation,
+        storing results in a data member with no benefit, using HTMLCollection for
+        iteration of the children of the head element instead of using the simpler
+        faster technique we use inside the engine. Then, I discovered this function was
+        mostly-unused code left over from before the Blink fork. I removed most of it.
+        We can add this back later if someone finds a use for it, but if we do we
+        should do a higher quality implementation without the quirks of the old one.
+
+        Refactoring also made it clear that logic isn't exactly sensible. There's a
+        set of rules about what order to return the list in that is not followed by
+        the code that tries to find the "default touch icon". Later we could add some
+        more test coverage and tighten up the logic. But the reality is that at this
+        time, with some small exceptions, icon logic is in the web browsers, not in WebKit.
+
+        * CMakeLists.txt: Removed IconURL.cpp.
+        * WebCore.vcxproj/WebCore.vcxproj: Ditto.
+        * WebCore.vcxproj/WebCore.vcxproj.filters: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * dom/DOMAllInOne.cpp: Ditto.
+
+        * dom/Document.cpp:
+        (WebCore::Document::evaluate): Tweaked formatting.
+        (WebCore::Document::shortcutIconURLs): Removed. Unused function.
+        (WebCore::Document::iconURLs): Removed. Moved code to IconController.
+        (WebCore::Document::addIconURL): Removed. Moved code to LinkLoader.
+
+        * dom/Document.h: Removed shortcutIconURLs, iconURLs, addIconURL,
+        and m_iconURLs.
+
+        * dom/IconURL.cpp: Removed.
+        * dom/IconURL.h: Removed everything from this header except for the
+        IconType enum. Added a FIXME about possibly renaming the header.
+
+        * html/HTMLLinkElement.cpp:
+        (WebCore::HTMLLinkElement::HTMLLinkElement): Pass a reference when creating
+        the link loading.
+        (WebCore::HTMLLinkElement::setDisabledState): Access members of the struct
+        LinkRelElement without "m_" prefix.
+        (WebCore::HTMLLinkElement::parseAttribute): Changed to use early return style,
+        and made the part of this for parsing title use a more normal idiom.
+        (WebCore::HTMLLinkElement::process): Removed many unneeded arguments, made the
+        logic of the code a little easier to follow.
+        (WebCore::HTMLLinkElement::removedFrom): Removed a call to a function that had
+        an empty body.
+        (WebCore::HTMLLinkElement::iconType): Updated for change to LinkRelElement.
+        (WebCore::HTMLLinkElement::addSubresourceAttributeURLs): Ditto.
+        * html/HTMLLinkElement.h: More of the same.
+
+        * html/LinkRelAttribute.cpp:
+        (WebCore::LinkRelAttribute::LinkRelAttribute): Initialize data members in the
+        struct itself. Got rid of "m_" prefix since this is a struct, not a class.
+        Changed code to use modern for loop; even better would be to eliminate the
+        splitting into a vector entirely and use StringView (do that next time).
+        * html/LinkRelAttribute.h: See above.
+
+        * html/parser/HTMLPreloadScanner.cpp:
+        (WebCore::TokenPreloadScanner::StartTagScanner::relAttributeIsStyleSheet):
+        Updated for chnages to LinkRelAttribute and give the local variable a clearer name.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::didChangeIcons): Removed.
+        * loader/FrameLoader.h: Removed didChangeIcons.
+
+        * loader/FrameLoaderClient.h: Added include for String since it's no longer
+        taken care of by IconURLs.h.
+
+        * loader/LinkLoader.cpp:
+        (WebCore::LinkLoader::LinkLoader): Take a reference instead of a pointer.
+        (WebCore::LinkLoader::linkLoadTimerFired): Use m_client reference instead of pointer.
+        (WebCore::LinkLoader::linkLoadingErrorTimerFired): Ditto.
+        (WebCore::LinkLoader::notifyFinished): Use nullptr.
+        (WebCore::LinkLoader::loadLink): Tweak formatting. Move the dispatchDidChangeIcons
+        call in here instead of going through Document to FrameLoader and then FrameLoader to
+        FrameLoaderClient, and passing extra unused arguments, the way the old code did.
+        Use a reference instead of a pointer for the document.
+        (WebCore::LinkLoader::released): Removed. Empty function.
+
+        * loader/LinkLoader.h: Changed constructor argument to be a reference. Made more
+        things private. Removed empty released function.
+
+        * loader/icon/IconController.cpp:
+        (WebCore::IconController::IconController): Moved initialization of data members to
+        the class definition in the header.
+        (WebCore::iconsFromLinkElements): Added. This function replaces the existing
+        Document::iconURLs function, but has a simpler implementation and interface.
+        It focuses on exactly what the code in this file needs. If we want to add some
+        more features to the icon controller we might make this more complex again.
+        Even now, building a vector is not necessarily helpful; the only client of this
+        function ends up extracting only one of the URLs this function returns.
+        (WebCore::IconController::url): Rewrote this. It's the only function actually
+        using the icon URLs. This contains a combination of the logic from the various
+        functions in this class before, including iconURL, urlsForTypes, appendToIconURLs,
+        and defaultURL. Among other improvements, replaced the unusual code to construct
+        the icon URL with a call to Document::completeURL.
+        (WebCore::IconController::startLoader): Refactored a bit to remove a local variable.
+        (WebCore::IconController::continueLoadWithDecision): Ditto.
+
+        * loader/icon/IconController.h: Removed unneeded includes, unneeded use of
+        WTF_MAKE_NONCOPYABLE (since classes with data members of reference type are
+        automatically noncopyable), unused fucntions. Also initialize m_waitingForLoadDecision.
+
+        * testing/Internals.cpp:
+        (WebCore::Internals::iconURLs): Removed.
+        (WebCore::Internals::shortcutIconURLs): Left this in place since it is used by
+        tests. Changed it to return the actual value from the IconController::url function,
+        since that's the interface to our icon machinery that is actually exposed on some
+        platforms. That means this returns only a single URL.
+        (WebCore::Internals::allIconURLs): Removed.
+        * testing/Internals.h: Removed allIconURLs and iconURLs.
+        * testing/Internals.idl: Removed allIconURLs.
+
 2015-04-04  Simon Fraser  <simon.fraser@apple.com>
 
         Fix EFL and Gtk build.
index e50ee6a..decdd53 100644 (file)
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
     </ClCompile>
     <ClCompile Include="..\dom\GenericEventQueue.cpp" />
-    <ClCompile Include="..\dom\IconURL.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
-    </ClCompile>
     <ClCompile Include="..\dom\IdTargetObserver.cpp">
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
index 5679ab9..bc0a666 100644 (file)
     <ClCompile Include="..\dom\GenericEventQueue.cpp">
       <Filter>dom</Filter>
     </ClCompile>
-    <ClCompile Include="..\dom\IconURL.cpp">
-      <Filter>dom</Filter>
-    </ClCompile>
     <ClCompile Include="..\dom\IdTargetObserver.cpp">
       <Filter>dom</Filter>
     </ClCompile>
index 0ee6c54..bef9ab0 100644 (file)
                44DEF6431A6FF92700D45EEC /* IOReturnSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 44DEF6421A6FF92700D45EEC /* IOReturnSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
                44DFF6431A6FF92700D45EEC /* IOSurfaceSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 44DFF6421A6FF92700D45EEC /* IOSurfaceSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
                44EFF6431A6FF92700D45EEC /* IOTypesSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 44EFF6421A6FF92700D45EEC /* IOTypesSPI.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               45099C411370A7800058D513 /* IconURL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45099C401370A7800058D513 /* IconURL.cpp */; };
                450CEBF015073BBE002BB149 /* LabelableElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 450CEBEE15073BBE002BB149 /* LabelableElement.cpp */; };
                450CEBF115073BBE002BB149 /* LabelableElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 450CEBEF15073BBE002BB149 /* LabelableElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
                4512502215DCE37D002F84E2 /* SpinButtonElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4512502015DCE37D002F84E2 /* SpinButtonElement.cpp */; };
                44DEF6421A6FF92700D45EEC /* IOReturnSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IOReturnSPI.h; sourceTree = "<group>"; };
                44DFF6421A6FF92700D45EEC /* IOSurfaceSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IOSurfaceSPI.h; sourceTree = "<group>"; };
                44EFF6421A6FF92700D45EEC /* IOTypesSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IOTypesSPI.h; sourceTree = "<group>"; };
-               45099C401370A7800058D513 /* IconURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IconURL.cpp; sourceTree = "<group>"; };
                450CEBEE15073BBE002BB149 /* LabelableElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LabelableElement.cpp; sourceTree = "<group>"; };
                450CEBEF15073BBE002BB149 /* LabelableElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelableElement.h; sourceTree = "<group>"; };
                4512502015DCE37D002F84E2 /* SpinButtonElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpinButtonElement.cpp; sourceTree = "<group>"; };
                                0720B09F14D3323500642955 /* GenericEventQueue.h */,
                                2442BBF81194C9D300D49469 /* HashChangeEvent.h */,
                                8482B7441198C32E00BFB005 /* HashChangeEvent.idl */,
-                               45099C401370A7800058D513 /* IconURL.cpp */,
                                45BAC2AF1360BBAB005DA258 /* IconURL.h */,
                                C3CF17A015B0063F00276D39 /* IdTargetObserver.cpp */,
                                C3CF17A115B0063F00276D39 /* IdTargetObserver.h */,
                                513F14530AB634C400094DDF /* IconLoader.cpp in Sources */,
                                B275358E0B053A66002CE64F /* IconMac.mm in Sources */,
                                51E1ECC00C91C90400DC255B /* IconRecord.cpp in Sources */,
-                               45099C411370A7800058D513 /* IconURL.cpp in Sources */,
                                51D719B9181106E00016DC51 /* IDBAny.cpp in Sources */,
                                C585A66211D4FAC5004C3E4B /* IDBBindingUtilities.cpp in Sources */,
                                51D719BF181106E00016DC51 /* IDBCursor.cpp in Sources */,
index dee35e6..3e7394f 100644 (file)
@@ -81,7 +81,6 @@
 #include "ExceptionBase.cpp"
 #include "ExceptionCodePlaceholder.cpp"
 #include "FocusEvent.cpp"
-#include "IconURL.cpp"
 #include "IdTargetObserver.cpp"
 #include "IdTargetObserverRegistry.cpp"
 #include "InlineStyleSheetOwner.cpp"
index 04a406f..2424b75 100644 (file)
@@ -4810,64 +4810,13 @@ RefPtr<XPathNSResolver> Document::createNSResolver(Node* nodeResolver)
     return m_xpathEvaluator->createNSResolver(nodeResolver);
 }
 
-RefPtr<XPathResult> Document::evaluate(const String& expression,
-                                           Node* contextNode,
-                                           XPathNSResolver* resolver,
-                                           unsigned short type,
-                                           XPathResult* result,
-                                           ExceptionCode& ec)
+RefPtr<XPathResult> Document::evaluate(const String& expression, Node* contextNode, XPathNSResolver* resolver, unsigned short type, XPathResult* result, ExceptionCode& ec)
 {
     if (!m_xpathEvaluator)
         m_xpathEvaluator = XPathEvaluator::create();
     return m_xpathEvaluator->evaluate(expression, contextNode, resolver, type, result, ec);
 }
 
-const Vector<IconURL>& Document::shortcutIconURLs()
-{
-    // Include any icons where type = link, rel = "shortcut icon".
-    return iconURLs(Favicon);
-}
-
-const Vector<IconURL>& Document::iconURLs(int iconTypesMask)
-{
-    m_iconURLs.clear();
-
-    if (!head())
-        return m_iconURLs;
-
-    Ref<HTMLCollection> children = head()->children();
-    unsigned int length = children->length();
-    for (unsigned int i = 0; i < length; ++i) {
-        Node* child = children->item(i);
-        if (!is<HTMLLinkElement>(*child))
-            continue;
-        HTMLLinkElement& linkElement = downcast<HTMLLinkElement>(*child);
-        if (!(linkElement.iconType() & iconTypesMask))
-            continue;
-        if (linkElement.href().isEmpty())
-            continue;
-
-        // Put it at the front to ensure that icons seen later take precedence as required by the spec.
-        IconURL newURL(linkElement.href(), linkElement.iconSizes(), linkElement.type(), linkElement.iconType());
-        m_iconURLs.append(newURL);
-    }
-
-    m_iconURLs.reverse();
-    return m_iconURLs;
-}
-
-void Document::addIconURL(const String& url, const String&, const String&, IconType iconType)
-{
-    if (url.isEmpty())
-        return;
-
-    Frame* f = frame();
-    if (!f)
-        return;
-
-    f->loader().didChangeIcons(iconType);
-}
-
 void Document::initSecurityContext()
 {
     if (haveInitializedSecurityOrigin()) {
index a7e6631..5b644c0 100644 (file)
@@ -36,7 +36,6 @@
 #include "DocumentTiming.h"
 #include "FocusDirection.h"
 #include "FontSelector.h"
-#include "IconURL.h"
 #include "MutationObserver.h"
 #include "PageVisibilityState.h"
 #include "PlatformScreen.h"
@@ -931,10 +930,6 @@ public:
     bool hasNodesWithPlaceholderStyle() const { return m_hasNodesWithPlaceholderStyle; }
     void setHasNodesWithPlaceholderStyle() { m_hasNodesWithPlaceholderStyle = true; }
 
-    WEBCORE_EXPORT const Vector<IconURL>& shortcutIconURLs();
-    WEBCORE_EXPORT const Vector<IconURL>& iconURLs(int iconTypesMask);
-    void addIconURL(const String& url, const String& mimeType, const String& size, IconType);
-
     void updateFocusAppearanceSoon(bool restorePreviousSelection);
     void cancelFocusAppearanceUpdate();
 
@@ -1503,7 +1498,6 @@ private:
 
     bool m_createRenderers;
     bool m_inPageCache;
-    Vector<IconURL> m_iconURLs;
 
     HashSet<Element*> m_documentSuspensionCallbackElements;
     HashSet<Element*> m_mediaVolumeCallbackElements;
diff --git a/Source/WebCore/dom/IconURL.cpp b/Source/WebCore/dom/IconURL.cpp
deleted file mode 100644 (file)
index 646f6c5..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2011 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "IconURL.h"
-
-namespace WebCore {
-
-IconURL IconURL::defaultIconURL(const URL& url, IconType type)
-{
-    IconURL result(url, emptyString(), emptyString(), type);
-    result.m_isDefaultIcon = true;
-    return result;
-}
-
-bool operator==(const IconURL& lhs, const IconURL& rhs)
-{
-    return lhs.m_iconType == rhs.m_iconType
-           && lhs.m_isDefaultIcon == rhs.m_isDefaultIcon
-           && lhs.m_iconURL == rhs.m_iconURL
-           && lhs.m_sizes == rhs.m_sizes
-           && lhs.m_mimeType == rhs.m_mimeType;
-}
-
-}
-
index 7916ae0..7f7f5c7 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011 Google Inc. All rights reserved.
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
 #ifndef IconURL_h
 #define IconURL_h
 
-#include "URL.h"
+// FIXME: Rename this header to IconType.h unless we bring back the concept of an "icon URL" structure.
 
 namespace WebCore {
 
-#if ENABLE(TOUCH_ICON_LOADING)
-#define ICON_COUNT 3
-#else
-#define ICON_COUNT 1
-#endif
-
 enum IconType {
     InvalidIcon = 0,
     Favicon = 1,
@@ -48,35 +43,6 @@ enum IconType {
     TouchPrecomposedIcon = 1 << 2,
 };
 
-struct IconURL {
-    IconType m_iconType;
-    String m_sizes;
-    String m_mimeType;
-    URL m_iconURL;
-    bool m_isDefaultIcon;
-
-    IconURL()
-        : m_iconType(InvalidIcon)
-        , m_isDefaultIcon(false)
-    {
-    }
-
-    IconURL(const URL& url, const String& sizes, const String& mimeType, IconType type)
-        : m_iconType(type)
-        , m_sizes(sizes)
-        , m_mimeType(mimeType)
-        , m_iconURL(url)
-        , m_isDefaultIcon(false)
-    {
-    }
-    
-    static IconURL defaultIconURL(const URL&, IconType);
-};
-
-bool operator==(const IconURL&, const IconURL&);
-
-typedef Vector<IconURL, ICON_COUNT> IconURLs;
-
 }
 
 #endif // IconURL_h
index b1ebafd..2b2f4c1 100644 (file)
@@ -68,7 +68,7 @@ static LinkEventSender& linkLoadEventSender()
 
 inline HTMLLinkElement::HTMLLinkElement(const QualifiedName& tagName, Document& document, bool createdByParser)
     : HTMLElement(tagName, document)
-    , m_linkLoader(this)
+    , m_linkLoader(*this)
     , m_sizes(DOMSettableTokenList::create())
     , m_disabledState(Unset)
     , m_loading(false)
@@ -113,7 +113,7 @@ void HTMLLinkElement::setDisabledState(bool disabled)
                 removePendingSheet();
 
             // Check #2: An alternate sheet becomes enabled while it is still loading.
-            if (m_relAttribute.m_isAlternate && m_disabledState == EnabledViaScript)
+            if (m_relAttribute.isAlternate && m_disabledState == EnabledViaScript)
                 addPendingSheet(ActiveSheet);
 
             // Check #3: A main sheet becomes enabled while it was still loading and
@@ -121,7 +121,7 @@ void HTMLLinkElement::setDisabledState(bool disabled)
             // happen (a double toggle for no reason essentially). This happens on
             // virtualplastic.net, which manages to do about 12 enable/disables on only 3
             // sheets. :)
-            if (!m_relAttribute.m_isAlternate && m_disabledState == EnabledViaScript && oldDisabledState == Disabled)
+            if (!m_relAttribute.isAlternate && m_disabledState == EnabledViaScript && oldDisabledState == Disabled)
                 addPendingSheet(ActiveSheet);
 
             // If the sheet is already loading just bail.
@@ -143,33 +143,46 @@ void HTMLLinkElement::parseAttribute(const QualifiedName& name, const AtomicStri
         if (m_relList)
             m_relList->updateRelAttribute(value);
         process();
-    } else if (name == hrefAttr) {
+        return;
+    }
+    if (name == hrefAttr) {
         bool wasLink = isLink();
         setIsLink(!value.isNull() && !shouldProhibitLinks(this));
         if (wasLink != isLink())
             setNeedsStyleRecalc();
         process();
-    } else if (name == typeAttr) {
+        return;
+    }
+    if (name == typeAttr) {
         m_type = value;
         process();
-    } else if (name == sizesAttr) {
+        return;
+    }
+    if (name == sizesAttr) {
         setSizes(value);
         process();
-    } else if (name == mediaAttr) {
+        return;
+    }
+    if (name == mediaAttr) {
         m_media = value.string().lower();
         process();
-    } else if (name == disabledAttr)
+        return;
+    }
+    if (name == disabledAttr) {
         setDisabledState(!value.isNull());
-    else {
-        if (name == titleAttr && m_sheet)
+        return;
+    }
+    if (name == titleAttr) {
+        if (m_sheet)
             m_sheet->setTitle(value);
-        HTMLElement::parseAttribute(name, value);
+        return;
     }
+    HTMLElement::parseAttribute(name, value);
 }
 
 bool HTMLLinkElement::shouldLoadLink()
 {
-    Ref<Document> originalDocument(document());
+    Ref<Document> originalDocument = document();
     if (!dispatchBeforeLoadEvent(getNonEmptyURLAttribute(hrefAttr)))
         return false;
     // A beforeload handler might have removed us from the document or changed the document.
@@ -185,17 +198,15 @@ void HTMLLinkElement::process()
         return;
     }
 
-    String type = m_type.lower();
     URL url = getNonEmptyURLAttribute(hrefAttr);
 
-    if (!m_linkLoader.loadLink(m_relAttribute, type, m_sizes->toString(), url, &document()))
+    if (!m_linkLoader.loadLink(m_relAttribute, url, document()))
         return;
 
-    bool acceptIfTypeContainsTextCSS = document().page() && document().page()->settings().treatsAnyTextCSSLinkAsStylesheet();
+    bool treatAsStyleSheet = m_relAttribute.isStyleSheet
+        || (document().settings() && document().settings()->treatsAnyTextCSSLinkAsStylesheet() && m_type.containsIgnoringASCIICase("text/css"));
 
-    if (m_disabledState != Disabled && (m_relAttribute.m_isStyleSheet || (acceptIfTypeContainsTextCSS && type.contains("text/css")))
-        && document().frame() && url.isValid()) {
-        
+    if (m_disabledState != Disabled && treatAsStyleSheet && document().frame() && url.isValid()) {
         AtomicString charset = fastGetAttribute(charsetAttr);
         if (charset.isEmpty() && document().frame())
             charset = document().charset();
@@ -278,8 +289,6 @@ void HTMLLinkElement::removedFrom(ContainerNode& insertionPoint)
     if (!insertionPoint.inDocument())
         return;
 
-    m_linkLoader.released();
-
     if (m_isInShadowTree) {
         ASSERT(!m_sheet);
         return;
@@ -456,7 +465,7 @@ const AtomicString& HTMLLinkElement::type() const
 
 IconType HTMLLinkElement::iconType() const
 {
-    return m_relAttribute.m_iconType;
+    return m_relAttribute.iconType;
 }
 
 String HTMLLinkElement::iconSizes() const
@@ -469,10 +478,10 @@ void HTMLLinkElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
     HTMLElement::addSubresourceAttributeURLs(urls);
 
     // Favicons are handled by a special case in LegacyWebArchive::create()
-    if (m_relAttribute.m_iconType != InvalidIcon)
+    if (m_relAttribute.iconType != InvalidIcon)
         return;
 
-    if (!m_relAttribute.m_isStyleSheet)
+    if (!m_relAttribute.isStyleSheet)
         return;
     
     // Append the URL of this link element.
index c47fff1..a667352 100644 (file)
@@ -29,7 +29,6 @@
 #include "CachedResourceHandle.h"
 #include "DOMSettableTokenList.h"
 #include "HTMLElement.h"
-#include "IconURL.h"
 #include "LinkLoader.h"
 #include "LinkLoaderClient.h"
 #include "LinkRelAttribute.h"
@@ -94,7 +93,7 @@ private:
     virtual void linkLoaded() override;
     virtual void linkLoadingErrored() override;
 
-    bool isAlternate() const { return m_disabledState == Unset && m_relAttribute.m_isAlternate; }
+    bool isAlternate() const { return m_disabledState == Unset && m_relAttribute.isAlternate; }
     
     void setDisabledState(bool);
 
index 712e370..ae70c62 100644 (file)
 #include "config.h"
 #include "LinkRelAttribute.h"
 
+#include <wtf/text/WTFString.h>
+
 namespace WebCore {
 
 LinkRelAttribute::LinkRelAttribute()
-    : m_isStyleSheet(false)
-    , m_iconType(InvalidIcon)
-    , m_isAlternate(false)
-    , m_isDNSPrefetch(false)
-#if ENABLE(LINK_PREFETCH)
-    , m_isLinkPrefetch(false)
-    , m_isLinkSubresource(false)
-#endif
 {
 }
 
 LinkRelAttribute::LinkRelAttribute(const String& rel)
-    : m_isStyleSheet(false)
-    , m_iconType(InvalidIcon)
-    , m_isAlternate(false)
-    , m_isDNSPrefetch(false)
-#if ENABLE(LINK_PREFETCH)
-    , m_isLinkPrefetch(false)
-    , m_isLinkSubresource(false)
-#endif
 {
     if (equalIgnoringCase(rel, "stylesheet"))
-        m_isStyleSheet = true;
+        isStyleSheet = true;
     else if (equalIgnoringCase(rel, "icon") || equalIgnoringCase(rel, "shortcut icon"))
-        m_iconType = Favicon;
+        iconType = Favicon;
 #if ENABLE(TOUCH_ICON_LOADING)
     else if (equalIgnoringCase(rel, "apple-touch-icon"))
-        m_iconType = TouchIcon;
+        iconType = TouchIcon;
     else if (equalIgnoringCase(rel, "apple-touch-icon-precomposed"))
-        m_iconType = TouchPrecomposedIcon;
+        iconType = TouchPrecomposedIcon;
 #endif
     else if (equalIgnoringCase(rel, "dns-prefetch"))
-        m_isDNSPrefetch = true;
+        isDNSPrefetch = true;
     else if (equalIgnoringCase(rel, "alternate stylesheet") || equalIgnoringCase(rel, "stylesheet alternate")) {
-        m_isStyleSheet = true;
-        m_isAlternate = true;
+        isStyleSheet = true;
+        isAlternate = true;
     } else {
         // Tokenize the rel attribute and set bits based on specific keywords that we find.
         String relCopy = rel;
         relCopy.replace('\n', ' ');
         Vector<String> list;
         relCopy.split(' ', list);
-        Vector<String>::const_iterator end = list.end();
-        for (Vector<String>::const_iterator it = list.begin(); it != end; ++it) {
-            if (equalIgnoringCase(*it, "stylesheet"))
-                m_isStyleSheet = true;
-            else if (equalIgnoringCase(*it, "alternate"))
-                m_isAlternate = true;
-            else if (equalIgnoringCase(*it, "icon"))
-                m_iconType = Favicon;
+        for (auto& word : list) {
+            if (equalIgnoringCase(word, "stylesheet"))
+                isStyleSheet = true;
+            else if (equalIgnoringCase(word, "alternate"))
+                isAlternate = true;
+            else if (equalIgnoringCase(word, "icon"))
+                iconType = Favicon;
 #if ENABLE(TOUCH_ICON_LOADING)
-            else if (equalIgnoringCase(*it, "apple-touch-icon"))
-                m_iconType = TouchIcon;
-            else if (equalIgnoringCase(*it, "apple-touch-icon-precomposed"))
-                m_iconType = TouchPrecomposedIcon;
+            else if (equalIgnoringCase(word, "apple-touch-icon"))
+                iconType = TouchIcon;
+            else if (equalIgnoringCase(word, "apple-touch-icon-precomposed"))
+                iconType = TouchPrecomposedIcon;
 #endif
 #if ENABLE(LINK_PREFETCH)
-            else if (equalIgnoringCase(*it, "prefetch"))
-              m_isLinkPrefetch = true;
-            else if (equalIgnoringCase(*it, "subresource"))
-              m_isLinkSubresource = true;
+            else if (equalIgnoringCase(word, "prefetch"))
+                isLinkPrefetch = true;
+            else if (equalIgnoringCase(word, "subresource"))
+                isLinkSubresource = true;
 #endif
         }
     }
index fd6fabf..8635814 100644 (file)
 #define LinkRelAttribute_h
 
 #include "IconURL.h"
+#include <wtf/Forward.h>
 
 namespace WebCore {
 
 struct LinkRelAttribute {
-public:
-    bool m_isStyleSheet;
-    IconType m_iconType;
-    bool m_isAlternate;
-    bool m_isDNSPrefetch;
+    bool isStyleSheet { false };
+    IconType iconType { InvalidIcon };
+    bool isAlternate { false };
+    bool isDNSPrefetch { false };
 #if ENABLE(LINK_PREFETCH)
-    bool m_isLinkPrefetch;
-    bool m_isLinkSubresource;
+    bool isLinkPrefetch { false };
+    bool isLinkSubresource { false };
 #endif
 
     LinkRelAttribute();
     explicit LinkRelAttribute(const String&);
 };
-    
+
 }
 
 #endif
-
index 086a8c0..00242b8 100644 (file)
@@ -171,8 +171,8 @@ private:
 
     static bool relAttributeIsStyleSheet(const String& attributeValue)
     {
-        LinkRelAttribute rel(attributeValue);
-        return rel.m_isStyleSheet && !rel.m_isAlternate && rel.m_iconType == InvalidIcon && !rel.m_isDNSPrefetch;
+        LinkRelAttribute parsedAttribute { attributeValue };
+        return parsedAttribute.isStyleSheet && !parsedAttribute.isAlternate && parsedAttribute.iconType == InvalidIcon && !parsedAttribute.isDNSPrefetch;
     }
 
     void setUrlToLoad(const String& value, bool allowReplacement = false)
index 105c82c..354ea15 100644 (file)
@@ -3347,11 +3347,6 @@ void FrameLoader::didChangeTitle(DocumentLoader* loader)
 #endif
 }
 
-void FrameLoader::didChangeIcons(IconType type)
-{
-    m_client.dispatchDidChangeIcons(type);
-}
-
 void FrameLoader::dispatchDidCommitLoad()
 {
     if (m_stateMachine.creatingInitialEmptyDocument())
index 838a397..cc2bd7c 100644 (file)
@@ -178,7 +178,6 @@ public:
     bool subframeIsLoading() const;
     void willChangeTitle(DocumentLoader*);
     void didChangeTitle(DocumentLoader*);
-    void didChangeIcons(IconType);
 
     bool shouldTreatURLAsSrcdocDocument(const URL&) const;
 
index 29f8bc0..09c2249 100644 (file)
@@ -37,6 +37,7 @@
 #include <functional>
 #include <wtf/Forward.h>
 #include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
 
 #if ENABLE(CONTENT_FILTERING)
 #include "ContentFilterUnblockHandler.h"
index c6d02f4..fd9f13d 100644 (file)
@@ -40,6 +40,7 @@
 #include "DNS.h"
 #include "Document.h"
 #include "Frame.h"
+#include "FrameLoaderClient.h"
 #include "FrameView.h"
 #include "LinkRelAttribute.h"
 #include "Settings.h"
@@ -47,7 +48,7 @@
 
 namespace WebCore {
 
-LinkLoader::LinkLoader(LinkLoaderClient* client)
+LinkLoader::LinkLoader(LinkLoaderClient& client)
     : m_client(client)
     , m_linkLoadTimer(*this, &LinkLoader::linkLoadTimerFired)
     , m_linkLoadingErrorTimer(*this, &LinkLoader::linkLoadingErrorTimerFired)
@@ -62,12 +63,12 @@ LinkLoader::~LinkLoader()
 
 void LinkLoader::linkLoadTimerFired()
 {
-    m_client->linkLoaded();
+    m_client.linkLoaded();
 }
 
 void LinkLoader::linkLoadingErrorTimerFired()
 {
-    m_client->linkLoadingErrored();
+    m_client.linkLoadingErrored();
 }
 
 void LinkLoader::notifyFinished(CachedResource* resource)
@@ -80,21 +81,21 @@ void LinkLoader::notifyFinished(CachedResource* resource)
         m_linkLoadTimer.startOneShot(0);
 
     m_cachedLinkResource->removeClient(this);
-    m_cachedLinkResource = 0;
+    m_cachedLinkResource = nullptr;
 }
 
-bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const String& type,
-                          const String& sizes, const URL& href, Document* document)
+bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const URL& href, Document& document)
 {
     // We'll record this URL per document, even if we later only use it in top level frames
-    if (relAttribute.m_iconType != InvalidIcon && href.isValid() && !href.isEmpty()) {
-        if (!m_client->shouldLoadLink()) 
+    if (relAttribute.iconType != InvalidIcon && href.isValid() && !href.isEmpty()) {
+        if (!m_client.shouldLoadLink())
             return false;
-        document->addIconURL(href.string(), type, sizes, relAttribute.m_iconType);
+        if (Frame* frame = document.frame())
+            frame->loader().client().dispatchDidChangeIcons(relAttribute.iconType);
     }
 
-    if (relAttribute.m_isDNSPrefetch) {
-        Settings* settings = document->settings();
+    if (relAttribute.isDNSPrefetch) {
+        Settings* settings = document.settings();
         // FIXME: The href attribute of the link element can be in "//hostname" form, and we shouldn't attempt
         // to complete that as URL <https://bugs.webkit.org/show_bug.cgi?id=48857>.
         if (settings && settings->dnsPrefetchingEnabled() && href.isValid() && !href.isEmpty())
@@ -102,24 +103,25 @@ bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const String& ty
     }
 
 #if ENABLE(LINK_PREFETCH)
-    if ((relAttribute.m_isLinkPrefetch || relAttribute.m_isLinkSubresource) && href.isValid() && document->frame()) {
-        if (!m_client->shouldLoadLink())
+    if ((relAttribute.isLinkPrefetch || relAttribute.isLinkSubresource) && href.isValid() && document.frame()) {
+        if (!m_client.shouldLoadLink())
             return false;
+
         Optional<ResourceLoadPriority> priority;
         CachedResource::Type type = CachedResource::LinkPrefetch;
-        // We only make one request to the cachedresourcelodaer if multiple rel types are
-        // specified, 
-        if (relAttribute.m_isLinkSubresource) {
+        if (relAttribute.isLinkSubresource) {
+            // We only make one request to the cached resource loader if multiple rel types are specified;
+            // this is the higher priority, which should overwrite the lower priority.
             priority = ResourceLoadPriorityLow;
             type = CachedResource::LinkSubresource;
         }
-        CachedResourceRequest linkRequest(ResourceRequest(document->completeURL(href)), priority);
-        
+        CachedResourceRequest linkRequest(ResourceRequest(document.completeURL(href)), priority);
+
         if (m_cachedLinkResource) {
             m_cachedLinkResource->removeClient(this);
             m_cachedLinkResource = nullptr;
         }
-        m_cachedLinkResource = document->cachedResourceLoader().requestLinkResource(type, linkRequest);
+        m_cachedLinkResource = document.cachedResourceLoader().requestLinkResource(type, linkRequest);
         if (m_cachedLinkResource)
             m_cachedLinkResource->addClient(this);
     }
@@ -128,8 +130,4 @@ bool LinkLoader::loadLink(const LinkRelAttribute& relAttribute, const String& ty
     return true;
 }
 
-void LinkLoader::released()
-{
-}
-
 }
index 740d2bc..5aaff67 100644 (file)
 #include "LinkLoaderClient.h"
 #include "Timer.h"
 
-#include <wtf/RefPtr.h>
-
 namespace WebCore {
 
 class Document;
 class URL;
-struct LinkRelAttribute;
 
-// The LinkLoader can load link rel types icon, dns-prefetch, subresource and prefetch.
-class LinkLoader : public CachedResourceClient {
+struct LinkRelAttribute;
 
+class LinkLoader : private CachedResourceClient {
 public:
-    explicit LinkLoader(LinkLoaderClient*);
+    explicit LinkLoader(LinkLoaderClient&);
     virtual ~LinkLoader();
 
-    // from CachedResourceClient
-    virtual void notifyFinished(CachedResource*) override;
-
-    void released();
-    bool loadLink(const LinkRelAttribute&, const String& type, const String& sizes, const URL&, Document*);
+    bool loadLink(const LinkRelAttribute&, const URL&, Document&);
 
 private:
+    virtual void notifyFinished(CachedResource*) override;
+
     void linkLoadTimerFired();
     void linkLoadingErrorTimerFired();
 
-    LinkLoaderClient* m_client;
-
+    LinkLoaderClient& m_client;
     CachedResourceHandle<CachedResource> m_cachedLinkResource;
     Timer m_linkLoadTimer;
     Timer m_linkLoadingErrorTimer;
index 7434000..decdad3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2006-2011, 2015 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
  * Copyright (C) 2008 Alp Toker <alp@atoker.com>
 
 #include "Document.h"
 #include "DocumentLoader.h"
+#include "ElementChildIterator.h"
 #include "FrameLoader.h"
 #include "FrameLoaderClient.h"
+#include "HTMLHeadElement.h"
+#include "HTMLLinkElement.h"
 #include "IconDatabase.h"
-#include "IconDatabaseBase.h"
 #include "IconLoader.h"
-#include "IconURL.h"
 #include "Logging.h"
 #include "MainFrame.h"
 #include "Page.h"
 
 namespace WebCore {
 
+enum class LinkElementSelector { All, WithMIMEType };
+
 IconController::IconController(Frame& frame)
     : m_frame(frame)
-    , m_waitingForLoadDecision(false)
 {
 }
 
@@ -61,63 +63,63 @@ IconController::~IconController()
 {
 }
 
-URL IconController::url()
-{
-    IconURLs iconURLs = urlsForTypes(Favicon);
-    return iconURLs.isEmpty() ? URL() : iconURLs[0].m_iconURL;
-}
-
-IconURL IconController::iconURL(IconType iconType) const
+// FIXME: Given how this is used, there's no real need to use a vector here.
+// Should straighten this out and tighten up the code.
+static Vector<URL> iconsFromLinkElements(Frame& frame, LinkElementSelector selector)
 {
-    IconURL result;
-    const Vector<IconURL>& iconURLs = m_frame.document()->iconURLs(iconType);
-    Vector<IconURL>::const_iterator iter(iconURLs.begin());
-    for (; iter != iconURLs.end(); ++iter) {
-        if (result.m_iconURL.isEmpty() || !iter->m_mimeType.isEmpty())
-            result = *iter;
+    Vector<URL> result;
+
+    auto* document = frame.document();
+    if (!document)
+        return result;
+
+    auto* head = document->head();
+    if (!head)
+        return result;
+
+    for (auto& linkElement : childrenOfType<HTMLLinkElement>(*head)) {
+        if (!(linkElement.iconType() & Favicon))
+            continue;
+        if (linkElement.href().isEmpty())
+            continue;
+        if (selector == WithMIMEType && linkElement.type().isEmpty())
+            continue;
+        result.append(linkElement.href());
     }
 
+    // Put last icon seen at the front. This helps us implement a rule that says that icons seen later should take precedence.
+    result.reverse();
+
     return result;
 }
 
-IconURLs IconController::urlsForTypes(int iconTypesMask)
+URL IconController::url()
 {
-    IconURLs iconURLs;
-    if (m_frame.tree().parent())
-        return iconURLs;
-        
-    if (iconTypesMask & Favicon && !appendToIconURLs(Favicon, &iconURLs))
-        iconURLs.append(defaultURL(Favicon));
-
-#if ENABLE(TOUCH_ICON_LOADING)
-    int missedIcons = 0;
-    if (iconTypesMask & TouchPrecomposedIcon)
-        missedIcons += appendToIconURLs(TouchPrecomposedIcon, &iconURLs) ? 0:1;
-
-    if (iconTypesMask & TouchIcon)
-      missedIcons += appendToIconURLs(TouchIcon, &iconURLs) ? 0:1;
-
-    // Only return the default touch icons when the both were required and neither was gotten.
-    if (missedIcons == 2) {
-        iconURLs.append(defaultURL(TouchPrecomposedIcon));
-        iconURLs.append(defaultURL(TouchIcon));
-    }
-#endif
-
-    // Finally, append all remaining icons of this type.
-    const Vector<IconURL>& allIconURLs = m_frame.document()->iconURLs(iconTypesMask);
-    for (Vector<IconURL>::const_iterator iter = allIconURLs.begin(); iter != allIconURLs.end(); ++iter) {
-        int i;
-        int iconCount = iconURLs.size();
-        for (i = 0; i < iconCount; ++i) {
-            if (*iter == iconURLs.at(i))
-                break;
-        }
-        if (i == iconCount)
-            iconURLs.append(*iter);
+    if (!m_frame.isMainFrame())
+        return URL();
+
+    // FIXME: This implements a rule that says "first icon seen with a MIME type wins".
+    // But that is not consistent with the comment in iconsFromLinkElements that says
+    // that icons seen *later* should take precedence.
+    URL icon;
+    for (auto& candidate : iconsFromLinkElements(m_frame, LinkElementSelector::WithMIMEType))
+        icon = candidate;
+    if (!icon.isEmpty())
+        return icon;
+
+    icon = m_frame.document()->completeURL(ASCIILiteral("/favicon.ico"));
+    if (icon.protocolIsInHTTPFamily()) {
+        // FIXME: Not sure we need to remove credentials like this.
+        // However this preserves behavior this code path has historically had.
+        icon.setUser(String());
+        icon.setPass(String());
+        return icon;
     }
 
-    return iconURLs;
+    for (auto& candidate : iconsFromLinkElements(m_frame, LinkElementSelector::All))
+        return candidate;
+
+    return URL();
 }
 
 void IconController::commitToDatabase(const URL& icon)
@@ -142,9 +144,8 @@ void IconController::startLoader()
     if (!documentCanHaveIcon(m_frame.document()->url()))
         return;
 
-    URL iconURL(url());
-    String urlString(iconURL.string());
-    if (urlString.isEmpty())
+    URL iconURL = url();
+    if (iconURL.isEmpty())
         return;
 
     // People who want to avoid loading images generally want to avoid loading all images, unless an exception has been made for site icons.
@@ -164,20 +165,20 @@ void IconController::startLoader()
         if (m_frame.page() && m_frame.page()->usesEphemeralSession())
             return;
 
-        m_frame.loader().documentLoader()->getIconLoadDecisionForIconURL(urlString);
+        m_frame.loader().documentLoader()->getIconLoadDecisionForIconURL(iconURL.string());
         // Commit the icon url mapping to the database just in case we don't end up loading later.
         commitToDatabase(iconURL);
         return;
     }
 
-    IconLoadDecision decision = iconDatabase().synchronousLoadDecisionForIconURL(urlString, m_frame.loader().documentLoader());
+    IconLoadDecision decision = iconDatabase().synchronousLoadDecisionForIconURL(iconURL.string(), m_frame.loader().documentLoader());
 
     if (decision == IconLoadUnknown) {
         // In this case, we may end up loading the icon later, but we still want to commit the icon url mapping to the database
         // just in case we don't end up loading later - if we commit the mapping a second time after the load, that's no big deal
         // We also tell the client to register for the notification that the icon is received now so it isn't missed in case the 
         // icon is later read in from disk
-        LOG(IconDatabase, "IconController %p might load icon %s later", this, urlString.ascii().data());
+        LOG(IconDatabase, "IconController %p might load icon %s later", this, iconURL.string().utf8().data());
         m_waitingForLoadDecision = true;    
         m_frame.loader().client().registerForIconNotification();
         commitToDatabase(iconURL);
@@ -208,16 +209,15 @@ void IconController::continueLoadWithDecision(IconLoadDecision iconLoadDecision)
     ASSERT(iconLoadDecision != IconLoadUnknown);
 
     if (iconLoadDecision == IconLoadNo) {
-        URL iconURL(url());
-        String urlString(iconURL.string());
-        if (urlString.isEmpty())
+        URL iconURL = url();
+        if (iconURL.isEmpty())
             return;
 
-        LOG(IconDatabase, "IconController::startLoader() - Told not to load this icon, committing iconURL %s to database for pageURL mapping", urlString.ascii().data());
+        LOG(IconDatabase, "IconController::startLoader() - Told not to load this icon, committing iconURL %s to database for pageURL mapping", iconURL.string().utf8().data());
         commitToDatabase(iconURL);
 
         if (iconDatabase().supportsAsynchronousMode()) {
-            m_frame.loader().documentLoader()->getIconDataForIconURL(urlString);
+            m_frame.loader().documentLoader()->getIconDataForIconURL(iconURL.string());
             return;
         }
 
@@ -225,8 +225,8 @@ void IconController::continueLoadWithDecision(IconLoadDecision iconLoadDecision)
         // If the icon data hasn't been read in from disk yet, kick off the read of the icon from the database to make sure someone
         // has done it. This is after registering for the notification so the WebView can call the appropriate delegate method.
         // Otherwise if the icon data *is* available, notify the delegate
-        if (!iconDatabase().synchronousIconDataKnownForIconURL(urlString)) {
-            LOG(IconDatabase, "Told not to load icon %s but icon data is not yet available - registering for notification and requesting load from disk", urlString.ascii().data());
+        if (!iconDatabase().synchronousIconDataKnownForIconURL(iconURL.string())) {
+            LOG(IconDatabase, "Told not to load icon %s but icon data is not yet available - registering for notification and requesting load from disk", iconURL.string().ascii().data());
             m_frame.loader().client().registerForIconNotification();
             iconDatabase().synchronousIconForPageURL(m_frame.document()->url().string(), IntSize(0, 0));
             iconDatabase().synchronousIconForPageURL(m_frame.loader().initialRequest().url().string(), IntSize(0, 0));
@@ -242,45 +242,4 @@ void IconController::continueLoadWithDecision(IconLoadDecision iconLoadDecision)
     m_iconLoader->startLoading();
 }
 
-bool IconController::appendToIconURLs(IconType iconType, IconURLs* iconURLs)
-{
-    IconURL faviconURL = iconURL(iconType);
-    if (faviconURL.m_iconURL.isEmpty())
-        return false;
-
-    iconURLs->append(faviconURL);
-    return true;
-}
-
-IconURL IconController::defaultURL(IconType iconType)
-{
-    // Don't return a favicon iconURL unless we're http or https
-    URL documentURL = m_frame.document()->url();
-    if (!documentURL.protocolIsInHTTPFamily())
-        return IconURL();
-
-    URL url;
-    bool couldSetProtocol = url.setProtocol(documentURL.protocol());
-    ASSERT_UNUSED(couldSetProtocol, couldSetProtocol);
-    url.setHost(documentURL.host());
-    if (documentURL.hasPort())
-        url.setPort(documentURL.port());
-
-    if (iconType == Favicon) {
-        url.setPath("/favicon.ico");
-        return IconURL::defaultIconURL(url, Favicon);
-    }
-#if ENABLE(TOUCH_ICON_LOADING)
-    if (iconType == TouchPrecomposedIcon) {
-        url.setPath("/apple-touch-icon-precomposed.png");
-        return IconURL::defaultIconURL(url, TouchPrecomposedIcon);
-    }
-    if (iconType == TouchIcon) {
-        url.setPath("/apple-touch-icon.png");
-        return IconURL::defaultIconURL(url, TouchIcon);
-    }
-#endif
-    return IconURL();
-}
-
 }
index cb0e099..f123223 100644 (file)
 #define IconController_h
 
 #include "IconDatabaseBase.h"
-#include "IconURL.h"
-#include "URL.h"
 
 namespace WebCore {
 
 class Frame;
 class IconLoader;
+class URL;
 
 class IconController {
-    WTF_MAKE_NONCOPYABLE(IconController);
     WTF_MAKE_FAST_ALLOCATED;
 public:
     explicit IconController(Frame&);
     ~IconController();
 
     WEBCORE_EXPORT URL url();
-    IconURLs urlsForTypes(int iconTypesMask);
-    IconURL iconURL(IconType) const;
 
     void startLoader();
     void stopLoader();
@@ -60,13 +56,9 @@ public:
     void commitToDatabase(const URL& icon);
 
 private:
-    bool appendToIconURLs(IconType, IconURLs*);
-    IconURL defaultURL(IconType);
-
     Frame& m_frame;
-
     std::unique_ptr<IconLoader> m_iconLoader;
-    bool m_waitingForLoadDecision;
+    bool m_waitingForLoadDecision { false };
 };
 
 } // namespace WebCore
index 30377fa..b78486d 100644 (file)
@@ -63,6 +63,7 @@
 #include "HTMLVideoElement.h"
 #include "HistoryController.h"
 #include "HistoryItem.h"
+#include "IconController.h"
 #include "InspectorClient.h"
 #include "InspectorController.h"
 #include "InspectorForwarding.h"
@@ -1848,26 +1849,17 @@ int Internals::pageNumber(Element* element, float pageWidth, float pageHeight)
     return PrintContext::pageNumberForElement(element, FloatSize(pageWidth, pageHeight));
 }
 
-Vector<String> Internals::iconURLs(Document* document, int iconTypesMask) const
-{
-    Vector<IconURL> iconURLs = document->iconURLs(iconTypesMask);
-    Vector<String> array;
-
-    Vector<IconURL>::const_iterator iter(iconURLs.begin());
-    for (; iter != iconURLs.end(); ++iter)
-        array.append(iter->m_iconURL.string());
-
-    return array;
-}
-
 Vector<String> Internals::shortcutIconURLs() const
 {
-    return iconURLs(contextDocument(), Favicon);
-}
+    Vector<String> vector;
 
-Vector<String> Internals::allIconURLs() const
-{
-    return iconURLs(contextDocument(), Favicon | TouchIcon | TouchPrecomposedIcon);
+    if (!frame())
+        return vector;
+
+    auto string = frame()->loader().icon().url().string();
+    if (!string.isNull())
+        vector.append(string);
+    return vector;
 }
 
 int Internals::numberOfPages(float pageWidth, float pageHeight)
index 40c0ff6..7d7950b 100644 (file)
@@ -258,7 +258,6 @@ public:
 
     int pageNumber(Element*, float pageWidth = 800, float pageHeight = 600);
     Vector<String> shortcutIconURLs() const;
-    Vector<String> allIconURLs() const;
 
     int numberOfPages(float pageWidthInPixels = 800, float pageHeightInPixels = 600);
     String pageProperty(String, int, ExceptionCode& = ASSERT_NO_EXCEPTION) const;
@@ -386,7 +385,6 @@ private:
     explicit Internals(Document*);
     Document* contextDocument() const;
     Frame* frame() const;
-    Vector<String> iconURLs(Document*, int iconTypesMask) const;
 
     RenderedDocumentMarker* markerAt(Node*, const String& markerType, unsigned index, ExceptionCode&);
 
index 3834a5c..0affcbb 100644 (file)
@@ -233,7 +233,6 @@ enum ResourceLoadPriority {
     DOMString counterValue(Element element);
     long pageNumber(Element element, optional unrestricted float pageWidth, optional unrestricted float pageHeight);
     DOMString[] shortcutIconURLs();
-    DOMString[] allIconURLs();
     long numberOfPages(optional unrestricted double pageWidthInPixels, optional unrestricted double pageHeightInPixels);
     [RaisesException] DOMString pageProperty(DOMString propertyName, long pageNumber);
     [RaisesException] DOMString pageSizeAndMarginsInPixels(long pageIndex, long width, long height, long marginTop, long marginRight, long marginBottom, long marginLeft);