Get rid of WebCore IconDatabase code.
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Jul 2017 18:48:17 +0000 (18:48 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 21 Jul 2017 18:48:17 +0000 (18:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174700

Reviewed by Tim Horton.

Source/WebCore:

No new tests (No behavior change).

Tons of red.
Very little green.
No further explanation.

* CMakeLists.txt:
* WebCore.xcodeproj/project.pbxproj:
* dom/Document.cpp:
(WebCore::Document::implicitClose):
* history/HistoryItem.cpp:
(WebCore::HistoryItem::HistoryItem):
(WebCore::HistoryItem::~HistoryItem):
(WebCore::HistoryItem::reset):
(WebCore::HistoryItem::setURLString):
* inspector/InspectorNetworkAgent.cpp:
(WebCore::InspectorNetworkAgent::willSendRequest):
* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::~DocumentLoader):
(WebCore::DocumentLoader::startIconLoading):
(WebCore::DocumentLoader::iconLoadDecisionAvailable): Deleted.
(WebCore::iconLoadDecisionCallback): Deleted.
(WebCore::DocumentLoader::getIconLoadDecisionForIconURL): Deleted.
(WebCore::DocumentLoader::continueIconLoadWithDecision): Deleted.
(WebCore::iconDataCallback): Deleted.
(WebCore::DocumentLoader::getIconDataForIconURL): Deleted.
* loader/DocumentLoader.h:
(WebCore::DocumentLoader::linkIcons):
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::FrameLoader):
(WebCore::FrameLoader::stop):
* loader/FrameLoader.h:
(WebCore::FrameLoader::subframeLoader):
(WebCore::FrameLoader::icon): Deleted.
* loader/FrameLoaderClient.h:
* loader/archive/cf/LegacyWebArchive.cpp:
(WebCore::LegacyWebArchive::create):
* loader/icon/IconController.cpp: Removed.
* loader/icon/IconController.h: Removed.
* loader/icon/IconDatabase.cpp: Removed.
* loader/icon/IconDatabase.h: Removed.
* loader/icon/IconDatabaseBase.cpp: Removed.
* loader/icon/IconDatabaseBase.h: Removed.
* loader/icon/IconDatabaseClient.h: Removed.
* loader/icon/IconLoader.cpp:
(WebCore::IconLoader::IconLoader):
(WebCore::IconLoader::startLoading):
(WebCore::IconLoader::notifyFinished):
* loader/icon/IconLoader.h:
* loader/icon/IconRecord.cpp: Removed.
* loader/icon/IconRecord.h: Removed.
* loader/icon/PageURLRecord.cpp: Removed.
* loader/icon/PageURLRecord.h: Removed.
* testing/Internals.cpp:
(WebCore::Internals::shortcutIconURLs):

Source/WebKit:

* UIProcess/API/glib/WebKitWebContext.cpp:
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::useIconLoadingClient): Deleted.
* WebProcess/WebCoreSupport/WebFrameLoaderClient.h:

Source/WebKitLegacy:

* WebKitLegacy.xcodeproj/project.pbxproj:

Source/WebKitLegacy/mac:

* Misc/WebCoreStatistics.mm:
(+[WebCoreStatistics iconPageURLMappingCount]):
(+[WebCoreStatistics iconRetainedPageURLCount]):
(+[WebCoreStatistics iconRecordCount]):
(+[WebCoreStatistics iconsWithDataCount]):
* WebCoreSupport/WebFrameLoaderClient.h:
* WebCoreSupport/WebFrameLoaderClient.mm:
* WebCoreSupport/WebIconDatabaseClient.h: Removed.
* WebCoreSupport/WebIconDatabaseClient.mm: Removed.
* WebView/WebView.mm:
(-[WebView mainFrameIconURL]):

LayoutTests:

* fast/dom/icon-url-list-expected.txt:
* fast/dom/icon-url-list.html:

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

42 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/icon-url-list-expected.txt
LayoutTests/fast/dom/icon-url-list.html
Source/WebCore/CMakeLists.txt
Source/WebCore/ChangeLog
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/dom/Document.cpp
Source/WebCore/history/HistoryItem.cpp
Source/WebCore/inspector/InspectorNetworkAgent.cpp
Source/WebCore/loader/DocumentLoader.cpp
Source/WebCore/loader/DocumentLoader.h
Source/WebCore/loader/FrameLoader.cpp
Source/WebCore/loader/FrameLoader.h
Source/WebCore/loader/FrameLoaderClient.h
Source/WebCore/loader/archive/cf/LegacyWebArchive.cpp
Source/WebCore/loader/icon/IconController.cpp [deleted file]
Source/WebCore/loader/icon/IconController.h [deleted file]
Source/WebCore/loader/icon/IconDatabase.cpp [deleted file]
Source/WebCore/loader/icon/IconDatabase.h [deleted file]
Source/WebCore/loader/icon/IconDatabaseBase.cpp [deleted file]
Source/WebCore/loader/icon/IconDatabaseBase.h [deleted file]
Source/WebCore/loader/icon/IconDatabaseClient.h [deleted file]
Source/WebCore/loader/icon/IconLoader.cpp
Source/WebCore/loader/icon/IconLoader.h
Source/WebCore/loader/icon/IconRecord.cpp [deleted file]
Source/WebCore/loader/icon/IconRecord.h [deleted file]
Source/WebCore/loader/icon/PageURLRecord.cpp [deleted file]
Source/WebCore/loader/icon/PageURLRecord.h [deleted file]
Source/WebCore/testing/Internals.cpp
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp
Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKitLegacy/ChangeLog
Source/WebKitLegacy/WebKitLegacy.xcodeproj/project.pbxproj
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/Misc/WebCoreStatistics.mm
Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.h
Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm
Source/WebKitLegacy/mac/WebCoreSupport/WebIconDatabaseClient.h [deleted file]
Source/WebKitLegacy/mac/WebCoreSupport/WebIconDatabaseClient.mm [deleted file]
Source/WebKitLegacy/mac/WebView/WebView.mm

index be43489..bf0108c 100644 (file)
@@ -1,3 +1,13 @@
+2017-07-21  Brady Eidson  <beidson@apple.com>
+
+        Get rid of WebCore IconDatabase code.
+        https://bugs.webkit.org/show_bug.cgi?id=174700
+
+        Reviewed by Tim Horton.
+
+        * fast/dom/icon-url-list-expected.txt:
+        * fast/dom/icon-url-list.html:
+
 2017-07-21  Chris Dumez  <cdumez@apple.com>
 
         Unreviewed, rebaseline test after r219708.
index 739adcd..7babc1d 100644 (file)
@@ -1,5 +1,2 @@
-Original iconURL is: http://test.com/oldfavicon.ico
-Setting new icon URL to: http://test.com/newfavicon.ico
-New iconURL is: http://test.com/newfavicon.ico
-PASS URL list matches expected
+PASS PASS URL list matches expected
 
index 8debf07..0f86fe1 100644 (file)
@@ -1,61 +1,45 @@
 <html>
 <head>
 <title>Original Title</title>
-<link rel="shortcut icon" type="image/x-icon" href="http://test.com/oldfavicon.ico"/>
 <link rel="shortcut icon" type="image/x-icon" href="http://test.com/foofavicon.ico"/>
 <link rel="shortcut icon" type="image/x-icon" href="http://test.com/barfavicon.ico"/>
 <script src="../../resources/js-test-pre.js"></script>
 <script>
 
-function setFavIcon(iconURL) {
-    var docHead = document.getElementsByTagName("head")[0];
-
-    // set up a new node for the new iconURL
-    var newLink = document.createElement("link");
-    newLink.type = "image/x-icon";
-    newLink.rel = "shortcut icon";
-    newLink.href = iconURL;
-
-    var links = docHead.getElementsByTagName("link");
-    for (var i = 0; i < links.length; ++i) {
-        var oldLink = links[i];
-        if (oldLink.type=="image/x-icon" && oldLink.rel=="shortcut icon") {
-          // if we find the child, replace it with the new node.
-          docHead.replaceChild(newLink, oldLink);
-          return; // Assuming only one match at most.
-        }
-    }
-
-    // if we didn't find the icon URL link, add it now.
-    docHead.appendChild(newLink);
-}
-
 function runTests() {
     if (window.testRunner)
         testRunner.dumpAsText();
 
-    iconURL = document.getElementsByTagName("link")[0].href;
-    debug('Original iconURL is: ' + iconURL);
-
-    // change icon to new icon
-    newURL = 'http://test.com/newfavicon.ico';
-    debug('Setting new icon URL to: ' + newURL);
-    setFavIcon(newURL);
-    iconURL = document.getElementsByTagName("link")[0].href
-    debug('New iconURL is: ' + iconURL);
-
     // check that the URL list in the document is as we expect
     var expectedURL0 = "http://test.com/barfavicon.ico";
     var expectedURL1 = "http://test.com/foofavicon.ico";
-    var expectedURL2 = "http://test.com/newfavicon.ico";
     var iconURLs = window.internals.shortcutIconURLs();
-    // 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: length = ' + iconURLs.length + ', URL=' + iconURLs[0]);
+
+       // Note: This test used to dynamically change a 3rd icon URL and verify the new URL is in the set.
+       // We currently have no plans to support that in WebKit.
+
+       var didFail = false;
+    if (iconURLs.length != 2) {
+        testFailed('Icon URLs list has ' + iconURLs.length + ' elements, should have 2');
+               didFail = true;
+       }
+       
+       var urlSet = new Object;
+       iconURLs.forEach(function(url) {
+               urlSet[url] = true;
+       });
+       
+       if (!urlSet[expectedURL0]) {
+               testFailed('Expected url ' + expectedURL0 + ' in the URL set, but it was not there');
+               didFail = true;
+       }
+       if (!urlSet[expectedURL1]) {
+               testFailed('Expected url ' + expectedURL1 + ' in the URL set, but it was not there');
+               didFail = true;
+       }
+       
+       if (!didFail)
+        testPassed('PASS URL list matches expected');
 }
 
 </script>
index ce026c7..915f80d 100644 (file)
@@ -2050,12 +2050,7 @@ set(WebCore_SOURCES
     loader/cache/CachedXSLStyleSheet.cpp
     loader/cache/MemoryCache.cpp
 
-    loader/icon/IconController.cpp
-    loader/icon/IconDatabase.cpp
-    loader/icon/IconDatabaseBase.cpp
     loader/icon/IconLoader.cpp
-    loader/icon/IconRecord.cpp
-    loader/icon/PageURLRecord.cpp
 
     mathml/MathMLAnnotationElement.cpp
     mathml/MathMLElement.cpp
index f7cb8a4..3ffcfcf 100644 (file)
@@ -1,3 +1,66 @@
+2017-07-21  Brady Eidson  <beidson@apple.com>
+
+        Get rid of WebCore IconDatabase code.
+        https://bugs.webkit.org/show_bug.cgi?id=174700
+
+        Reviewed by Tim Horton.
+
+        No new tests (No behavior change).
+        
+        Tons of red.
+        Very little green.
+        No further explanation.
+
+        * CMakeLists.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * dom/Document.cpp:
+        (WebCore::Document::implicitClose):
+        * history/HistoryItem.cpp:
+        (WebCore::HistoryItem::HistoryItem):
+        (WebCore::HistoryItem::~HistoryItem):
+        (WebCore::HistoryItem::reset):
+        (WebCore::HistoryItem::setURLString):
+        * inspector/InspectorNetworkAgent.cpp:
+        (WebCore::InspectorNetworkAgent::willSendRequest):
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::~DocumentLoader):
+        (WebCore::DocumentLoader::startIconLoading):
+        (WebCore::DocumentLoader::iconLoadDecisionAvailable): Deleted.
+        (WebCore::iconLoadDecisionCallback): Deleted.
+        (WebCore::DocumentLoader::getIconLoadDecisionForIconURL): Deleted.
+        (WebCore::DocumentLoader::continueIconLoadWithDecision): Deleted.
+        (WebCore::iconDataCallback): Deleted.
+        (WebCore::DocumentLoader::getIconDataForIconURL): Deleted.
+        * loader/DocumentLoader.h:
+        (WebCore::DocumentLoader::linkIcons):
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::FrameLoader):
+        (WebCore::FrameLoader::stop):
+        * loader/FrameLoader.h:
+        (WebCore::FrameLoader::subframeLoader):
+        (WebCore::FrameLoader::icon): Deleted.
+        * loader/FrameLoaderClient.h:
+        * loader/archive/cf/LegacyWebArchive.cpp:
+        (WebCore::LegacyWebArchive::create):
+        * loader/icon/IconController.cpp: Removed.
+        * loader/icon/IconController.h: Removed.
+        * loader/icon/IconDatabase.cpp: Removed.
+        * loader/icon/IconDatabase.h: Removed.
+        * loader/icon/IconDatabaseBase.cpp: Removed.
+        * loader/icon/IconDatabaseBase.h: Removed.
+        * loader/icon/IconDatabaseClient.h: Removed.
+        * loader/icon/IconLoader.cpp:
+        (WebCore::IconLoader::IconLoader):
+        (WebCore::IconLoader::startLoading):
+        (WebCore::IconLoader::notifyFinished):
+        * loader/icon/IconLoader.h:
+        * loader/icon/IconRecord.cpp: Removed.
+        * loader/icon/IconRecord.h: Removed.
+        * loader/icon/PageURLRecord.cpp: Removed.
+        * loader/icon/PageURLRecord.h: Removed.
+        * testing/Internals.cpp:
+        (WebCore::Internals::shortcutIconURLs):
+
 2017-07-21  Chris Dumez  <cdumez@apple.com>
 
         Rename DOMCoreException class to DOMException
index 32c2226..d4fa79a 100644 (file)
                511F7D441EB1C39100E47B83 /* SessionID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 511F7D431EB1C38900E47B83 /* SessionID.cpp */; };
                5120BBAE1F1CE8CE00EFEBF1 /* CookieStorageObserver.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5120BBAC1F1CE77000EFEBF1 /* CookieStorageObserver.mm */; };
                5120BBAF1F1CECE700EFEBF1 /* CookieStorageObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 5120BBAD1F1CE77000EFEBF1 /* CookieStorageObserver.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               5126E6BB0A2E3B12005C29FA /* IconDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5126E6B90A2E3B12005C29FA /* IconDatabase.cpp */; };
-               5126E6BC0A2E3B12005C29FA /* IconDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 5126E6BA0A2E3B12005C29FA /* IconDatabase.h */; settings = {ATTRIBUTES = (Private, ); }; };
                512BDB4A1C456FF5006494DF /* SQLiteIDBBackingStore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 512BDB481C456FAB006494DF /* SQLiteIDBBackingStore.cpp */; };
                512BDB4B1C456FFA006494DF /* SQLiteIDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 512BDB491C456FAB006494DF /* SQLiteIDBBackingStore.h */; };
                512BDB4D1C46B153006494DF /* JSIDBCursorCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 512BDB4C1C46B0FF006494DF /* JSIDBCursorCustom.cpp */; };
                5162C7F411F77EFB00612EFE /* SchemeRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5162C7F211F77EFA00612EFE /* SchemeRegistry.cpp */; };
                5162C7F511F77EFB00612EFE /* SchemeRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 5162C7F311F77EFB00612EFE /* SchemeRegistry.h */; settings = {ATTRIBUTES = (Private, ); }; };
                5166D3CD1E8ED48F00AD62E3 /* StorageType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5166D3CC1E8ED41100AD62E3 /* StorageType.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               516953971329A3C800B92D04 /* IconDatabaseBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 516953951329A3C800B92D04 /* IconDatabaseBase.cpp */; };
-               516953981329A3C800B92D04 /* IconDatabaseBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 516953961329A3C800B92D04 /* IconDatabaseBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
                516BB7940CE91E6800512F79 /* JSTreeWalkerCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 516BB7920CE91E6800512F79 /* JSTreeWalkerCustom.cpp */; };
                516C62201950D48700337E75 /* GamepadEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 516C621D1950D48700337E75 /* GamepadEvent.cpp */; };
                516C62211950D48700337E75 /* GamepadEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 516C621E1950D48700337E75 /* GamepadEvent.h */; };
                51E0BB390DA5ACB600A9E417 /* StorageMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E0BB370DA5ACB600A9E417 /* StorageMap.cpp */; };
                51E1BAC21BD8064E0055D81F /* MemoryBackingStoreTransaction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E1BAC01BD806470055D81F /* MemoryBackingStoreTransaction.cpp */; };
                51E1BAC31BD8064E0055D81F /* MemoryBackingStoreTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1BAC11BD806470055D81F /* MemoryBackingStoreTransaction.h */; };
-               51E1ECBE0C91C90400DC255B /* IconDatabaseClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1ECB80C91C90400DC255B /* IconDatabaseClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               51E1ECC00C91C90400DC255B /* IconRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E1ECBA0C91C90400DC255B /* IconRecord.cpp */; };
-               51E1ECC10C91C90400DC255B /* IconRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1ECBB0C91C90400DC255B /* IconRecord.h */; };
-               51E1ECC20C91C90400DC255B /* PageURLRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E1ECBC0C91C90400DC255B /* PageURLRecord.cpp */; };
-               51E1ECC30C91C90400DC255B /* PageURLRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1ECBD0C91C90400DC255B /* PageURLRecord.h */; };
                51E269331DD3BC4E006B6A58 /* JSIDBTransactionCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E269321DD3BC43006B6A58 /* JSIDBTransactionCustom.cpp */; };
                51E269361DD3BD97006B6A58 /* IDBIterateCursorData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E269341DD3BD91006B6A58 /* IDBIterateCursorData.cpp */; };
                51E269371DD3BD9B006B6A58 /* IDBIterateCursorData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E269351DD3BD91006B6A58 /* IDBIterateCursorData.h */; settings = {ATTRIBUTES = (Private, ); }; };
                97D2AD0414B823A60093DF32 /* DOMWindowProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 97D2AD0214B823A60093DF32 /* DOMWindowProperty.h */; settings = {ATTRIBUTES = (Private, ); }; };
                97DCE20110807C750057D394 /* HistoryController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97DCE1FF10807C750057D394 /* HistoryController.cpp */; };
                97DCE20210807C750057D394 /* HistoryController.h in Headers */ = {isa = PBXBuildFile; fileRef = 97DCE20010807C750057D394 /* HistoryController.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               97E4028F13A696ED00913D67 /* IconController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 97E4028D13A696ED00913D67 /* IconController.cpp */; };
-               97E4029013A696ED00913D67 /* IconController.h in Headers */ = {isa = PBXBuildFile; fileRef = 97E4028E13A696ED00913D67 /* IconController.h */; settings = {ATTRIBUTES = (Private, ); }; };
                9831AE4A154225C900FE2644 /* ReferrerPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 9831AE49154225A200FE2644 /* ReferrerPolicy.h */; settings = {ATTRIBUTES = (Private, ); }; };
                984264F112D5280A000D88A4 /* LinkLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 984264EF12D5280A000D88A4 /* LinkLoaderClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
                985BB96D13A94058007A0B69 /* LinkRelAttribute.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 985BB96B13A94058007A0B69 /* LinkRelAttribute.cpp */; };
                5123AF161890A4CA0031CDC9 /* IDBKeyRangeData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBKeyRangeData.cpp; sourceTree = "<group>"; };
                5123AF171890A4CA0031CDC9 /* IDBKeyRangeData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBKeyRangeData.h; sourceTree = "<group>"; };
                5123AF1C18918AE40031CDC9 /* IDBGetResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBGetResult.h; sourceTree = "<group>"; };
-               5126E6B90A2E3B12005C29FA /* IconDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = IconDatabase.cpp; sourceTree = "<group>"; };
-               5126E6BA0A2E3B12005C29FA /* IconDatabase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = IconDatabase.h; sourceTree = "<group>"; };
                512BDB481C456FAB006494DF /* SQLiteIDBBackingStore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLiteIDBBackingStore.cpp; sourceTree = "<group>"; };
                512BDB491C456FAB006494DF /* SQLiteIDBBackingStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLiteIDBBackingStore.h; sourceTree = "<group>"; };
                512BDB4C1C46B0FF006494DF /* JSIDBCursorCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBCursorCustom.cpp; sourceTree = "<group>"; };
                51645B531B9F889B00F789CE /* IDBVersionChangeEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBVersionChangeEvent.h; sourceTree = "<group>"; };
                51645B541B9F88E800F789CE /* IDBCursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBCursor.cpp; sourceTree = "<group>"; };
                5166D3CC1E8ED41100AD62E3 /* StorageType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageType.h; sourceTree = "<group>"; };
-               516953951329A3C800B92D04 /* IconDatabaseBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IconDatabaseBase.cpp; sourceTree = "<group>"; };
-               516953961329A3C800B92D04 /* IconDatabaseBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconDatabaseBase.h; sourceTree = "<group>"; };
                516BB7920CE91E6800512F79 /* JSTreeWalkerCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTreeWalkerCustom.cpp; sourceTree = "<group>"; };
                516C621D1950D48700337E75 /* GamepadEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GamepadEvent.cpp; sourceTree = "<group>"; };
                516C621E1950D48700337E75 /* GamepadEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GamepadEvent.h; sourceTree = "<group>"; };
                51E0BB370DA5ACB600A9E417 /* StorageMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageMap.cpp; sourceTree = "<group>"; };
                51E1BAC01BD806470055D81F /* MemoryBackingStoreTransaction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryBackingStoreTransaction.cpp; sourceTree = "<group>"; };
                51E1BAC11BD806470055D81F /* MemoryBackingStoreTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryBackingStoreTransaction.h; sourceTree = "<group>"; };
-               51E1ECB80C91C90400DC255B /* IconDatabaseClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconDatabaseClient.h; sourceTree = "<group>"; };
-               51E1ECBA0C91C90400DC255B /* IconRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IconRecord.cpp; sourceTree = "<group>"; };
-               51E1ECBB0C91C90400DC255B /* IconRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconRecord.h; sourceTree = "<group>"; };
-               51E1ECBC0C91C90400DC255B /* PageURLRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageURLRecord.cpp; sourceTree = "<group>"; };
-               51E1ECBD0C91C90400DC255B /* PageURLRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PageURLRecord.h; sourceTree = "<group>"; };
                51E269321DD3BC43006B6A58 /* JSIDBTransactionCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBTransactionCustom.cpp; sourceTree = "<group>"; };
                51E269341DD3BD91006B6A58 /* IDBIterateCursorData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBIterateCursorData.cpp; sourceTree = "<group>"; };
                51E269351DD3BD91006B6A58 /* IDBIterateCursorData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBIterateCursorData.h; sourceTree = "<group>"; };
                97D2AD0214B823A60093DF32 /* DOMWindowProperty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMWindowProperty.h; sourceTree = "<group>"; };
                97DCE1FF10807C750057D394 /* HistoryController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HistoryController.cpp; sourceTree = "<group>"; };
                97DCE20010807C750057D394 /* HistoryController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryController.h; sourceTree = "<group>"; };
-               97E4028D13A696ED00913D67 /* IconController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IconController.cpp; sourceTree = "<group>"; };
-               97E4028E13A696ED00913D67 /* IconController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IconController.h; sourceTree = "<group>"; };
                97E9EC8B15DC492F004F2E71 /* JSVoidCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSVoidCallback.cpp; sourceTree = "<group>"; };
                97E9EC8C15DC492F004F2E71 /* JSVoidCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSVoidCallback.h; sourceTree = "<group>"; };
                9831AE49154225A200FE2644 /* ReferrerPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReferrerPolicy.h; sourceTree = "<group>"; };
                5126E6B60A2E3AEF005C29FA /* icon */ = {
                        isa = PBXGroup;
                        children = (
-                               97E4028D13A696ED00913D67 /* IconController.cpp */,
-                               97E4028E13A696ED00913D67 /* IconController.h */,
-                               5126E6B90A2E3B12005C29FA /* IconDatabase.cpp */,
-                               5126E6BA0A2E3B12005C29FA /* IconDatabase.h */,
-                               516953951329A3C800B92D04 /* IconDatabaseBase.cpp */,
-                               516953961329A3C800B92D04 /* IconDatabaseBase.h */,
-                               51E1ECB80C91C90400DC255B /* IconDatabaseClient.h */,
                                513F14510AB634C400094DDF /* IconLoader.cpp */,
                                513F14520AB634C400094DDF /* IconLoader.h */,
-                               51E1ECBA0C91C90400DC255B /* IconRecord.cpp */,
-                               51E1ECBB0C91C90400DC255B /* IconRecord.h */,
-                               51E1ECBC0C91C90400DC255B /* PageURLRecord.cpp */,
-                               51E1ECBD0C91C90400DC255B /* PageURLRecord.h */,
                        );
                        path = icon;
                        sourceTree = "<group>";
                                862F12A018C1DD02005C54AF /* HysteresisActivity.h in Headers */,
                                5EBB89331C77782900C65D41 /* IceCandidate.h in Headers */,
                                B275356E0B053814002CE64F /* Icon.h in Headers */,
-                               97E4029013A696ED00913D67 /* IconController.h in Headers */,
-                               5126E6BC0A2E3B12005C29FA /* IconDatabase.h in Headers */,
-                               516953981329A3C800B92D04 /* IconDatabaseBase.h in Headers */,
-                               51E1ECBE0C91C90400DC255B /* IconDatabaseClient.h in Headers */,
                                513F14540AB634C400094DDF /* IconLoader.h in Headers */,
-                               51E1ECC10C91C90400DC255B /* IconRecord.h in Headers */,
                                51714EA81CF4E4B1004723C4 /* IDBActiveDOMObject.h in Headers */,
                                51BA4ACC1BBC5BDD00DF3D6D /* IDBBackingStore.h in Headers */,
                                C585A66311D4FAC5004C3E4B /* IDBBindingUtilities.h in Headers */,
                                A5F36D3B18F758720054C024 /* PageScriptDebugServer.h in Headers */,
                                371E65CC13661EDC00BEEDB0 /* PageSerializer.h in Headers */,
                                E1284AE110447D4500EAEB52 /* PageTransitionEvent.h in Headers */,
-                               51E1ECC30C91C90400DC255B /* PageURLRecord.h in Headers */,
                                FFD5B97B135CC97800D5E92A /* PageVisibilityState.h in Headers */,
                                9377ABA015DEFEEF0031FD04 /* Pagination.h in Headers */,
                                0885067F11DA045B00182B98 /* PaintInfo.h in Headers */,
                                41614A781DA6423B004AD06F /* HTTPHeaderValues.cpp in Sources */,
                                514C76720CE923A1007EF3CD /* HTTPParsers.cpp in Sources */,
                                371A67CB11C6C7DB00047B8B /* HyphenationCF.cpp in Sources */,
-                               97E4028F13A696ED00913D67 /* IconController.cpp in Sources */,
-                               5126E6BB0A2E3B12005C29FA /* IconDatabase.cpp in Sources */,
-                               516953971329A3C800B92D04 /* IconDatabaseBase.cpp in Sources */,
                                FED13D400CEA939400D89466 /* IconIOS.mm in Sources */,
                                513F14530AB634C400094DDF /* IconLoader.cpp in Sources */,
                                B275358E0B053A66002CE64F /* IconMac.mm in Sources */,
-                               51E1ECC00C91C90400DC255B /* IconRecord.cpp in Sources */,
                                C585A66211D4FAC5004C3E4B /* IDBBindingUtilities.cpp in Sources */,
                                517B25A91CC82B2A0061C011 /* IDBConnectionProxy.cpp in Sources */,
                                516D7D711BB5F0BD00AF7C77 /* IDBConnectionToClient.cpp in Sources */,
                                A5F36D3A18F758720054C024 /* PageScriptDebugServer.cpp in Sources */,
                                371E65CE13661EED00BEEDB0 /* PageSerializer.cpp in Sources */,
                                E1284AEA10447DEE00EAEB52 /* PageTransitionEvent.cpp in Sources */,
-                               51E1ECC20C91C90400DC255B /* PageURLRecord.cpp in Sources */,
                                FD3160A212B026F700C1A359 /* Panner.cpp in Sources */,
                                FD31601912B0267600C1A359 /* PannerNode.cpp in Sources */,
                                A18890AE1AA13F250026C301 /* ParentalControlsContentFilter.mm in Sources */,
index 1f338fc..68e4c33 100644 (file)
 #include "HashChangeEvent.h"
 #include "History.h"
 #include "HitTestResult.h"
-#include "IconController.h"
 #include "ImageLoader.h"
 #include "InspectorInstrumentation.h"
 #include "JSCustomElementInterface.h"
@@ -2716,11 +2715,8 @@ void Document::implicitClose()
     // ramifications, and we need to decide what is the Right Thing To Do(tm)
     Frame* f = frame();
     if (f) {
-        if (f->loader().client().useIconLoadingClient()) {
-            if (auto* documentLoader = loader())
-                documentLoader->startIconLoading();
-        } else
-            f->loader().icon().startLoader();
+        if (auto* documentLoader = loader())
+            documentLoader->startIconLoading();
 
         f->animation().startAnimationsIfNotSuspended(this);
 
index d99c006..a866185 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "CachedPage.h"
 #include "Document.h"
-#include "IconDatabase.h"
 #include "KeyedCoding.h"
 #include "PageCache.h"
 #include "ResourceRequest.h"
@@ -70,7 +69,6 @@ HistoryItem::HistoryItem(const String& urlString, const String& title)
     , m_documentSequenceNumber(generateSequenceNumber())
     , m_pruningReason(PruningReason::None)
 {
-    iconDatabase().retainIconForPageURL(m_urlString);
 }
 
 HistoryItem::HistoryItem(const String& urlString, const String& title, const String& alternateTitle)
@@ -83,13 +81,11 @@ HistoryItem::HistoryItem(const String& urlString, const String& title, const Str
     , m_documentSequenceNumber(generateSequenceNumber())
     , m_pruningReason(PruningReason::None)
 {
-    iconDatabase().retainIconForPageURL(m_urlString);
 }
 
 HistoryItem::~HistoryItem()
 {
     ASSERT(!m_cachedPage);
-    iconDatabase().releaseIconForPageURL(m_urlString);
 }
 
 inline HistoryItem::HistoryItem(const HistoryItem& item)
@@ -130,8 +126,6 @@ Ref<HistoryItem> HistoryItem::copy() const
 
 void HistoryItem::reset()
 {
-    iconDatabase().releaseIconForPageURL(m_urlString);
-
     m_urlString = String();
     m_originalURLString = String();
     m_referrer = String();
@@ -208,12 +202,7 @@ void HistoryItem::setAlternateTitle(const String& alternateTitle)
 
 void HistoryItem::setURLString(const String& urlString)
 {
-    if (m_urlString != urlString) {
-        iconDatabase().releaseIconForPageURL(m_urlString);
-        m_urlString = urlString;
-        iconDatabase().retainIconForPageURL(m_urlString);
-    }
-    
+    m_urlString = urlString;
     notifyHistoryItemChanged(this);
 }
 
index 077b633..f3e3acf 100644 (file)
@@ -43,7 +43,6 @@
 #include "FrameLoader.h"
 #include "HTTPHeaderMap.h"
 #include "HTTPHeaderNames.h"
-#include "IconController.h"
 #include "InspectorPageAgent.h"
 #include "InspectorTimelineAgent.h"
 #include "InstrumentingAgents.h"
@@ -353,10 +352,16 @@ void InspectorNetworkAgent::willSendRequest(unsigned long identifier, DocumentLo
     if (type == InspectorPageAgent::OtherResource) {
         if (m_loadingXHRSynchronously)
             type = InspectorPageAgent::XHRResource;
-        else if (equalIgnoringFragmentIdentifier(request.url(), loader.frameLoader()->icon().url()))
-            type = InspectorPageAgent::ImageResource;
         else if (equalIgnoringFragmentIdentifier(request.url(), loader.url()) && !loader.isCommitted())
             type = InspectorPageAgent::DocumentResource;
+        else {
+            for (auto& linkIcon : loader.linkIcons()) {
+                if (equalIgnoringFragmentIdentifier(request.url(), linkIcon.url)) {
+                    type = InspectorPageAgent::ImageResource;
+                    break;
+                }
+            }
+        }
     }
 
     m_resourcesData->setResourceType(requestId, type);
index 3bb9c4e..3c05bad 100644 (file)
@@ -54,7 +54,6 @@
 #include "HTMLFrameOwnerElement.h"
 #include "HTTPHeaderNames.h"
 #include "HistoryItem.h"
-#include "IconController.h"
 #include "IconLoader.h"
 #include "InspectorInstrumentation.h"
 #include "LinkIconCollector.h"
@@ -166,12 +165,8 @@ DocumentLoader::~DocumentLoader()
     ASSERT(!m_frame || !isLoading() || frameLoader()->activeDocumentLoader() != this);
     ASSERT_WITH_MESSAGE(!m_waitingForContentPolicy, "The content policy callback should never outlive its DocumentLoader.");
     ASSERT_WITH_MESSAGE(!m_waitingForNavigationPolicy, "The navigation policy callback should never outlive its DocumentLoader.");
-    if (m_iconLoadDecisionCallback)
-        m_iconLoadDecisionCallback->invalidate();
-    if (m_iconDataCallback)
-        m_iconDataCallback->invalidate();
-    m_cachedResourceLoader->clearDocumentLoader();
 
+    m_cachedResourceLoader->clearDocumentLoader();
     clearMainResource();
 }
 
@@ -1610,60 +1605,18 @@ void DocumentLoader::maybeFinishLoadingMultipartContent()
     commitLoad(resourceData->data(), resourceData->size());
 }
 
-void DocumentLoader::iconLoadDecisionAvailable()
-{
-    if (m_frame)
-        m_frame->loader().icon().loadDecisionReceived(iconDatabase().synchronousLoadDecisionForIconURL(frameLoader()->icon().url(), this));
-}
-
-static void iconLoadDecisionCallback(IconLoadDecision decision, void* context)
-{
-    static_cast<DocumentLoader*>(context)->continueIconLoadWithDecision(decision);
-}
-
-void DocumentLoader::getIconLoadDecisionForIconURL(const String& urlString)
-{
-    if (m_iconLoadDecisionCallback)
-        m_iconLoadDecisionCallback->invalidate();
-    m_iconLoadDecisionCallback = IconLoadDecisionCallback::create(this, iconLoadDecisionCallback);
-    iconDatabase().loadDecisionForIconURL(urlString, *m_iconLoadDecisionCallback);
-}
-
-void DocumentLoader::continueIconLoadWithDecision(IconLoadDecision decision)
-{
-    ASSERT(m_iconLoadDecisionCallback);
-    m_iconLoadDecisionCallback = nullptr;
-    if (m_frame)
-        m_frame->loader().icon().continueLoadWithDecision(decision);
-}
-
-static void iconDataCallback(SharedBuffer*, void*)
-{
-    // FIXME: Implement this once we know what parts of WebCore actually need the icon data returned.
-}
-
-void DocumentLoader::getIconDataForIconURL(const String& urlString)
-{   
-    if (m_iconDataCallback)
-        m_iconDataCallback->invalidate();
-    m_iconDataCallback = IconDataCallback::create(this, iconDataCallback);
-    iconDatabase().iconDataForIconURL(urlString, *m_iconDataCallback);
-}
-
 void DocumentLoader::startIconLoading()
 {
-    ASSERT(m_frame->loader().client().useIconLoadingClient());
-
     static uint64_t nextIconCallbackID = 1;
 
     auto* document = this->document();
     if (!document)
         return;
 
-    Vector<LinkIcon> icons = LinkIconCollector { *document }.iconsOfTypes({ LinkIconType::Favicon, LinkIconType::TouchIcon, LinkIconType::TouchPrecomposedIcon });
+    m_linkIcons = LinkIconCollector { *document }.iconsOfTypes({ LinkIconType::Favicon, LinkIconType::TouchIcon, LinkIconType::TouchPrecomposedIcon });
 
     bool hasFavicon = false;
-    for (auto& icon : icons) {
+    for (auto& icon : m_linkIcons) {
         if (icon.type == LinkIconType::Favicon) {
             hasFavicon = true;
             break;
@@ -1671,11 +1624,11 @@ void DocumentLoader::startIconLoading()
     }
 
     if (!hasFavicon)
-        icons.append({ m_frame->document()->completeURL(ASCIILiteral("/favicon.ico")), LinkIconType::Favicon, String(), std::nullopt });
+        m_linkIcons.append({ m_frame->document()->completeURL(ASCIILiteral("/favicon.ico")), LinkIconType::Favicon, String(), std::nullopt });
 
     Vector<std::pair<WebCore::LinkIcon&, uint64_t>> iconDecisions;
-    iconDecisions.reserveInitialCapacity(icons.size());
-    for (auto& icon : icons) {
+    iconDecisions.reserveInitialCapacity(m_linkIcons.size());
+    for (auto& icon : m_linkIcons) {
         auto result = m_iconsPendingLoadDecision.add(nextIconCallbackID++, icon);
         iconDecisions.uncheckedAppend({ icon, result.iterator->key });
     }
index 67a5203..7cdbfb7 100644 (file)
@@ -32,7 +32,6 @@
 #include "CachedRawResourceClient.h"
 #include "CachedResourceHandle.h"
 #include "DocumentWriter.h"
-#include "IconDatabaseBase.h"
 #include "LinkIcon.h"
 #include "LoadTiming.h"
 #include "NavigationAction.h"
@@ -228,14 +227,6 @@ public:
     WEBCORE_EXPORT void cancelMainResourceLoad(const ResourceError&);
     void willContinueMainResourceLoadAfterRedirect(const ResourceRequest&);
 
-    // Support iconDatabase in synchronous mode.
-    void iconLoadDecisionAvailable();
-    
-    // Support iconDatabase in asynchronous mode.
-    void continueIconLoadWithDecision(IconLoadDecision);
-    void getIconLoadDecisionForIconURL(const String&);
-    void getIconDataForIconURL(const String&);
-
     bool isLoadingMainResource() const { return m_loadingMainResource; }
     bool isLoadingMultipartContent() const { return m_isLoadingMultipartContent; }
 
@@ -302,6 +293,8 @@ public:
     WEBCORE_EXPORT void didGetLoadDecisionForIcon(bool decision, uint64_t loadIdentifier, uint64_t newCallbackID);
     void finishedLoadingIcon(IconLoader&, SharedBuffer*);
 
+    const Vector<LinkIcon>& linkIcons() const { return m_linkIcons; }
+
 protected:
     WEBCORE_EXPORT DocumentLoader(const ResourceRequest&, const SubstituteData&);
 
@@ -456,13 +449,9 @@ private:
     bool m_waitingForContentPolicy { false };
     bool m_waitingForNavigationPolicy { false };
 
-    // For IconDatabase-style loads
-    RefPtr<IconLoadDecisionCallback> m_iconLoadDecisionCallback;
-    RefPtr<IconDataCallback> m_iconDataCallback;
-
-    // For IconLoadingClient-style loads
     HashMap<uint64_t, LinkIcon> m_iconsPendingLoadDecision;
     HashMap<std::unique_ptr<IconLoader>, uint64_t> m_iconLoaders;
+    Vector<LinkIcon> m_linkIcons;
 
     bool m_subresourceLoadersArePageCacheAcceptable { false };
     ShouldOpenExternalURLsPolicy m_shouldOpenExternalURLsPolicy { ShouldOpenExternalURLsPolicy::ShouldNotAllow };
index 861466f..33917aa 100644 (file)
@@ -76,7 +76,6 @@
 #include "HTTPParsers.h"
 #include "HistoryController.h"
 #include "HistoryItem.h"
-#include "IconController.h"
 #include "IgnoreOpensDuringUnloadCountIncrementer.h"
 #include "InspectorController.h"
 #include "InspectorInstrumentation.h"
@@ -263,7 +262,6 @@ FrameLoader::FrameLoader(Frame& frame, FrameLoaderClient& client)
     , m_history(std::make_unique<HistoryController>(frame))
     , m_notifier(frame)
     , m_subframeLoader(std::make_unique<SubframeLoader>(frame))
-    , m_icon(std::make_unique<IconController>(frame))
     , m_mixedContentChecker(frame)
     , m_state(FrameStateProvisional)
     , m_loadType(FrameLoadType::Standard)
@@ -498,8 +496,6 @@ void FrameLoader::stop()
         parser->stopParsing();
         parser->finish();
     }
-    
-    icon().stopLoader();
 }
 
 void FrameLoader::willTransitionToCommitted()
index f9f52b5..b43907b 100644 (file)
@@ -66,7 +66,6 @@ class FrameLoaderClient;
 class FrameNetworkingContext;
 class HistoryController;
 class HistoryItem;
-class IconController;
 class NavigationAction;
 class NetworkingContext;
 class Page;
@@ -101,7 +100,6 @@ public:
     HistoryController& history() const { return *m_history; }
     ResourceLoadNotifier& notifier() const { return m_notifier; }
     SubframeLoader& subframeLoader() const { return *m_subframeLoader; }
-    IconController& icon() const { return *m_icon; }
     MixedContentChecker& mixedContentChecker() const { return m_mixedContentChecker; }
 
     void setupForReplace();
@@ -397,7 +395,6 @@ private:
     mutable ResourceLoadNotifier m_notifier;
     const std::unique_ptr<SubframeLoader> m_subframeLoader;
     mutable FrameLoaderStateMachine m_stateMachine;
-    const std::unique_ptr<IconController> m_icon;
     mutable MixedContentChecker m_mixedContentChecker;
 
     class FrameProgressTracker;
index 3bb6df5..f03128b 100644 (file)
@@ -354,7 +354,6 @@ public:
 
     virtual void didRestoreScrollPosition() { }
 
-    virtual bool useIconLoadingClient() { return false; }
     virtual void getLoadDecisionForIcons(const Vector<std::pair<WebCore::LinkIcon&, uint64_t>>&) { }
     virtual void finishedLoadingIcon(uint64_t, SharedBuffer*) { }
 };
index c7c5fa6..112ad47 100644 (file)
@@ -41,7 +41,6 @@
 #include "HTMLIFrameElement.h"
 #include "HTMLNames.h"
 #include "HTMLObjectElement.h"
-#include "IconDatabase.h"
 #include "Image.h"
 #include "URLHash.h"
 #include "Logging.h"
@@ -529,14 +528,13 @@ RefPtr<LegacyWebArchive> LegacyWebArchive::create(const String& markupString, Fr
         }
     }
 
-    // Add favicon if one exists for this page, if we are archiving the entire page.
-    if (!nodes.isEmpty() && nodes[0]->isDocumentNode() && iconDatabase().isEnabled()) {
-        auto iconURL = iconDatabase().synchronousIconURLForPageURL(responseURL);
-        if (!iconURL.isEmpty() && iconDatabase().synchronousIconDataKnownForIconURL(iconURL)) {
-            if (auto* iconImage = iconDatabase().synchronousIconForPageURL(responseURL, IntSize(16, 16))) {
-                if (auto resource = ArchiveResource::create(iconImage->data(), URL(ParsedURLString, iconURL), "image/x-icon", "", ""))
-                    subresources.append(resource.releaseNonNull());
-            }
+    // If we are archiving the entire page, add any link icons that we have data for.
+    if (!nodes.isEmpty() && nodes[0]->isDocumentNode()) {
+        auto* documentLoader = frame.loader().documentLoader();
+        ASSERT(documentLoader);
+        for (auto& icon : documentLoader->linkIcons()) {
+            if (auto resource = documentLoader->subresource(icon.url))
+                subresources.append(resource.releaseNonNull());
         }
     }
 
diff --git a/Source/WebCore/loader/icon/IconController.cpp b/Source/WebCore/loader/icon/IconController.cpp
deleted file mode 100644 (file)
index 9a1a931..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * 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>
- * Copyright (C) Research In Motion Limited 2009. All rights reserved.
- * Copyright (C) 2011 Kris Jordan <krisjordan@gmail.com>
- * 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:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "IconController.h"
-
-#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 "IconLoader.h"
-#include "LinkIconType.h"
-#include "Logging.h"
-#include "MainFrame.h"
-#include "Page.h"
-#include "Settings.h"
-#include <wtf/text/CString.h>
-
-namespace WebCore {
-
-IconController::IconController(Frame& frame)
-    : m_frame(frame)
-{
-}
-
-IconController::~IconController()
-{
-}
-
-static URL iconFromLinkElements(Frame& frame)
-{
-    // This function returns the first icon with a mime type.
-    // If no icon with mime type exists, the last icon is returned.
-    // It may make more sense to always return the last icon,
-    // but this implementation is consistent with previous behavior.
-
-    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())
-            continue;
-        if (*linkElement.iconType() != LinkIconType::Favicon)
-            continue;
-        if (linkElement.href().isEmpty())
-            continue;
-        result = linkElement.href();
-        if (!linkElement.type().isEmpty())
-            break;
-    }
-
-    return result;
-}
-
-URL IconController::url()
-{
-    if (!m_frame.isMainFrame())
-        return URL();
-
-    auto icon = iconFromLinkElements(m_frame);
-    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 URL();
-}
-
-void IconController::commitToDatabase(const URL& icon)
-{
-    LOG(IconDatabase, "Committing iconURL %s to database for pageURLs %s and %s", icon.string().ascii().data(), m_frame.document()->url().string().ascii().data(), m_frame.loader().initialRequest().url().string().ascii().data());
-    iconDatabase().setIconURLForPageURL(icon.string(), m_frame.document()->url().string());
-    iconDatabase().setIconURLForPageURL(icon.string(), m_frame.loader().initialRequest().url().string());
-}
-
-void IconController::startLoader()
-{
-    // FIXME: We kick off the icon loader when the frame is done receiving its main resource.
-    // But we should instead do it when we're done parsing the head element.
-
-    if (!m_frame.isMainFrame())
-        return;
-
-    if (!iconDatabase().isEnabled())
-        return;
-
-    ASSERT(!m_frame.tree().parent());
-    if (!documentCanHaveIcon(m_frame.document()->url()))
-        return;
-
-    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.
-    // Now that we've accounted for URL mapping, avoid starting the network load if images aren't set to display automatically.
-    if (!m_frame.settings().loadsImagesAutomatically() && !m_frame.settings().loadsSiteIconsIgnoringImageLoadingSetting())
-        return;
-
-    // If we're reloading the page, always start the icon load now.
-    // FIXME: How can this condition ever be true?
-    if (m_frame.loader().loadType() == FrameLoadType::Reload && m_frame.loader().loadType() == FrameLoadType::ReloadFromOrigin) {
-        continueLoadWithDecision(IconLoadYes);
-        return;
-    }
-
-    if (iconDatabase().supportsAsynchronousMode()) {
-        // FIXME (<rdar://problem/9168605>) - We should support in-memory-only private browsing icons in asynchronous icon database mode.
-        if (m_frame.page() && m_frame.page()->usesEphemeralSession())
-            return;
-
-        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(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, iconURL.string().utf8().data());
-        m_waitingForLoadDecision = true;    
-        m_frame.loader().client().registerForIconNotification();
-        commitToDatabase(iconURL);
-        return;
-    }
-
-    continueLoadWithDecision(decision);
-}
-
-void IconController::stopLoader()
-{
-    if (m_iconLoader)
-        m_iconLoader->stopLoading();
-}
-
-// Callback for the old-style synchronous IconDatabase interface.
-void IconController::loadDecisionReceived(IconLoadDecision iconLoadDecision)
-{
-    if (!m_waitingForLoadDecision)
-        return;
-    LOG(IconDatabase, "IconController %p was told a load decision is available for its icon", this);
-    continueLoadWithDecision(iconLoadDecision);
-    m_waitingForLoadDecision = false;
-}
-
-void IconController::continueLoadWithDecision(IconLoadDecision iconLoadDecision)
-{
-    ASSERT(iconLoadDecision != IconLoadUnknown);
-
-    if (iconLoadDecision == IconLoadNo) {
-        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", iconURL.string().utf8().data());
-        commitToDatabase(iconURL);
-
-        if (iconDatabase().supportsAsynchronousMode()) {
-            m_frame.loader().documentLoader()->getIconDataForIconURL(iconURL.string());
-            return;
-        }
-
-        // We were told not to load this icon - that means this icon is already known by the database
-        // 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(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));
-        } else
-            m_frame.loader().client().dispatchDidReceiveIcon();
-
-        return;
-    } 
-
-    if (!m_iconLoader)
-        m_iconLoader = std::make_unique<IconLoader>(m_frame);
-
-    m_iconLoader->startLoading();
-}
-
-}
diff --git a/Source/WebCore/loader/icon/IconController.h b/Source/WebCore/loader/icon/IconController.h
deleted file mode 100644 (file)
index 31b1562..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009, 2011 Apple Inc. All rights reserved.
- * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
- * Copyright (C) Research In Motion Limited 2009. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.
- */
-
-#pragma once
-
-#include "IconDatabaseBase.h"
-
-namespace WebCore {
-
-class Frame;
-class IconLoader;
-class URL;
-
-class IconController {
-    WTF_MAKE_FAST_ALLOCATED;
-public:
-    explicit IconController(Frame&);
-    ~IconController();
-
-    WEBCORE_EXPORT URL url();
-
-    void startLoader();
-    void stopLoader();
-
-    void loadDecisionReceived(IconLoadDecision);
-    void continueLoadWithDecision(IconLoadDecision);
-
-    void commitToDatabase(const URL& icon);
-
-private:
-    Frame& m_frame;
-    std::unique_ptr<IconLoader> m_iconLoader;
-    bool m_waitingForLoadDecision { false };
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/loader/icon/IconDatabase.cpp b/Source/WebCore/loader/icon/IconDatabase.cpp
deleted file mode 100644 (file)
index 598c939..0000000
+++ /dev/null
@@ -1,2132 +0,0 @@
-/*
- * Copyright (C) 2006-2017 Apple Inc. All rights reserved.
- * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "IconDatabase.h"
-
-#if ENABLE(ICONDATABASE)
-
-#include "DocumentLoader.h"
-#include "FileSystem.h"
-#include "IconDatabaseClient.h"
-#include "IconRecord.h"
-#include "Image.h"
-#include "Logging.h"
-#include "SQLiteStatement.h"
-#include "SQLiteTransaction.h"
-#include "SuddenTermination.h"
-#include <wtf/AutodrainedPool.h>
-#include <wtf/MainThread.h>
-#include <wtf/NeverDestroyed.h>
-#include <wtf/StdLibExtras.h>
-
-// For methods that are meant to support API from the main thread - should not be called internally
-#define ASSERT_NOT_SYNC_THREAD() ASSERT(!m_syncThreadRunning || !IS_ICON_SYNC_THREAD())
-
-// For methods that are meant to support the sync thread ONLY
-#define IS_ICON_SYNC_THREAD() (m_syncThread->id() == currentThread())
-#define ASSERT_ICON_SYNC_THREAD() ASSERT(IS_ICON_SYNC_THREAD())
-
-#if PLATFORM(GTK)
-#define CAN_THEME_URL_ICON
-#endif
-
-namespace WebCore {
-
-static int databaseCleanupCounter = 0;
-
-// This version number is in the DB and marks the current generation of the schema
-// Currently, a mismatched schema causes the DB to be wiped and reset.  This isn't 
-// so bad during development but in the future, we would need to write a conversion
-// function to advance older released schemas to "current"
-static const int currentDatabaseVersion = 6;
-
-// Icons expire once every 4 days
-static const int iconExpirationTime = 60*60*24*4; 
-
-static const Seconds updateTimerDelay { 5_s };
-
-static bool checkIntegrityOnOpen = false;
-
-#if PLATFORM(GTK)
-// We are not interested in icons that have been unused for more than
-// 30 days, delete them even if they have not been explicitly released.
-static const int notUsedIconExpirationTime = 60*60*24*30;
-#endif
-
-#if !LOG_DISABLED || !ERROR_DISABLED
-static String urlForLogging(const String& url)
-{
-    static const unsigned urlTruncationLength = 120;
-
-    if (url.length() < urlTruncationLength)
-        return url;
-    return url.substring(0, urlTruncationLength) + "...";
-}
-#endif
-
-class DefaultIconDatabaseClient final : public IconDatabaseClient {
-    WTF_MAKE_FAST_ALLOCATED;
-public:
-    void didImportIconURLForPageURL(const String&) override { }
-    void didImportIconDataForPageURL(const String&) override { }
-    void didChangeIconForPageURL(const String&) override { }
-    void didRemoveAllIcons() override { }
-    void didFinishURLImport() override { }
-};
-
-static IconDatabaseClient* defaultClient() 
-{
-    static IconDatabaseClient* defaultClient = new DefaultIconDatabaseClient;
-    return defaultClient;
-}
-
-// ************************
-// *** Main Thread Only ***
-// ************************
-
-void IconDatabase::setClient(IconDatabaseClient* client)
-{
-    // We don't allow a null client, because we never null check it anywhere in this code
-    // Also don't allow a client change after the thread has already began 
-    // (setting the client should occur before the database is opened)
-    ASSERT(client);
-    ASSERT(!m_syncThreadRunning);
-    if (!client || m_syncThreadRunning)
-        return;
-        
-    m_client = client;
-}
-
-bool IconDatabase::open(const String& directory, const String& filename)
-{
-    ASSERT_NOT_SYNC_THREAD();
-
-    if (!m_isEnabled)
-        return false;
-
-    if (isOpen()) {
-        LOG_ERROR("Attempt to reopen the IconDatabase which is already open.  Must close it first.");
-        return false;
-    }
-
-    m_databaseDirectory = directory.isolatedCopy();
-
-    // Formulate the full path for the database file
-    m_completeDatabasePath = pathByAppendingComponent(m_databaseDirectory, filename);
-
-    // Lock here as well as first thing in the thread so the thread doesn't actually commence until the createThread() call 
-    // completes and m_syncThreadRunning is properly set
-    m_syncLock.lock();
-    m_syncThread = Thread::create("WebCore: IconDatabase", [this] {
-        iconDatabaseSyncThread();
-    });
-    m_syncThreadRunning = m_syncThread;
-    m_syncLock.unlock();
-    if (!m_syncThread)
-        return false;
-    return true;
-}
-
-void IconDatabase::close()
-{
-    ASSERT_NOT_SYNC_THREAD();
-    
-    if (m_syncThreadRunning) {
-        // Set the flag to tell the sync thread to wrap it up
-        m_threadTerminationRequested = true;
-
-        // Wake up the sync thread if it's waiting
-        wakeSyncThread();
-        
-        // Wait for the sync thread to terminate
-        m_syncThread->waitForCompletion();
-    }
-
-    m_syncThreadRunning = false;    
-    m_threadTerminationRequested = false;
-    m_removeIconsRequested = false;
-
-    m_syncDB.close();
-
-    // If there are still main thread callbacks in flight then the database might not actually be closed yet.
-    // But if it is closed, notify the client now.
-    if (!isOpen() && m_client)
-        m_client->didClose();
-}
-
-void IconDatabase::removeAllIcons()
-{
-    ASSERT_NOT_SYNC_THREAD();
-    
-    if (!isOpen())
-        return;
-
-    LOG(IconDatabase, "Requesting background thread to remove all icons");
-    
-    // Clear the in-memory record of every IconRecord, anything waiting to be read from disk, and anything waiting to be written to disk
-    {
-        LockHolder locker(m_urlAndIconLock);
-        
-        // Clear the IconRecords for every page URL - RefCounting will cause the IconRecords themselves to be deleted
-        // We don't delete the actual PageRecords because we have the "retain icon for url" count to keep track of
-        for (auto& pageURL : m_pageURLToRecordMap.values())
-            pageURL->setIconRecord(nullptr);
-
-        // Clear the iconURL -> IconRecord map
-        m_iconURLToRecordMap.clear();
-                    
-        // Clear all in-memory records of things that need to be synced out to disk
-        {
-            LockHolder locker(m_pendingSyncLock);
-            m_pageURLsPendingSync.clear();
-            m_iconsPendingSync.clear();
-        }
-        
-        // Clear all in-memory records of things that need to be read in from disk
-        {
-            LockHolder locker(m_pendingReadingLock);
-            m_pageURLsPendingImport.clear();
-            m_pageURLsInterestedInIcons.clear();
-            m_iconsPendingReading.clear();
-            m_loadersPendingDecision.clear();
-        }
-    }
-    
-    m_removeIconsRequested = true;
-    wakeSyncThread();
-}
-
-Image* IconDatabase::synchronousIconForPageURL(const String& pageURLOriginal, const IntSize& size)
-{   
-    ASSERT_NOT_SYNC_THREAD();
-
-    // pageURLOriginal cannot be stored without being deep copied first.  
-    // We should go our of our way to only copy it if we have to store it
-    
-    if (!isOpen() || !documentCanHaveIcon(pageURLOriginal))
-        return nullptr;
-
-    LockHolder locker(m_urlAndIconLock);
-
-    performPendingRetainAndReleaseOperations();
-    
-    String pageURLCopy; // Creates a null string for easy testing
-    
-    PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURLOriginal);
-    if (!pageRecord) {
-        pageURLCopy = pageURLOriginal.isolatedCopy();
-        pageRecord = getOrCreatePageURLRecord(pageURLCopy);
-    }
-    
-    // If pageRecord is NULL, one of two things is true -
-    // 1 - The initial url import is incomplete and this pageURL was marked to be notified once it is complete if an iconURL exists
-    // 2 - The initial url import IS complete and this pageURL has no icon
-    if (!pageRecord) {
-        LockHolder locker(m_pendingReadingLock);
-        
-        // Import is ongoing, there might be an icon.  In this case, register to be notified when the icon comes in
-        // If we ever reach this condition, we know we've already made the pageURL copy
-        if (!m_iconURLImportComplete)
-            m_pageURLsInterestedInIcons.add(pageURLCopy);
-        
-        return nullptr;
-    }
-
-    IconRecord* iconRecord = pageRecord->iconRecord();
-    
-    // If the initial URL import isn't complete, it's possible to have a PageURL record without an associated icon
-    // In this case, the pageURL is already in the set to alert the client when the iconURL mapping is complete so
-    // we can just bail now
-    if (!m_iconURLImportComplete && !iconRecord)
-        return nullptr;
-
-    // Assuming we're done initializing and cleanup is allowed,
-    // the only way we should *not* have an icon record is if this pageURL is retained but has no icon yet.
-    ASSERT(iconRecord || databaseCleanupCounter || m_retainedPageURLs.contains(pageURLOriginal));
-    
-    if (!iconRecord)
-        return nullptr;
-        
-    // If it's a new IconRecord object that doesn't have its imageData set yet,
-    // mark it to be read by the background thread
-    if (iconRecord->imageDataStatus() == ImageDataStatusUnknown) {
-        if (pageURLCopy.isNull())
-            pageURLCopy = pageURLOriginal.isolatedCopy();
-    
-        LockHolder locker(m_pendingReadingLock);
-        m_pageURLsInterestedInIcons.add(pageURLCopy);
-        m_iconsPendingReading.add(iconRecord);
-        wakeSyncThread();
-        return nullptr;
-    }
-    
-    // If the size parameter was (0, 0) that means the caller of this method just wanted the read from disk to be kicked off
-    // and isn't actually interested in the image return value
-    if (size == IntSize(0, 0))
-        return nullptr;
-        
-    // PARANOID DISCUSSION: This method makes some assumptions.  It returns a WebCore::image which the icon database might dispose of at anytime in the future,
-    // and Images aren't ref counted.  So there is no way for the client to guarantee continued existence of the image.
-    // This has *always* been the case, but in practice clients would always create some other platform specific representation of the image
-    // and drop the raw Image*.  On Mac an NSImage, and on windows drawing into an HBITMAP.
-    // The async aspect adds a huge question - what if the image is deleted before the platform specific API has a chance to create its own
-    // representation out of it?
-    // If an image is read in from the icondatabase, we do *not* overwrite any image data that exists in the in-memory cache.  
-    // This is because we make the assumption that anything in memory is newer than whatever is in the database.
-    // So the only time the data will be set from the second thread is when it is INITIALLY being read in from the database, but we would never 
-    // delete the image on the secondary thread if the image already exists.
-    return iconRecord->image(size);
-}
-
-NativeImagePtr IconDatabase::synchronousNativeIconForPageURL(const String& pageURLOriginal, const IntSize& size)
-{
-    Image* icon = synchronousIconForPageURL(pageURLOriginal, size);
-    if (!icon)
-        return nullptr;
-
-    LockHolder locker(m_urlAndIconLock);
-    return icon->nativeImageForCurrentFrame();
-}
-
-void IconDatabase::readIconForPageURLFromDisk(const String& pageURL)
-{
-    // The effect of asking for an Icon for a pageURL automatically queues it to be read from disk
-    // if it hasn't already been set in memory.  The special IntSize (0, 0) is a special way of telling 
-    // that method "I don't care about the actual Image, i just want you to make sure you're getting it from disk.
-    synchronousIconForPageURL(pageURL, IntSize(0, 0));
-}
-
-String IconDatabase::synchronousIconURLForPageURL(const String& pageURLOriginal)
-{    
-    ASSERT_NOT_SYNC_THREAD(); 
-        
-    // Cannot do anything with pageURLOriginal that would end up storing it without deep copying first
-    // Also, in the case we have a real answer for the caller, we must deep copy that as well
-    
-    if (!isOpen() || !documentCanHaveIcon(pageURLOriginal))
-        return String();
-        
-    LockHolder locker(m_urlAndIconLock);
-    
-    PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURLOriginal);
-    if (!pageRecord)
-        pageRecord = getOrCreatePageURLRecord(pageURLOriginal.isolatedCopy());
-    
-    // If pageRecord is NULL, one of two things is true -
-    // 1 - The initial url import is incomplete and this pageURL has already been marked to be notified once it is complete if an iconURL exists
-    // 2 - The initial url import IS complete and this pageURL has no icon
-    if (!pageRecord)
-        return String();
-    
-    // Possible the pageRecord is around because it's a retained pageURL with no iconURL, so we have to check
-    return pageRecord->iconRecord() ? pageRecord->iconRecord()->iconURL().isolatedCopy() : String();
-}
-
-#ifdef CAN_THEME_URL_ICON
-static inline void loadDefaultIconRecord(IconRecord* defaultIconRecord)
-{
-     defaultIconRecord->loadImageFromResource("urlIcon");
-}
-#else
-static inline void loadDefaultIconRecord(IconRecord* defaultIconRecord)
-{
-    static const unsigned char defaultIconData[] = { 0x4D, 0x4D, 0x00, 0x2A, 0x00, 0x00, 0x03, 0x32, 0x80, 0x00, 0x20, 0x50, 0x38, 0x24, 0x16, 0x0D, 0x07, 0x84, 0x42, 0x61, 0x50, 0xB8, 
-        0x64, 0x08, 0x18, 0x0D, 0x0A, 0x0B, 0x84, 0xA2, 0xA1, 0xE2, 0x08, 0x5E, 0x39, 0x28, 0xAF, 0x48, 0x24, 0xD3, 0x53, 0x9A, 0x37, 0x1D, 0x18, 0x0E, 0x8A, 0x4B, 0xD1, 0x38, 
-        0xB0, 0x7C, 0x82, 0x07, 0x03, 0x82, 0xA2, 0xE8, 0x6C, 0x2C, 0x03, 0x2F, 0x02, 0x82, 0x41, 0xA1, 0xE2, 0xF8, 0xC8, 0x84, 0x68, 0x6D, 0x1C, 0x11, 0x0A, 0xB7, 0xFA, 0x91, 
-        0x6E, 0xD1, 0x7F, 0xAF, 0x9A, 0x4E, 0x87, 0xFB, 0x19, 0xB0, 0xEA, 0x7F, 0xA4, 0x95, 0x8C, 0xB7, 0xF9, 0xA9, 0x0A, 0xA9, 0x7F, 0x8C, 0x88, 0x66, 0x96, 0xD4, 0xCA, 0x69, 
-        0x2F, 0x00, 0x81, 0x65, 0xB0, 0x29, 0x90, 0x7C, 0xBA, 0x2B, 0x21, 0x1E, 0x5C, 0xE6, 0xB4, 0xBD, 0x31, 0xB6, 0xE7, 0x7A, 0xBF, 0xDD, 0x6F, 0x37, 0xD3, 0xFD, 0xD8, 0xF2, 
-        0xB6, 0xDB, 0xED, 0xAC, 0xF7, 0x03, 0xC5, 0xFE, 0x77, 0x53, 0xB6, 0x1F, 0xE6, 0x24, 0x8B, 0x1D, 0xFE, 0x26, 0x20, 0x9E, 0x1C, 0xE0, 0x80, 0x65, 0x7A, 0x18, 0x02, 0x01, 
-        0x82, 0xC5, 0xA0, 0xC0, 0xF1, 0x89, 0xBA, 0x23, 0x30, 0xAD, 0x1F, 0xE7, 0xE5, 0x5B, 0x6D, 0xFE, 0xE7, 0x78, 0x3E, 0x1F, 0xEE, 0x97, 0x8B, 0xE7, 0x37, 0x9D, 0xCF, 0xE7, 
-        0x92, 0x8B, 0x87, 0x0B, 0xFC, 0xA0, 0x8E, 0x68, 0x3F, 0xC6, 0x27, 0xA6, 0x33, 0xFC, 0x36, 0x5B, 0x59, 0x3F, 0xC1, 0x02, 0x63, 0x3B, 0x74, 0x00, 0x03, 0x07, 0x0B, 0x61, 
-        0x00, 0x20, 0x60, 0xC9, 0x08, 0x00, 0x1C, 0x25, 0x9F, 0xE0, 0x12, 0x8A, 0xD5, 0xFE, 0x6B, 0x4F, 0x35, 0x9F, 0xED, 0xD7, 0x4B, 0xD9, 0xFE, 0x8A, 0x59, 0xB8, 0x1F, 0xEC, 
-        0x56, 0xD3, 0xC1, 0xFE, 0x63, 0x4D, 0xF2, 0x83, 0xC6, 0xB6, 0x1B, 0xFC, 0x34, 0x68, 0x61, 0x3F, 0xC1, 0xA6, 0x25, 0xEB, 0xFC, 0x06, 0x58, 0x5C, 0x3F, 0xC0, 0x03, 0xE4, 
-        0xC3, 0xFC, 0x04, 0x0F, 0x1A, 0x6F, 0xE0, 0xE0, 0x20, 0xF9, 0x61, 0x7A, 0x02, 0x28, 0x2B, 0xBC, 0x46, 0x25, 0xF3, 0xFC, 0x66, 0x3D, 0x99, 0x27, 0xF9, 0x7E, 0x6B, 0x1D, 
-        0xC7, 0xF9, 0x2C, 0x5E, 0x1C, 0x87, 0xF8, 0xC0, 0x4D, 0x9A, 0xE7, 0xF8, 0xDA, 0x51, 0xB2, 0xC1, 0x68, 0xF2, 0x64, 0x1F, 0xE1, 0x50, 0xED, 0x0A, 0x04, 0x23, 0x79, 0x8A, 
-        0x7F, 0x82, 0xA3, 0x39, 0x80, 0x7F, 0x80, 0xC2, 0xB1, 0x5E, 0xF7, 0x04, 0x2F, 0xB2, 0x10, 0x02, 0x86, 0x63, 0xC9, 0xCC, 0x07, 0xBF, 0x87, 0xF8, 0x4A, 0x38, 0xAF, 0xC1, 
-        0x88, 0xF8, 0x66, 0x1F, 0xE1, 0xD9, 0x08, 0xD4, 0x8F, 0x25, 0x5B, 0x4A, 0x49, 0x97, 0x87, 0x39, 0xFE, 0x25, 0x12, 0x10, 0x68, 0xAA, 0x4A, 0x2F, 0x42, 0x29, 0x12, 0x69, 
-        0x9F, 0xE1, 0xC1, 0x00, 0x67, 0x1F, 0xE1, 0x58, 0xED, 0x00, 0x83, 0x23, 0x49, 0x82, 0x7F, 0x81, 0x21, 0xE0, 0xFC, 0x73, 0x21, 0x00, 0x50, 0x7D, 0x2B, 0x84, 0x03, 0x83, 
-        0xC2, 0x1B, 0x90, 0x06, 0x69, 0xFE, 0x23, 0x91, 0xAE, 0x50, 0x9A, 0x49, 0x32, 0xC2, 0x89, 0x30, 0xE9, 0x0A, 0xC4, 0xD9, 0xC4, 0x7F, 0x94, 0xA6, 0x51, 0xDE, 0x7F, 0x9D, 
-        0x07, 0x89, 0xF6, 0x7F, 0x91, 0x85, 0xCA, 0x88, 0x25, 0x11, 0xEE, 0x50, 0x7C, 0x43, 0x35, 0x21, 0x60, 0xF1, 0x0D, 0x82, 0x62, 0x39, 0x07, 0x2C, 0x20, 0xE0, 0x80, 0x72, 
-        0x34, 0x17, 0xA1, 0x80, 0xEE, 0xF0, 0x89, 0x24, 0x74, 0x1A, 0x2C, 0x93, 0xB3, 0x78, 0xCC, 0x52, 0x9D, 0x6A, 0x69, 0x56, 0xBB, 0x0D, 0x85, 0x69, 0xE6, 0x7F, 0x9E, 0x27, 
-        0xB9, 0xFD, 0x50, 0x54, 0x47, 0xF9, 0xCC, 0x78, 0x9F, 0x87, 0xF9, 0x98, 0x70, 0xB9, 0xC2, 0x91, 0x2C, 0x6D, 0x1F, 0xE1, 0xE1, 0x00, 0xBF, 0x02, 0xC1, 0xF5, 0x18, 0x84,
-        0x01, 0xE1, 0x48, 0x8C, 0x42, 0x07, 0x43, 0xC9, 0x76, 0x7F, 0x8B, 0x04, 0xE4, 0xDE, 0x35, 0x95, 0xAB, 0xB0, 0xF0, 0x5C, 0x55, 0x23, 0xF9, 0x7E, 0x7E, 0x9F, 0xE4, 0x0C, 
-        0xA7, 0x55, 0x47, 0xC7, 0xF9, 0xE6, 0xCF, 0x1F, 0xE7, 0x93, 0x35, 0x52, 0x54, 0x63, 0x19, 0x46, 0x73, 0x1F, 0xE2, 0x61, 0x08, 0xF0, 0x82, 0xE1, 0x80, 0x92, 0xF9, 0x20, 
-        0xC0, 0x28, 0x18, 0x0A, 0x05, 0xA1, 0xA2, 0xF8, 0x6E, 0xDB, 0x47, 0x49, 0xFE, 0x3E, 0x17, 0xB6, 0x61, 0x13, 0x1A, 0x29, 0x26, 0xA9, 0xFE, 0x7F, 0x92, 0x70, 0x69, 0xFE, 
-        0x4C, 0x2F, 0x55, 0x01, 0xF1, 0x54, 0xD4, 0x35, 0x49, 0x4A, 0x69, 0x59, 0x83, 0x81, 0x58, 0x76, 0x9F, 0xE2, 0x20, 0xD6, 0x4C, 0x9B, 0xA0, 0x48, 0x1E, 0x0B, 0xB7, 0x48, 
-        0x58, 0x26, 0x11, 0x06, 0x42, 0xE8, 0xA4, 0x40, 0x17, 0x27, 0x39, 0x00, 0x60, 0x2D, 0xA4, 0xC3, 0x2C, 0x7F, 0x94, 0x56, 0xE4, 0xE1, 0x77, 0x1F, 0xE5, 0xB9, 0xD7, 0x66, 
-        0x1E, 0x07, 0xB3, 0x3C, 0x63, 0x1D, 0x35, 0x49, 0x0E, 0x63, 0x2D, 0xA2, 0xF1, 0x12, 0x60, 0x1C, 0xE0, 0xE0, 0x52, 0x1B, 0x8B, 0xAC, 0x38, 0x0E, 0x07, 0x03, 0x60, 0x28, 
-        0x1C, 0x0E, 0x87, 0x00, 0xF0, 0x66, 0x27, 0x11, 0xA2, 0xC1, 0x02, 0x5A, 0x1C, 0xE4, 0x21, 0x83, 0x1F, 0x13, 0x86, 0xFA, 0xD2, 0x55, 0x1D, 0xD6, 0x61, 0xBC, 0x77, 0xD3, 
-        0xE6, 0x91, 0xCB, 0x4C, 0x90, 0xA6, 0x25, 0xB8, 0x2F, 0x90, 0xC5, 0xA9, 0xCE, 0x12, 0x07, 0x02, 0x91, 0x1B, 0x9F, 0x68, 0x00, 0x16, 0x76, 0x0D, 0xA1, 0x00, 0x08, 0x06, 
-        0x03, 0x81, 0xA0, 0x20, 0x1A, 0x0D, 0x06, 0x80, 0x30, 0x24, 0x12, 0x89, 0x20, 0x98, 0x4A, 0x1F, 0x0F, 0x21, 0xA0, 0x9E, 0x36, 0x16, 0xC2, 0x88, 0xE6, 0x48, 0x9B, 0x83, 
-        0x31, 0x1C, 0x55, 0x1E, 0x43, 0x59, 0x1A, 0x56, 0x1E, 0x42, 0xF0, 0xFA, 0x4D, 0x1B, 0x9B, 0x08, 0xDC, 0x5B, 0x02, 0xA1, 0x30, 0x7E, 0x3C, 0xEE, 0x5B, 0xA6, 0xDD, 0xB8, 
-        0x6D, 0x5B, 0x62, 0xB7, 0xCD, 0xF3, 0x9C, 0xEA, 0x04, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x01, 
-        0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x03, 0xE0, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 
-        0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x01, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x01, 0x11, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 
-        0x00, 0x08, 0x01, 0x15, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x01, 0x16, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x01, 0x17, 
-        0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x29, 0x01, 0x1A, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0xE8, 0x01, 0x1B, 0x00, 0x05, 0x00, 0x00, 
-        0x00, 0x01, 0x00, 0x00, 0x03, 0xF0, 0x01, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 
-        0x00, 0x00, 0x01, 0x52, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0A, 
-        0xFC, 0x80, 0x00, 0x00, 0x27, 0x10, 0x00, 0x0A, 0xFC, 0x80, 0x00, 0x00, 0x27, 0x10 };
-        
-    static auto& defaultIconBuffer = SharedBuffer::create(defaultIconData, sizeof(defaultIconData)).leakRef();
-    defaultIconRecord->setImageData(&defaultIconBuffer);
-}
-#endif
-
-Image* IconDatabase::defaultIcon(const IntSize& size)
-{
-    ASSERT_NOT_SYNC_THREAD();
-
-    
-    if (!m_defaultIconRecord) {
-        m_defaultIconRecord = IconRecord::create("urlIcon");
-        loadDefaultIconRecord(m_defaultIconRecord.get());
-    }
-    
-    return m_defaultIconRecord->image(size);
-}
-
-void IconDatabase::retainIconForPageURL(const String& pageURL)
-{
-    ASSERT_NOT_SYNC_THREAD();
-
-    if (!isEnabled() || !documentCanHaveIcon(pageURL))
-        return;
-
-    {
-        LockHolder locker(m_urlsToRetainOrReleaseLock);
-        m_urlsToRetain.add(pageURL.isolatedCopy());
-        m_retainOrReleaseIconRequested = true;
-    }
-
-    scheduleOrDeferSyncTimer();
-}
-
-void IconDatabase::performRetainIconForPageURL(const String& pageURLOriginal, int retainCount)
-{
-    PageURLRecord* record = m_pageURLToRecordMap.get(pageURLOriginal);
-    
-    String pageURL;
-    
-    if (!record) {
-        pageURL = pageURLOriginal.isolatedCopy();
-
-        record = new PageURLRecord(pageURL);
-        m_pageURLToRecordMap.set(pageURL, record);
-    }
-    
-    if (!record->retain(retainCount)) {
-        if (pageURL.isNull())
-            pageURL = pageURLOriginal.isolatedCopy();
-
-        // This page just had its retain count bumped from 0 to 1 - Record that fact
-        m_retainedPageURLs.add(pageURL);
-
-        // If we read the iconURLs yet, we want to avoid any pageURL->iconURL lookups and the pageURLsPendingDeletion is moot, 
-        // so we bail here and skip those steps
-        if (!m_iconURLImportComplete)
-            return;
-
-        LockHolder locker(m_pendingSyncLock);
-        // If this pageURL waiting to be sync'ed, update the sync record
-        // This saves us in the case where a page was ready to be deleted from the database but was just retained - so theres no need to delete it!
-        if (!m_privateBrowsingEnabled && m_pageURLsPendingSync.contains(pageURL)) {
-            LOG(IconDatabase, "Bringing %s back from the brink", pageURL.ascii().data());
-            m_pageURLsPendingSync.set(pageURL, record->snapshot());
-        }
-    }
-}
-
-void IconDatabase::releaseIconForPageURL(const String& pageURL)
-{
-    ASSERT_NOT_SYNC_THREAD();
-        
-    // Cannot do anything with pageURLOriginal that would end up storing it without deep copying first
-    
-    if (!isEnabled() || !documentCanHaveIcon(pageURL))
-        return;
-
-    {
-        LockHolder locker(m_urlsToRetainOrReleaseLock);
-        m_urlsToRelease.add(pageURL.isolatedCopy());
-        m_retainOrReleaseIconRequested = true;
-    }
-    scheduleOrDeferSyncTimer();
-}
-
-void IconDatabase::performReleaseIconForPageURL(const String& pageURLOriginal, int releaseCount)
-{
-    // Check if this pageURL is actually retained
-    if (!m_retainedPageURLs.contains(pageURLOriginal)) {
-        LOG_ERROR("Attempting to release icon for URL %s which is not retained", urlForLogging(pageURLOriginal).ascii().data());
-        return;
-    }
-    
-    // Get its retain count - if it's retained, we'd better have a PageURLRecord for it
-    PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURLOriginal);
-    ASSERT(pageRecord);
-    LOG(IconDatabase, "Releasing pageURL %s to a retain count of %i", urlForLogging(pageURLOriginal).ascii().data(), pageRecord->retainCount() - 1);
-    ASSERT(pageRecord->retainCount() > 0);
-        
-    // If it still has a positive retain count, store the new count and bail
-    if (pageRecord->release(releaseCount))
-        return;
-        
-    // This pageRecord has now been fully released.  Do the appropriate cleanup
-    LOG(IconDatabase, "No more retainers for PageURL %s", urlForLogging(pageURLOriginal).ascii().data());
-    m_pageURLToRecordMap.remove(pageURLOriginal);
-    m_retainedPageURLs.remove(pageURLOriginal);       
-    
-    // Grab the iconRecord for later use (and do a sanity check on it for kicks)
-    IconRecord* iconRecord = pageRecord->iconRecord();
-    
-    ASSERT(!iconRecord || (iconRecord && m_iconURLToRecordMap.get(iconRecord->iconURL()) == iconRecord));
-
-    {
-        LockHolder locker(m_pendingReadingLock);
-        
-        // Since this pageURL is going away, there's no reason anyone would ever be interested in its read results    
-        if (!m_iconURLImportComplete)
-            m_pageURLsPendingImport.remove(pageURLOriginal);
-        m_pageURLsInterestedInIcons.remove(pageURLOriginal);
-        
-        // If this icon is down to it's last retainer, we don't care about reading it in from disk anymore
-        if (iconRecord && iconRecord->hasOneRef()) {
-            m_iconURLToRecordMap.remove(iconRecord->iconURL());
-            m_iconsPendingReading.remove(iconRecord);
-        }
-    }
-    
-    // Mark stuff for deletion from the database only if we're not in private browsing
-    if (!m_privateBrowsingEnabled) {
-        LockHolder locker(m_pendingSyncLock);
-        m_pageURLsPendingSync.set(pageURLOriginal.isolatedCopy(), pageRecord->snapshot(true));
-    
-        // If this page is the last page to refer to a particular IconRecord, that IconRecord needs to
-        // be marked for deletion
-        if (iconRecord && iconRecord->hasOneRef())
-            m_iconsPendingSync.set(iconRecord->iconURL(), iconRecord->snapshot(true));
-    }
-    
-    delete pageRecord;
-}
-
-void IconDatabase::setIconDataForIconURL(SharedBuffer* dataOriginal, const String& iconURLOriginal)
-{    
-    ASSERT_NOT_SYNC_THREAD();
-    
-    // Cannot do anything with dataOriginal or iconURLOriginal that would end up storing them without deep copying first
-    
-    if (!isOpen() || iconURLOriginal.isEmpty())
-        return;
-    
-    auto data = dataOriginal ? RefPtr<SharedBuffer> { dataOriginal->copy() } : nullptr;
-    String iconURL = iconURLOriginal.isolatedCopy();
-    
-    Vector<String> pageURLs;
-    {
-        LockHolder locker(m_urlAndIconLock);
-    
-        // If this icon was pending a read, remove it from that set because this new data should override what is on disk
-        RefPtr<IconRecord> icon = m_iconURLToRecordMap.get(iconURL);
-        if (icon) {
-            LockHolder locker(m_pendingReadingLock);
-            m_iconsPendingReading.remove(icon.get());
-        } else
-            icon = getOrCreateIconRecord(iconURL);
-    
-        // Update the data and set the time stamp
-        icon->setImageData(WTFMove(data));
-        icon->setTimestamp((int)currentTime());
-        
-        // Copy the current retaining pageURLs - if any - to notify them of the change
-        pageURLs.appendRange(icon->retainingPageURLs().begin(), icon->retainingPageURLs().end());
-        
-        // Mark the IconRecord as requiring an update to the database only if private browsing is disabled
-        if (!m_privateBrowsingEnabled) {
-            LockHolder locker(m_pendingSyncLock);
-            m_iconsPendingSync.set(iconURL, icon->snapshot());
-        }
-
-        if (icon->hasOneRef()) {
-            ASSERT(icon->retainingPageURLs().isEmpty());
-            LOG(IconDatabase, "Icon for icon url %s is about to be destroyed - removing mapping for it", urlForLogging(icon->iconURL()).ascii().data());
-            m_iconURLToRecordMap.remove(icon->iconURL());
-        }
-    }
-
-    // Send notification out regarding all PageURLs that retain this icon
-    // But not if we're on the sync thread because that implies this mapping
-    // comes from the initial import which we don't want notifications for
-    if (!IS_ICON_SYNC_THREAD()) {
-        // Start the timer to commit this change - or further delay the timer if it was already started
-        scheduleOrDeferSyncTimer();
-
-        for (auto& pageURL : pageURLs) {
-            AutodrainedPool pool;
-
-            LOG(IconDatabase, "Dispatching notification that retaining pageURL %s has a new icon", urlForLogging(pageURL).ascii().data());
-            m_client->didChangeIconForPageURL(pageURL);
-        }
-    }
-}
-
-void IconDatabase::setIconURLForPageURL(const String& iconURLOriginal, const String& pageURLOriginal)
-{    
-    ASSERT_NOT_SYNC_THREAD();
-
-    // Cannot do anything with iconURLOriginal or pageURLOriginal that would end up storing them without deep copying first
-    
-    ASSERT(!iconURLOriginal.isEmpty());
-        
-    if (!isOpen() || !documentCanHaveIcon(pageURLOriginal))
-        return;
-    
-    String iconURL, pageURL;
-    
-    {
-        LockHolder locker(m_urlAndIconLock);
-
-        PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURLOriginal);
-        
-        // If the urls already map to each other, bail.
-        // This happens surprisingly often, and seems to cream iBench performance
-        if (pageRecord && pageRecord->iconRecord() && pageRecord->iconRecord()->iconURL() == iconURLOriginal)
-            return;
-            
-        pageURL = pageURLOriginal.isolatedCopy();
-        iconURL = iconURLOriginal.isolatedCopy();
-
-        if (!pageRecord) {
-            pageRecord = new PageURLRecord(pageURL);
-            m_pageURLToRecordMap.set(pageURL, pageRecord);
-        }
-
-        RefPtr<IconRecord> iconRecord = pageRecord->iconRecord();
-
-        // Otherwise, set the new icon record for this page
-        pageRecord->setIconRecord(getOrCreateIconRecord(iconURL));
-
-        // If the current icon has only a single ref left, it is about to get wiped out. 
-        // Remove it from the in-memory records and don't bother reading it in from disk anymore
-        if (iconRecord && iconRecord->hasOneRef()) {
-            ASSERT(iconRecord->retainingPageURLs().size() == 0);
-            LOG(IconDatabase, "Icon for icon url %s is about to be destroyed - removing mapping for it", urlForLogging(iconRecord->iconURL()).ascii().data());
-            m_iconURLToRecordMap.remove(iconRecord->iconURL());
-            LockHolder locker(m_pendingReadingLock);
-            m_iconsPendingReading.remove(iconRecord.get());
-        }
-        
-        // And mark this mapping to be added to the database
-        if (!m_privateBrowsingEnabled) {
-            LockHolder locker(m_pendingSyncLock);
-            m_pageURLsPendingSync.set(pageURL, pageRecord->snapshot());
-            
-            // If the icon is on its last ref, mark it for deletion
-            if (iconRecord && iconRecord->hasOneRef())
-                m_iconsPendingSync.set(iconRecord->iconURL(), iconRecord->snapshot(true));
-        }
-    }
-
-    // Since this mapping is new, send the notification out - but not if we're on the sync thread because that implies this mapping
-    // comes from the initial import which we don't want notifications for
-    if (!IS_ICON_SYNC_THREAD()) {
-        // Start the timer to commit this change - or further delay the timer if it was already started
-        scheduleOrDeferSyncTimer();
-        
-        LOG(IconDatabase, "Dispatching notification that we changed an icon mapping for url %s", urlForLogging(pageURL).ascii().data());
-        AutodrainedPool pool;
-        m_client->didChangeIconForPageURL(pageURL);
-    }
-}
-
-IconLoadDecision IconDatabase::synchronousLoadDecisionForIconURL(const String& iconURL, DocumentLoader* notificationDocumentLoader)
-{
-    ASSERT_NOT_SYNC_THREAD();
-
-    if (!isOpen() || iconURL.isEmpty())
-        return IconLoadNo;
-    
-    // If we have a IconRecord, it should also have its timeStamp marked because there is only two times when we create the IconRecord:
-    // 1 - When we read the icon urls from disk, getting the timeStamp at the same time
-    // 2 - When we get a new icon from the loader, in which case the timestamp is set at that time
-    {
-        LockHolder locker(m_urlAndIconLock);
-        if (IconRecord* icon = m_iconURLToRecordMap.get(iconURL)) {
-            LOG(IconDatabase, "Found expiration time on a present icon based on existing IconRecord");
-            return static_cast<int>(currentTime()) - static_cast<int>(icon->getTimestamp()) > iconExpirationTime ? IconLoadYes : IconLoadNo;
-        }
-    }
-    
-    // If we don't have a record for it, but we *have* imported all iconURLs from disk, then we should load it now
-    LockHolder readingLocker(m_pendingReadingLock);
-    if (m_iconURLImportComplete)
-        return IconLoadYes;
-        
-    // Otherwise - since we refuse to perform I/O on the main thread to find out for sure - we return the answer that says
-    // "You might be asked to load this later, so flag that"
-    LOG(IconDatabase, "Don't know if we should load %s or not - adding %p to the set of document loaders waiting on a decision", iconURL.ascii().data(), notificationDocumentLoader);
-    if (notificationDocumentLoader)
-        m_loadersPendingDecision.add(notificationDocumentLoader);    
-
-    return IconLoadUnknown;
-}
-
-bool IconDatabase::synchronousIconDataKnownForIconURL(const String& iconURL)
-{
-    ASSERT_NOT_SYNC_THREAD();
-    
-    LockHolder locker(m_urlAndIconLock);
-    if (IconRecord* icon = m_iconURLToRecordMap.get(iconURL))
-        return icon->imageDataStatus() != ImageDataStatusUnknown;
-
-    return false;
-}
-
-void IconDatabase::setEnabled(bool enabled)
-{
-    ASSERT_NOT_SYNC_THREAD();
-    
-    if (!enabled && isOpen())
-        close();
-    m_isEnabled = enabled;
-}
-
-bool IconDatabase::isEnabled() const
-{
-    ASSERT_NOT_SYNC_THREAD();
-    
-     return m_isEnabled;
-}
-
-void IconDatabase::setPrivateBrowsingEnabled(bool flag)
-{
-    m_privateBrowsingEnabled = flag;
-}
-
-bool IconDatabase::isPrivateBrowsingEnabled() const
-{
-    return m_privateBrowsingEnabled;
-}
-
-void IconDatabase::delayDatabaseCleanup()
-{
-    ++databaseCleanupCounter;
-    if (databaseCleanupCounter == 1)
-        LOG(IconDatabase, "Database cleanup is now DISABLED");
-}
-
-void IconDatabase::allowDatabaseCleanup()
-{
-    if (--databaseCleanupCounter < 0)
-        databaseCleanupCounter = 0;
-    if (databaseCleanupCounter == 0)
-        LOG(IconDatabase, "Database cleanup is now ENABLED");
-}
-
-void IconDatabase::checkIntegrityBeforeOpening()
-{
-    checkIntegrityOnOpen = true;
-}
-
-size_t IconDatabase::pageURLMappingCount()
-{
-    LockHolder locker(m_urlAndIconLock);
-    return m_pageURLToRecordMap.size();
-}
-
-size_t IconDatabase::retainedPageURLCount()
-{
-    LockHolder locker(m_urlAndIconLock);
-    performPendingRetainAndReleaseOperations();
-    return m_retainedPageURLs.size();
-}
-
-size_t IconDatabase::iconRecordCount()
-{
-    LockHolder locker(m_urlAndIconLock);
-    return m_iconURLToRecordMap.size();
-}
-
-size_t IconDatabase::iconRecordCountWithData()
-{
-    LockHolder locker(m_urlAndIconLock);
-    size_t result = 0;
-
-    for (auto& iconRecord : m_iconURLToRecordMap.values())
-        result += (iconRecord->imageDataStatus() == ImageDataStatusPresent);
-
-    return result;
-}
-
-IconDatabase::IconDatabase()
-    : m_syncTimer(*this, &IconDatabase::syncTimerFired)
-    , m_syncThreadRunning(false)
-    , m_scheduleOrDeferSyncTimerRequested(false)
-    , m_isEnabled(false)
-    , m_privateBrowsingEnabled(false)
-    , m_threadTerminationRequested(false)
-    , m_removeIconsRequested(false)
-    , m_iconURLImportComplete(false)
-    , m_syncThreadHasWorkToDo(false)
-    , m_retainOrReleaseIconRequested(false)
-    , m_initialPruningComplete(false)
-    , m_mainThreadCallbackCount(0)
-    , m_client(defaultClient())
-{
-    LOG(IconDatabase, "Creating IconDatabase %p", this);
-    ASSERT(isMainThread());
-}
-
-IconDatabase::~IconDatabase()
-{
-    ASSERT(!isOpen());
-}
-
-void IconDatabase::notifyPendingLoadDecisions()
-{
-    ASSERT_NOT_SYNC_THREAD();
-    
-    // This method should only be called upon completion of the initial url import from the database
-    ASSERT(m_iconURLImportComplete);
-    LOG(IconDatabase, "Notifying all DocumentLoaders that were waiting on a load decision for their icons");
-        
-    for (auto& loader : m_loadersPendingDecision) {
-        if (loader->refCount() > 1)
-            loader->iconLoadDecisionAvailable();
-    }
-
-    m_loadersPendingDecision.clear();
-}
-
-void IconDatabase::wakeSyncThread()
-{
-    LockHolder locker(m_syncLock);
-
-    if (!m_disableSuddenTerminationWhileSyncThreadHasWorkToDo)
-        m_disableSuddenTerminationWhileSyncThreadHasWorkToDo = std::make_unique<SuddenTerminationDisabler>();
-
-    m_syncThreadHasWorkToDo = true;
-    m_syncCondition.notifyOne();
-}
-
-void IconDatabase::scheduleOrDeferSyncTimer()
-{
-    ASSERT_NOT_SYNC_THREAD();
-
-    if (m_scheduleOrDeferSyncTimerRequested)
-        return;
-
-    if (!m_disableSuddenTerminationWhileSyncTimerScheduled)
-        m_disableSuddenTerminationWhileSyncTimerScheduled = std::make_unique<SuddenTerminationDisabler>();
-
-    m_scheduleOrDeferSyncTimerRequested = true;
-    callOnMainThread([this] {
-        m_syncTimer.startOneShot(updateTimerDelay);
-        m_scheduleOrDeferSyncTimerRequested = false;
-    });
-}
-
-void IconDatabase::syncTimerFired()
-{
-    ASSERT_NOT_SYNC_THREAD();
-    wakeSyncThread();
-
-    m_disableSuddenTerminationWhileSyncTimerScheduled.reset();
-}
-
-// ******************
-// *** Any Thread ***
-// ******************
-
-bool IconDatabase::isOpen() const
-{
-    return isOpenBesidesMainThreadCallbacks() || m_mainThreadCallbackCount;
-}
-
-bool IconDatabase::isOpenBesidesMainThreadCallbacks() const
-{
-    LockHolder locker(m_syncLock);
-    return m_syncThreadRunning || m_syncDB.isOpen();
-}
-
-String IconDatabase::databasePath() const
-{
-    LockHolder locker(m_syncLock);
-    return m_completeDatabasePath.isolatedCopy();
-}
-
-String IconDatabase::defaultDatabaseFilename()
-{
-    static NeverDestroyed<String> defaultDatabaseFilename(MAKE_STATIC_STRING_IMPL("WebpageIcons.db"));
-    return defaultDatabaseFilename.get().isolatedCopy();
-}
-
-// Unlike getOrCreatePageURLRecord(), getOrCreateIconRecord() does not mark the icon as "interested in import"
-Ref<IconRecord> IconDatabase::getOrCreateIconRecord(const String& iconURL)
-{
-    // Clients of getOrCreateIconRecord() are required to acquire the m_urlAndIconLock before calling this method
-    ASSERT(!m_urlAndIconLock.tryLock());
-
-    if (auto* icon = m_iconURLToRecordMap.get(iconURL))
-        return *icon;
-
-    auto newIcon = IconRecord::create(iconURL);
-    m_iconURLToRecordMap.set(iconURL, newIcon.ptr());
-    return newIcon;
-}
-
-// This method retrieves the existing PageURLRecord, or creates a new one and marks it as "interested in the import" for later notification
-PageURLRecord* IconDatabase::getOrCreatePageURLRecord(const String& pageURL)
-{
-    // Clients of getOrCreatePageURLRecord() are required to acquire the m_urlAndIconLock before calling this method
-    ASSERT(!m_urlAndIconLock.tryLock());
-
-    if (!documentCanHaveIcon(pageURL))
-        return nullptr;
-
-    PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURL);
-    
-    LockHolder locker(m_pendingReadingLock);
-    if (!m_iconURLImportComplete) {
-        // If the initial import of all URLs hasn't completed and we have no page record, we assume we *might* know about this later and create a record for it
-        if (!pageRecord) {
-            LOG(IconDatabase, "Creating new PageURLRecord for pageURL %s", urlForLogging(pageURL).ascii().data());
-            pageRecord = new PageURLRecord(pageURL);
-            m_pageURLToRecordMap.set(pageURL, pageRecord);
-        }
-
-        // If the pageRecord for this page does not have an iconRecord attached to it, then it is a new pageRecord still awaiting the initial import
-        // Mark the URL as "interested in the result of the import" then bail
-        if (!pageRecord->iconRecord()) {
-            m_pageURLsPendingImport.add(pageURL);
-            return nullptr;
-        }
-    }
-
-    // We've done the initial import of all URLs known in the database.  If this record doesn't exist now, it never will    
-     return pageRecord;
-}
-
-
-// ************************
-// *** Sync Thread Only ***
-// ************************
-
-bool IconDatabase::shouldStopThreadActivity() const
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    return m_threadTerminationRequested || m_removeIconsRequested;
-}
-
-void IconDatabase::iconDatabaseSyncThread()
-{
-    // The call to create this thread might not complete before the thread actually starts, so we might fail this ASSERT_ICON_SYNC_THREAD() because the pointer 
-    // to our thread structure hasn't been filled in yet.
-    // To fix this, the main thread acquires this lock before creating us, then releases the lock after creation is complete.  A quick lock/unlock cycle here will 
-    // prevent us from running before that call completes
-    m_syncLock.lock();
-    m_syncLock.unlock();
-
-    ASSERT_ICON_SYNC_THREAD();
-    
-    LOG(IconDatabase, "(THREAD) IconDatabase sync thread started");
-
-#if !LOG_DISABLED
-    double startTime = monotonicallyIncreasingTime();
-#endif
-
-    // Need to create the database path if it doesn't already exist
-    makeAllDirectories(m_databaseDirectory);
-
-    // Existence of a journal file is evidence of a previous crash/force quit and automatically qualifies
-    // us to do an integrity check
-    String journalFilename = m_completeDatabasePath + "-journal";
-    if (!checkIntegrityOnOpen) {
-        AutodrainedPool pool;
-        checkIntegrityOnOpen = fileExists(journalFilename);
-    }
-    
-    {
-        LockHolder locker(m_syncLock);
-        if (!m_syncDB.open(m_completeDatabasePath)) {
-            LOG_ERROR("Unable to open icon database at path %s - %s", m_completeDatabasePath.ascii().data(), m_syncDB.lastErrorMsg());
-            return;
-        }
-    }
-    
-    if (shouldStopThreadActivity()) {
-        syncThreadMainLoop();
-        return;
-    }
-        
-#if !LOG_DISABLED
-    double timeStamp = monotonicallyIncreasingTime();
-    LOG(IconDatabase, "(THREAD) Open took %.4f seconds", timeStamp - startTime);
-#endif    
-
-    performOpenInitialization();
-    if (shouldStopThreadActivity()) {
-        syncThreadMainLoop();
-        return;
-    }
-        
-#if !LOG_DISABLED
-    double newStamp = monotonicallyIncreasingTime();
-    LOG(IconDatabase, "(THREAD) performOpenInitialization() took %.4f seconds, now %.4f seconds from thread start", newStamp - timeStamp, newStamp - startTime);
-    timeStamp = newStamp;
-#endif 
-        
-    // Uncomment the following line to simulate a long lasting URL import (*HUGE* icon databases, or network home directories)
-    // while (monotonicallyIncreasingTime() - timeStamp < 10);
-
-    // Read in URL mappings from the database          
-    LOG(IconDatabase, "(THREAD) Starting iconURL import");
-    performURLImport();
-    
-    if (shouldStopThreadActivity()) {
-        syncThreadMainLoop();
-        return;
-    }
-
-#if !LOG_DISABLED
-    newStamp = monotonicallyIncreasingTime();
-    LOG(IconDatabase, "(THREAD) performURLImport() took %.4f seconds.  Entering main loop %.4f seconds from thread start", newStamp - timeStamp, newStamp - startTime);
-#endif 
-
-    LOG(IconDatabase, "(THREAD) Beginning sync");
-    syncThreadMainLoop();
-}
-
-static int databaseVersionNumber(SQLiteDatabase& db)
-{
-    return SQLiteStatement(db, "SELECT value FROM IconDatabaseInfo WHERE key = 'Version';").getColumnInt(0);
-}
-
-static bool isValidDatabase(SQLiteDatabase& db)
-{
-    // These four tables should always exist in a valid db
-    if (!db.tableExists("IconInfo") || !db.tableExists("IconData") || !db.tableExists("PageURL") || !db.tableExists("IconDatabaseInfo"))
-        return false;
-    
-    if (databaseVersionNumber(db) < currentDatabaseVersion) {
-        LOG(IconDatabase, "DB version is not found or below expected valid version");
-        return false;
-    }
-    
-    return true;
-}
-
-static void createDatabaseTables(SQLiteDatabase& db)
-{
-    if (!db.executeCommand("CREATE TABLE PageURL (url TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,iconID INTEGER NOT NULL ON CONFLICT FAIL);")) {
-        LOG_ERROR("Could not create PageURL table in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand("CREATE INDEX PageURLIndex ON PageURL (url);")) {
-        LOG_ERROR("Could not create PageURL index in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand("CREATE TABLE IconInfo (iconID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE ON CONFLICT REPLACE, url TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, stamp INTEGER);")) {
-        LOG_ERROR("Could not create IconInfo table in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand("CREATE INDEX IconInfoIndex ON IconInfo (url, iconID);")) {
-        LOG_ERROR("Could not create PageURL index in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand("CREATE TABLE IconData (iconID INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE ON CONFLICT REPLACE, data BLOB);")) {
-        LOG_ERROR("Could not create IconData table in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand("CREATE INDEX IconDataIndex ON IconData (iconID);")) {
-        LOG_ERROR("Could not create PageURL index in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand("CREATE TABLE IconDatabaseInfo (key TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE,value TEXT NOT NULL ON CONFLICT FAIL);")) {
-        LOG_ERROR("Could not create IconDatabaseInfo table in database (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-    if (!db.executeCommand(String("INSERT INTO IconDatabaseInfo VALUES ('Version', ") + String::number(currentDatabaseVersion) + ");")) {
-        LOG_ERROR("Could not insert icon database version into IconDatabaseInfo table (%i) - %s", db.lastError(), db.lastErrorMsg());
-        db.close();
-        return;
-    }
-}    
-
-void IconDatabase::performOpenInitialization()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    if (!isOpen())
-        return;
-    
-    if (checkIntegrityOnOpen) {
-        checkIntegrityOnOpen = false;
-        if (!checkIntegrity()) {
-            LOG(IconDatabase, "Integrity check was bad - dumping IconDatabase");
-
-            m_syncDB.close();
-            
-            {
-                LockHolder locker(m_syncLock);
-                // Should've been consumed by SQLite, delete just to make sure we don't see it again in the future;
-                deleteFile(m_completeDatabasePath + "-journal");
-                deleteFile(m_completeDatabasePath);
-            }
-            
-            // Reopen the write database, creating it from scratch
-            if (!m_syncDB.open(m_completeDatabasePath)) {
-                LOG_ERROR("Unable to open icon database at path %s - %s", m_completeDatabasePath.ascii().data(), m_syncDB.lastErrorMsg());
-                return;
-            }          
-        }
-    }
-    
-    int version = databaseVersionNumber(m_syncDB);
-    
-    if (version > currentDatabaseVersion) {
-        LOG(IconDatabase, "Database version number %i is greater than our current version number %i - closing the database to prevent overwriting newer versions", version, currentDatabaseVersion);
-        m_syncDB.close();
-        m_threadTerminationRequested = true;
-        return;
-    }
-    
-    if (!isValidDatabase(m_syncDB)) {
-        LOG(IconDatabase, "%s is missing or in an invalid state - reconstructing", m_completeDatabasePath.ascii().data());
-        m_syncDB.clearAllTables();
-        createDatabaseTables(m_syncDB);
-    }
-
-    // Reduce sqlite RAM cache size from default 2000 pages (~1.5kB per page). 3MB of cache for icon database is overkill
-    if (!SQLiteStatement(m_syncDB, "PRAGMA cache_size = 200;").executeCommand())         
-        LOG_ERROR("SQLite database could not set cache_size");
-
-    // Tell backup software (i.e., Time Machine) to never back up the icon database, because  
-    // it's a large file that changes frequently, thus using a lot of backup disk space, and 
-    // it's unlikely that many users would be upset about it not being backed up. We could 
-    // make this configurable on a per-client basis some day if some clients don't want this.
-    if (canExcludeFromBackup() && !wasExcludedFromBackup() && excludeFromBackup(m_completeDatabasePath))
-        setWasExcludedFromBackup();
-}
-
-bool IconDatabase::checkIntegrity()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    SQLiteStatement integrity(m_syncDB, "PRAGMA integrity_check;");
-    if (integrity.prepare() != SQLITE_OK) {
-        LOG_ERROR("checkIntegrity failed to execute");
-        return false;
-    }
-    
-    int resultCode = integrity.step();
-    if (resultCode == SQLITE_OK)
-        return true;
-
-    if (resultCode != SQLITE_ROW)
-        return false;
-
-    int columns = integrity.columnCount();
-    if (columns != 1) {
-        LOG_ERROR("Received %i columns performing integrity check, should be 1", columns);
-        return false;
-    }
-        
-    String resultText = integrity.getColumnText(0);
-        
-    // A successful, no-error integrity check will be "ok" - all other strings imply failure
-    if (resultText == "ok")
-        return true;
-    
-    LOG_ERROR("Icon database integrity check failed - \n%s", resultText.ascii().data());
-    return false;
-}
-
-void IconDatabase::performURLImport()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-# if PLATFORM(GTK)
-    // Do not import icons not used in the last 30 days. They will be automatically pruned later if nobody retains them.
-    // Note that IconInfo.stamp is only set when the icon data is retrieved from the server (and thus is not updated whether
-    // we use it or not). This code works anyway because the IconDatabase downloads icons again if they are older than 4 days,
-    // so if the timestamp goes back in time more than those 30 days we can be sure that the icon was not used at all.
-    String importQuery = String::format("SELECT PageURL.url, IconInfo.url, IconInfo.stamp FROM PageURL INNER JOIN IconInfo ON PageURL.iconID=IconInfo.iconID WHERE IconInfo.stamp > %.0f;", floor(currentTime() - notUsedIconExpirationTime));
-#else
-    String importQuery("SELECT PageURL.url, IconInfo.url, IconInfo.stamp FROM PageURL INNER JOIN IconInfo ON PageURL.iconID=IconInfo.iconID;");
-#endif
-
-    SQLiteStatement query(m_syncDB, importQuery);
-    
-    if (query.prepare() != SQLITE_OK) {
-        LOG_ERROR("Unable to prepare icon url import query");
-        return;
-    }
-    
-    int result = query.step();
-    while (result == SQLITE_ROW) {
-        AutodrainedPool pool;
-        String pageURL = query.getColumnText(0);
-        String iconURL = query.getColumnText(1);
-
-        {
-            LockHolder locker(m_urlAndIconLock);
-
-            PageURLRecord* pageRecord = m_pageURLToRecordMap.get(pageURL);
-            
-            // If the pageRecord doesn't exist in this map, then no one has retained this pageURL
-            // If the s_databaseCleanupCounter count is non-zero, then we're not supposed to be pruning the database in any manner,
-            // so actually create a pageURLRecord for this url even though it's not retained.
-            // If database cleanup *is* allowed, we don't want to bother pulling in a page url from disk that noone is actually interested
-            // in - we'll prune it later instead!
-            if (!pageRecord && databaseCleanupCounter && documentCanHaveIcon(pageURL)) {
-                pageRecord = new PageURLRecord(pageURL);
-                m_pageURLToRecordMap.set(pageURL, pageRecord);
-            }
-            
-            if (pageRecord) {
-                IconRecord* currentIcon = pageRecord->iconRecord();
-
-                if (!currentIcon || currentIcon->iconURL() != iconURL) {
-                    pageRecord->setIconRecord(getOrCreateIconRecord(iconURL));
-                    currentIcon = pageRecord->iconRecord();
-                }
-            
-                // Regardless, the time stamp from disk still takes precedence.  Until we read this icon from disk, we didn't think we'd seen it before
-                // so we marked the timestamp as "now", but it's really much older
-                currentIcon->setTimestamp(query.getColumnInt(2));
-            }            
-        }
-        
-        // FIXME: Currently the WebKit API supports 1 type of notification that is sent whenever we get an Icon URL for a Page URL.  We might want to re-purpose it to work for 
-        // getting the actually icon itself also (so each pageurl would get this notification twice) or we might want to add a second type of notification -
-        // one for the URL and one for the Image itself
-        // Note that WebIconDatabase is not neccessarily API so we might be able to make this change
-        {
-            LockHolder locker(m_pendingReadingLock);
-            if (m_pageURLsPendingImport.contains(pageURL)) {
-                dispatchDidImportIconURLForPageURLOnMainThread(pageURL);
-                m_pageURLsPendingImport.remove(pageURL);
-            }
-        }
-        
-        // Stop the import at any time of the thread has been asked to shutdown
-        if (shouldStopThreadActivity()) {
-            LOG(IconDatabase, "IconDatabase asked to terminate during performURLImport()");
-            return;
-        }
-        
-        result = query.step();
-    }
-    
-    if (result != SQLITE_DONE)
-        LOG(IconDatabase, "Error reading page->icon url mappings from database");
-
-    // Clear the m_pageURLsPendingImport set - either the page URLs ended up with an iconURL (that we'll notify about) or not, 
-    // but after m_iconURLImportComplete is set to true, we don't care about this set anymore
-    Vector<String> urls;
-    {
-        LockHolder locker(m_pendingReadingLock);
-
-        urls.appendRange(m_pageURLsPendingImport.begin(), m_pageURLsPendingImport.end());
-        m_pageURLsPendingImport.clear();        
-        m_iconURLImportComplete = true;
-    }
-    
-    Vector<String> urlsToNotify;
-    
-    // Loop through the urls pending import
-    // Remove unretained ones if database cleanup is allowed
-    // Keep a set of ones that are retained and pending notification
-    {
-        LockHolder locker(m_urlAndIconLock);
-
-        performPendingRetainAndReleaseOperations();
-
-        for (auto& url : urls) {
-            if (!m_retainedPageURLs.contains(url)) {
-                PageURLRecord* record = m_pageURLToRecordMap.get(url);
-                if (record && !databaseCleanupCounter) {
-                    m_pageURLToRecordMap.remove(url);
-                    IconRecord* iconRecord = record->iconRecord();
-                    
-                    // If this page is the only remaining retainer of its icon, mark that icon for deletion and don't bother
-                    // reading anything related to it 
-                    if (iconRecord && iconRecord->hasOneRef()) {
-                        m_iconURLToRecordMap.remove(iconRecord->iconURL());
-                        
-                        {
-                            LockHolder locker(m_pendingReadingLock);
-                            m_pageURLsInterestedInIcons.remove(url);
-                            m_iconsPendingReading.remove(iconRecord);
-                        }
-                        {
-                            LockHolder locker(m_pendingSyncLock);
-                            m_iconsPendingSync.set(iconRecord->iconURL(), iconRecord->snapshot(true));                    
-                        }
-                    }
-                    
-                    delete record;
-                }
-            } else {
-                urlsToNotify.append(url);
-            }
-        }
-    }
-
-    LOG(IconDatabase, "Notifying %lu interested page URLs that their icon URL is known due to the import", static_cast<unsigned long>(urlsToNotify.size()));
-    // Now that we don't hold any locks, perform the actual notifications
-    for (auto& url : urlsToNotify) {
-        AutodrainedPool pool;
-
-        LOG(IconDatabase, "Notifying icon info known for pageURL %s", url.ascii().data());
-        dispatchDidImportIconURLForPageURLOnMainThread(url);
-        if (shouldStopThreadActivity())
-            return;
-    }
-    
-    // Notify the client that the URL import is complete in case it's managing its own pending notifications.
-    dispatchDidFinishURLImportOnMainThread();
-    
-    // Notify all DocumentLoaders that were waiting for an icon load decision on the main thread
-    callOnMainThread([this] {
-        notifyPendingLoadDecisions();
-    });
-}
-
-void IconDatabase::syncThreadMainLoop()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-    m_syncLock.lock();
-
-    std::unique_ptr<SuddenTerminationDisabler> disableSuddenTermination = WTFMove(m_disableSuddenTerminationWhileSyncThreadHasWorkToDo);
-
-    // We'll either do any pending work on our first pass through the loop, or we'll terminate
-    // without doing any work. Either way we're dealing with any currently-pending work.
-    m_syncThreadHasWorkToDo = false;
-
-    // It's possible thread termination is requested before the main loop even starts - in that case, just skip straight to cleanup
-    while (!m_threadTerminationRequested) {
-        m_syncLock.unlock();
-
-#if !LOG_DISABLED
-        double timeStamp = monotonicallyIncreasingTime();
-#endif
-        LOG(IconDatabase, "(THREAD) Main work loop starting");
-
-        // If we should remove all icons, do it now.  This is an uninteruptible procedure that we will always do before quitting if it is requested
-        if (m_removeIconsRequested) {
-            removeAllIconsOnThread();
-            m_removeIconsRequested = false;
-        }
-        
-        // Then, if the thread should be quitting, quit now!
-        if (m_threadTerminationRequested) {
-            cleanupSyncThread();
-            return;
-        }
-
-        {
-            LockHolder locker(m_urlAndIconLock);
-            performPendingRetainAndReleaseOperations();
-        }
-        
-        bool didAnyWork = true;
-        while (didAnyWork) {
-            bool didWrite = writeToDatabase();
-            if (shouldStopThreadActivity())
-                break;
-                
-            didAnyWork = readFromDatabase();
-            if (shouldStopThreadActivity())
-                break;
-                
-            // Prune unretained icons after the first time we sync anything out to the database
-            // This way, pruning won't be the only operation we perform to the database by itself
-            // We also don't want to bother doing this if the thread should be terminating (the user is quitting)
-            // or if private browsing is enabled
-            // We also don't want to prune if the m_databaseCleanupCounter count is non-zero - that means someone
-            // has asked to delay pruning
-            static bool prunedUnretainedIcons = false;
-            if (didWrite && !m_privateBrowsingEnabled && !prunedUnretainedIcons && !databaseCleanupCounter) {
-#if !LOG_DISABLED
-                double time = monotonicallyIncreasingTime();
-#endif
-                LOG(IconDatabase, "(THREAD) Starting pruneUnretainedIcons()");
-                
-                pruneUnretainedIcons();
-                
-                LOG(IconDatabase, "(THREAD) pruneUnretainedIcons() took %.4f seconds", monotonicallyIncreasingTime() - time);
-                
-                // If pruneUnretainedIcons() returned early due to requested thread termination, its still okay
-                // to mark prunedUnretainedIcons true because we're about to terminate anyway
-                prunedUnretainedIcons = true;
-            }
-            
-            didAnyWork = didAnyWork || didWrite;
-            if (shouldStopThreadActivity())
-                break;
-        }
-        
-#if !LOG_DISABLED
-        double newstamp = monotonicallyIncreasingTime();
-        LOG(IconDatabase, "(THREAD) Main work loop ran for %.4f seconds, %s requested to terminate", newstamp - timeStamp, shouldStopThreadActivity() ? "was" : "was not");
-#endif
-                    
-        m_syncLock.lock();
-        
-        // There is some condition that is asking us to stop what we're doing now and handle a special case
-        // This is either removing all icons, or shutting down the thread to quit the app
-        // We handle those at the top of this main loop so continue to jump back up there
-        if (shouldStopThreadActivity())
-            continue;
-
-        disableSuddenTermination.reset();
-
-        while (!m_syncThreadHasWorkToDo)
-            m_syncCondition.wait(m_syncLock);
-
-        m_syncThreadHasWorkToDo = false;
-
-        ASSERT(m_disableSuddenTerminationWhileSyncThreadHasWorkToDo);
-        disableSuddenTermination = WTFMove(m_disableSuddenTerminationWhileSyncThreadHasWorkToDo);
-    }
-
-    m_syncLock.unlock();
-    
-    // Thread is terminating at this point
-    cleanupSyncThread();
-}
-
-void IconDatabase::performPendingRetainAndReleaseOperations()
-{
-    // NOTE: The caller is assumed to hold m_urlAndIconLock.
-    ASSERT(!m_urlAndIconLock.tryLock());
-
-    HashCountedSet<String> toRetain;
-    HashCountedSet<String> toRelease;
-
-    {
-        LockHolder pendingWorkLocker(m_urlsToRetainOrReleaseLock);
-        if (!m_retainOrReleaseIconRequested)
-            return;
-
-        // Make a copy of the URLs to retain and/or release so we can release m_urlsToRetainOrReleaseLock ASAP.
-        // Holding m_urlAndIconLock protects this function from being re-entered.
-
-        toRetain.swap(m_urlsToRetain);
-        toRelease.swap(m_urlsToRelease);
-        m_retainOrReleaseIconRequested = false;
-    }
-
-    for (auto& entry : toRetain) {
-        ASSERT(!entry.key.impl() || entry.key.impl()->hasOneRef());
-        performRetainIconForPageURL(entry.key, entry.value);
-    }
-
-    for (auto& entry : toRelease) {
-        ASSERT(!entry.key.impl() || entry.key.impl()->hasOneRef());
-        performReleaseIconForPageURL(entry.key, entry.value);
-    }
-}
-
-bool IconDatabase::readFromDatabase()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-#if !LOG_DISABLED
-    double timeStamp = monotonicallyIncreasingTime();
-#endif
-
-    bool didAnyWork = false;
-
-    // We'll make a copy of the sets of things that need to be read.  Then we'll verify at the time of updating the record that it still wants to be updated
-    // This way we won't hold the lock for a long period of time
-    Vector<IconRecord*> icons;
-    {
-        LockHolder locker(m_pendingReadingLock);
-        icons.appendRange(m_iconsPendingReading.begin(), m_iconsPendingReading.end());
-    }
-    
-    // Keep track of icons we actually read to notify them of the new icon    
-    HashSet<String> urlsToNotify;
-    
-    for (unsigned i = 0; i < icons.size(); ++i) {
-        didAnyWork = true;
-        auto imageData = getImageDataForIconURLFromSQLDatabase(icons[i]->iconURL());
-
-        // Verify this icon still wants to be read from disk
-        {
-            LockHolder urlLocker(m_urlAndIconLock);
-            {
-                LockHolder readLocker(m_pendingReadingLock);
-                
-                if (m_iconsPendingReading.contains(icons[i])) {
-                    // Set the new data
-                    icons[i]->setImageData(WTFMove(imageData));
-                    
-                    // Remove this icon from the set that needs to be read
-                    m_iconsPendingReading.remove(icons[i]);
-                    
-                    // We have a set of all Page URLs that retain this icon as well as all PageURLs waiting for an icon
-                    // We want to find the intersection of these two sets to notify them
-                    // Check the sizes of these two sets to minimize the number of iterations
-                    const HashSet<String>* outerHash;
-                    const HashSet<String>* innerHash;
-                    
-                    if (icons[i]->retainingPageURLs().size() > m_pageURLsInterestedInIcons.size()) {
-                        outerHash = &m_pageURLsInterestedInIcons;
-                        innerHash = &(icons[i]->retainingPageURLs());
-                    } else {
-                        innerHash = &m_pageURLsInterestedInIcons;
-                        outerHash = &(icons[i]->retainingPageURLs());
-                    }
-                    
-                    for (auto& outer : *outerHash) {
-                        if (innerHash->contains(outer)) {
-                            LOG(IconDatabase, "%s is interested in the icon we just read. Adding it to the notification list and removing it from the interested set", urlForLogging(outer).ascii().data());
-                            urlsToNotify.add(outer);
-                        }
-                        
-                        // If we ever get to the point were we've seen every url interested in this icon, break early
-                        if (urlsToNotify.size() == m_pageURLsInterestedInIcons.size())
-                            break;
-                    }
-                    
-                    // We don't need to notify a PageURL twice, so all the ones we're about to notify can be removed from the interested set
-                    if (urlsToNotify.size() == m_pageURLsInterestedInIcons.size())
-                        m_pageURLsInterestedInIcons.clear();
-                    else {
-                        for (auto& url : urlsToNotify)
-                            m_pageURLsInterestedInIcons.remove(url);
-                    }
-                }
-            }
-        }
-    
-        if (shouldStopThreadActivity())
-            return didAnyWork;
-        
-        // Now that we don't hold any locks, perform the actual notifications
-        for (HashSet<String>::const_iterator it = urlsToNotify.begin(), end = urlsToNotify.end(); it != end; ++it) {
-            AutodrainedPool pool;
-
-            LOG(IconDatabase, "Notifying icon received for pageURL %s", urlForLogging(*it).ascii().data());
-            dispatchDidImportIconDataForPageURLOnMainThread(*it);
-            if (shouldStopThreadActivity())
-                return didAnyWork;
-        }
-
-        LOG(IconDatabase, "Done notifying %i pageURLs who just received their icons", urlsToNotify.size());
-        urlsToNotify.clear();
-        
-        if (shouldStopThreadActivity())
-            return didAnyWork;
-    }
-
-    LOG(IconDatabase, "Reading from database took %.4f seconds", monotonicallyIncreasingTime() - timeStamp);
-
-    return didAnyWork;
-}
-
-bool IconDatabase::writeToDatabase()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-#if !LOG_DISABLED
-    double timeStamp = monotonicallyIncreasingTime();
-#endif
-
-    bool didAnyWork = false;
-    
-    // We can copy the current work queue then clear it out - If any new work comes in while we're writing out,
-    // we'll pick it up on the next pass.  This greatly simplifies the locking strategy for this method and remains cohesive with changes
-    // asked for by the database on the main thread
-    {
-        LockHolder locker(m_urlAndIconLock);
-        Vector<IconSnapshot> iconSnapshots;
-        Vector<PageURLSnapshot> pageSnapshots;
-        {
-            LockHolder locker(m_pendingSyncLock);
-
-            iconSnapshots.appendRange(m_iconsPendingSync.begin().values(), m_iconsPendingSync.end().values());
-            m_iconsPendingSync.clear();
-
-            pageSnapshots.appendRange(m_pageURLsPendingSync.begin().values(), m_pageURLsPendingSync.end().values());
-            m_pageURLsPendingSync.clear();
-        }
-
-        if (iconSnapshots.size() || pageSnapshots.size())
-            didAnyWork = true;
-
-        SQLiteTransaction syncTransaction(m_syncDB);
-        syncTransaction.begin();
-
-        for (auto& snapshot : iconSnapshots) {
-            writeIconSnapshotToSQLDatabase(snapshot);
-            LOG(IconDatabase, "Wrote IconRecord for IconURL %s with timeStamp of %i to the DB", urlForLogging(snapshot.iconURL()).ascii().data(), snapshot.timestamp());
-        }
-
-        for (auto& snapshot : pageSnapshots) {
-            // If the icon URL is empty, this page is meant to be deleted
-            // ASSERTs are sanity checks to make sure the mappings exist if they should and don't if they shouldn't
-            if (snapshot.iconURL().isEmpty())
-                removePageURLFromSQLDatabase(snapshot.pageURL());
-            else
-                setIconURLForPageURLInSQLDatabase(snapshot.iconURL(), snapshot.pageURL());
-            LOG(IconDatabase, "Committed IconURL for PageURL %s to database", urlForLogging(snapshot.pageURL()).ascii().data());
-        }
-
-        syncTransaction.commit();
-    }
-
-    // Check to make sure there are no dangling PageURLs - If there are, we want to output one log message but not spam the console potentially every few seconds
-    if (didAnyWork)
-        checkForDanglingPageURLs(false);
-
-    LOG(IconDatabase, "Updating the database took %.4f seconds", monotonicallyIncreasingTime() - timeStamp);
-
-    return didAnyWork;
-}
-
-void IconDatabase::pruneUnretainedIcons()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-    if (!isOpen())
-        return;        
-    
-    // This method should only be called once per run
-    ASSERT(!m_initialPruningComplete);
-
-    // This method relies on having read in all page URLs from the database earlier.
-    ASSERT(m_iconURLImportComplete);
-
-    // Get the known PageURLs from the db, and record the ID of any that are not in the retain count set.
-    Vector<int64_t> pageIDsToDelete; 
-
-    SQLiteStatement pageSQL(m_syncDB, "SELECT rowid, url FROM PageURL;");
-    pageSQL.prepare();
-    
-    int result;
-    while ((result = pageSQL.step()) == SQLITE_ROW) {
-        LockHolder locker(m_urlAndIconLock);
-        if (!m_pageURLToRecordMap.contains(pageSQL.getColumnText(1)))
-            pageIDsToDelete.append(pageSQL.getColumnInt64(0));
-    }
-    
-    if (result != SQLITE_DONE)
-        LOG_ERROR("Error reading PageURL table from on-disk DB");
-    pageSQL.finalize();
-    
-    // Delete page URLs that were in the table, but not in our retain count set.
-    size_t numToDelete = pageIDsToDelete.size();
-    if (numToDelete) {
-        SQLiteTransaction pruningTransaction(m_syncDB);
-        pruningTransaction.begin();
-        
-        SQLiteStatement pageDeleteSQL(m_syncDB, "DELETE FROM PageURL WHERE rowid = (?);");
-        pageDeleteSQL.prepare();
-        for (size_t i = 0; i < numToDelete; ++i) {
-            LOG(IconDatabase, "Pruning page with rowid %lli from disk", static_cast<long long>(pageIDsToDelete[i]));
-            pageDeleteSQL.bindInt64(1, pageIDsToDelete[i]);
-            int result = pageDeleteSQL.step();
-            if (result != SQLITE_DONE)
-                LOG_ERROR("Unabled to delete page with id %lli from disk", static_cast<long long>(pageIDsToDelete[i]));
-            pageDeleteSQL.reset();
-            
-            // If the thread was asked to terminate, we should commit what pruning we've done so far, figuring we can
-            // finish the rest later (hopefully)
-            if (shouldStopThreadActivity()) {
-                pruningTransaction.commit();
-                return;
-            }
-        }
-        pruningTransaction.commit();
-        pageDeleteSQL.finalize();
-    }
-    
-    // Deleting unreferenced icons from the Icon tables has to be atomic - 
-    // If the user quits while these are taking place, they might have to wait.  Thankfully this will rarely be an issue
-    // A user on a network home directory with a wildly inconsistent database might see quite a pause...
-
-    SQLiteTransaction pruningTransaction(m_syncDB);
-    pruningTransaction.begin();
-    
-    // Wipe Icons that aren't retained
-    if (!m_syncDB.executeCommand("DELETE FROM IconData WHERE iconID NOT IN (SELECT iconID FROM PageURL);"))
-        LOG_ERROR("Failed to execute SQL to prune unretained icons from the on-disk IconData table");    
-    if (!m_syncDB.executeCommand("DELETE FROM IconInfo WHERE iconID NOT IN (SELECT iconID FROM PageURL);"))
-        LOG_ERROR("Failed to execute SQL to prune unretained icons from the on-disk IconInfo table");    
-    
-    pruningTransaction.commit();
-        
-    checkForDanglingPageURLs(true);
-
-    m_initialPruningComplete = true;
-}
-
-void IconDatabase::checkForDanglingPageURLs(bool pruneIfFound)
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-    // This check can be relatively expensive so we don't do it in a release build unless the caller has asked us to prune any dangling
-    // entries.  We also don't want to keep performing this check and reporting this error if it has already found danglers before so we
-    // keep track of whether we've found any.  We skip the check in the release build pretending to have already found danglers already.
-#ifndef NDEBUG
-    static bool danglersFound = true;
-#else
-    static bool danglersFound = false;
-#endif
-
-    if ((pruneIfFound || !danglersFound) && SQLiteStatement(m_syncDB, "SELECT url FROM PageURL WHERE PageURL.iconID NOT IN (SELECT iconID FROM IconInfo) LIMIT 1;").returnsAtLeastOneResult()) {
-        danglersFound = true;
-        LOG(IconDatabase, "Dangling PageURL entries found");
-        if (pruneIfFound && !m_syncDB.executeCommand("DELETE FROM PageURL WHERE iconID NOT IN (SELECT iconID FROM IconInfo);"))
-            LOG(IconDatabase, "Unable to prune dangling PageURLs");
-    }
-}
-
-void IconDatabase::removeAllIconsOnThread()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-    LOG(IconDatabase, "Removing all icons on the sync thread");
-        
-    // Delete all the prepared statements so they can start over
-    deleteAllPreparedStatements();    
-    
-    // To reset the on-disk database, we'll wipe all its tables then vacuum it
-    // This is easier and safer than closing it, deleting the file, and recreating from scratch
-    m_syncDB.clearAllTables();
-    m_syncDB.runVacuumCommand();
-    createDatabaseTables(m_syncDB);
-    
-    LOG(IconDatabase, "Dispatching notification that we removed all icons");
-    dispatchDidRemoveAllIconsOnMainThread();    
-}
-
-void IconDatabase::deleteAllPreparedStatements()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    m_setIconIDForPageURLStatement = nullptr;
-    m_removePageURLStatement = nullptr;
-    m_getIconIDForIconURLStatement = nullptr;
-    m_getImageDataForIconURLStatement = nullptr;
-    m_addIconToIconInfoStatement = nullptr;
-    m_addIconToIconDataStatement = nullptr;
-    m_getImageDataStatement = nullptr;
-    m_deletePageURLsForIconURLStatement = nullptr;
-    m_deleteIconFromIconInfoStatement = nullptr;
-    m_deleteIconFromIconDataStatement = nullptr;
-    m_updateIconInfoStatement = nullptr;
-    m_updateIconDataStatement  = nullptr;
-    m_setIconInfoStatement = nullptr;
-    m_setIconDataStatement = nullptr;
-}
-
-void* IconDatabase::cleanupSyncThread()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-#if !LOG_DISABLED
-    double timeStamp = monotonicallyIncreasingTime();
-#endif 
-
-    // If the removeIcons flag is set, remove all icons from the db.
-    if (m_removeIconsRequested)
-        removeAllIconsOnThread();
-
-    // Sync remaining icons out
-    LOG(IconDatabase, "(THREAD) Doing final writeout and closure of sync thread");
-    writeToDatabase();
-    
-    // Close the database
-    LockHolder locker(m_syncLock);
-    
-    m_databaseDirectory = String();
-    m_completeDatabasePath = String();
-    deleteAllPreparedStatements();    
-    m_syncDB.close();
-    
-#if !LOG_DISABLED
-    LOG(IconDatabase, "(THREAD) Final closure took %.4f seconds", monotonicallyIncreasingTime() - timeStamp);
-#endif
-    
-    m_syncThreadRunning = false;
-    return nullptr;
-}
-
-// readySQLiteStatement() handles two things
-// 1 - If the SQLDatabase& argument is different, the statement must be destroyed and remade.  This happens when the user
-//     switches to and from private browsing
-// 2 - Lazy construction of the Statement in the first place, in case we've never made this query before
-inline void readySQLiteStatement(std::unique_ptr<SQLiteStatement>& statement, SQLiteDatabase& db, const String& str)
-{
-    if (statement && (&statement->database() != &db || statement->isExpired())) {
-        if (statement->isExpired())
-            LOG(IconDatabase, "SQLiteStatement associated with %s is expired", str.ascii().data());
-        statement = nullptr;
-    }
-    if (!statement) {
-        statement = std::make_unique<SQLiteStatement>(db, str);
-        if (statement->prepare() != SQLITE_OK)
-            LOG_ERROR("Preparing statement %s failed", str.ascii().data());
-    }
-}
-
-void IconDatabase::setIconURLForPageURLInSQLDatabase(const String& iconURL, const String& pageURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    int64_t iconID = getIconIDForIconURLFromSQLDatabase(iconURL);
-
-    if (!iconID)
-        iconID = addIconURLToSQLDatabase(iconURL);
-    
-    if (!iconID) {
-        LOG_ERROR("Failed to establish an ID for iconURL %s", urlForLogging(iconURL).ascii().data());
-        ASSERT_NOT_REACHED();
-        return;
-    }
-    
-    setIconIDForPageURLInSQLDatabase(iconID, pageURL);
-}
-
-void IconDatabase::setIconIDForPageURLInSQLDatabase(int64_t iconID, const String& pageURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    readySQLiteStatement(m_setIconIDForPageURLStatement, m_syncDB, "INSERT INTO PageURL (url, iconID) VALUES ((?), ?);");
-    m_setIconIDForPageURLStatement->bindText(1, pageURL);
-    m_setIconIDForPageURLStatement->bindInt64(2, iconID);
-
-    int result = m_setIconIDForPageURLStatement->step();
-    if (result != SQLITE_DONE) {
-        ASSERT_NOT_REACHED();
-        LOG_ERROR("setIconIDForPageURLQuery failed for url %s", urlForLogging(pageURL).ascii().data());
-    }
-
-    m_setIconIDForPageURLStatement->reset();
-}
-
-void IconDatabase::removePageURLFromSQLDatabase(const String& pageURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    readySQLiteStatement(m_removePageURLStatement, m_syncDB, "DELETE FROM PageURL WHERE url = (?);");
-    m_removePageURLStatement->bindText(1, pageURL);
-
-    if (m_removePageURLStatement->step() != SQLITE_DONE)
-        LOG_ERROR("removePageURLFromSQLDatabase failed for url %s", urlForLogging(pageURL).ascii().data());
-    
-    m_removePageURLStatement->reset();
-}
-
-
-int64_t IconDatabase::getIconIDForIconURLFromSQLDatabase(const String& iconURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    readySQLiteStatement(m_getIconIDForIconURLStatement, m_syncDB, "SELECT IconInfo.iconID FROM IconInfo WHERE IconInfo.url = (?);");
-    m_getIconIDForIconURLStatement->bindText(1, iconURL);
-    
-    int64_t result = m_getIconIDForIconURLStatement->step();
-    if (result == SQLITE_ROW)
-        result = m_getIconIDForIconURLStatement->getColumnInt64(0);
-    else {
-        if (result != SQLITE_DONE)
-            LOG_ERROR("getIconIDForIconURLFromSQLDatabase failed for url %s", urlForLogging(iconURL).ascii().data());
-        result = 0;
-    }
-
-    m_getIconIDForIconURLStatement->reset();
-    return result;
-}
-
-int64_t IconDatabase::addIconURLToSQLDatabase(const String& iconURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    // There would be a transaction here to make sure these two inserts are atomic
-    // In practice the only caller of this method is always wrapped in a transaction itself so placing another
-    // here is unnecessary
-    
-    readySQLiteStatement(m_addIconToIconInfoStatement, m_syncDB, "INSERT INTO IconInfo (url, stamp) VALUES (?, 0);");
-    m_addIconToIconInfoStatement->bindText(1, iconURL);
-    
-    int result = m_addIconToIconInfoStatement->step();
-    m_addIconToIconInfoStatement->reset();
-    if (result != SQLITE_DONE) {
-        LOG_ERROR("addIconURLToSQLDatabase failed to insert %s into IconInfo", urlForLogging(iconURL).ascii().data());
-        return 0;
-    }
-    int64_t iconID = m_syncDB.lastInsertRowID();
-    
-    readySQLiteStatement(m_addIconToIconDataStatement, m_syncDB, "INSERT INTO IconData (iconID, data) VALUES (?, ?);");
-    m_addIconToIconDataStatement->bindInt64(1, iconID);
-    
-    result = m_addIconToIconDataStatement->step();
-    m_addIconToIconDataStatement->reset();
-    if (result != SQLITE_DONE) {
-        LOG_ERROR("addIconURLToSQLDatabase failed to insert %s into IconData", urlForLogging(iconURL).ascii().data());
-        return 0;
-    }
-    
-    return iconID;
-}
-
-RefPtr<SharedBuffer> IconDatabase::getImageDataForIconURLFromSQLDatabase(const String& iconURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    RefPtr<SharedBuffer> imageData;
-    
-    readySQLiteStatement(m_getImageDataForIconURLStatement, m_syncDB, "SELECT IconData.data FROM IconData WHERE IconData.iconID IN (SELECT iconID FROM IconInfo WHERE IconInfo.url = (?));");
-    m_getImageDataForIconURLStatement->bindText(1, iconURL);
-    
-    int result = m_getImageDataForIconURLStatement->step();
-    if (result == SQLITE_ROW) {
-        Vector<char> data;
-        m_getImageDataForIconURLStatement->getColumnBlobAsVector(0, data);
-        imageData = SharedBuffer::create(data.data(), data.size());
-    } else if (result != SQLITE_DONE)
-        LOG_ERROR("getImageDataForIconURLFromSQLDatabase failed for url %s", urlForLogging(iconURL).ascii().data());
-
-    m_getImageDataForIconURLStatement->reset();
-    
-    return imageData;
-}
-
-void IconDatabase::removeIconFromSQLDatabase(const String& iconURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    if (iconURL.isEmpty())
-        return;
-
-    // There would be a transaction here to make sure these removals are atomic
-    // In practice the only caller of this method is always wrapped in a transaction itself so placing another here is unnecessary
-    
-    // It's possible this icon is not in the database because of certain rapid browsing patterns (such as a stress test) where the
-    // icon is marked to be added then marked for removal before it is ever written to disk.  No big deal, early return
-    int64_t iconID = getIconIDForIconURLFromSQLDatabase(iconURL);
-    if (!iconID)
-        return;
-    
-    readySQLiteStatement(m_deletePageURLsForIconURLStatement, m_syncDB, "DELETE FROM PageURL WHERE PageURL.iconID = (?);");
-    m_deletePageURLsForIconURLStatement->bindInt64(1, iconID);
-    
-    if (m_deletePageURLsForIconURLStatement->step() != SQLITE_DONE)
-        LOG_ERROR("m_deletePageURLsForIconURLStatement failed for url %s", urlForLogging(iconURL).ascii().data());
-    
-    readySQLiteStatement(m_deleteIconFromIconInfoStatement, m_syncDB, "DELETE FROM IconInfo WHERE IconInfo.iconID = (?);");
-    m_deleteIconFromIconInfoStatement->bindInt64(1, iconID);
-    
-    if (m_deleteIconFromIconInfoStatement->step() != SQLITE_DONE)
-        LOG_ERROR("m_deleteIconFromIconInfoStatement failed for url %s", urlForLogging(iconURL).ascii().data());
-
-    readySQLiteStatement(m_deleteIconFromIconDataStatement, m_syncDB, "DELETE FROM IconData WHERE IconData.iconID = (?);");
-    m_deleteIconFromIconDataStatement->bindInt64(1, iconID);
-    
-    if (m_deleteIconFromIconDataStatement->step() != SQLITE_DONE)
-        LOG_ERROR("m_deleteIconFromIconDataStatement failed for url %s", urlForLogging(iconURL).ascii().data());
-
-    m_deletePageURLsForIconURLStatement->reset();
-    m_deleteIconFromIconInfoStatement->reset();
-    m_deleteIconFromIconDataStatement->reset();
-}
-
-void IconDatabase::writeIconSnapshotToSQLDatabase(const IconSnapshot& snapshot)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    
-    if (snapshot.iconURL().isEmpty())
-        return;
-        
-    // A nulled out timestamp and data means this icon is destined to be deleted - do that instead of writing it out
-    if (!snapshot.timestamp() && !snapshot.data()) {
-        LOG(IconDatabase, "Removing %s from on-disk database", urlForLogging(snapshot.iconURL()).ascii().data());
-        removeIconFromSQLDatabase(snapshot.iconURL());
-        return;
-    }
-
-    // There would be a transaction here to make sure these removals are atomic
-    // In practice the only caller of this method is always wrapped in a transaction itself so placing another here is unnecessary
-        
-    // Get the iconID for this url
-    int64_t iconID = getIconIDForIconURLFromSQLDatabase(snapshot.iconURL());
-    
-    // If there is already an iconID in place, update the database.  
-    // Otherwise, insert new records
-    if (iconID) {    
-        readySQLiteStatement(m_updateIconInfoStatement, m_syncDB, "UPDATE IconInfo SET stamp = ?, url = ? WHERE iconID = ?;");
-        m_updateIconInfoStatement->bindInt64(1, snapshot.timestamp());
-        m_updateIconInfoStatement->bindText(2, snapshot.iconURL());
-        m_updateIconInfoStatement->bindInt64(3, iconID);
-
-        if (m_updateIconInfoStatement->step() != SQLITE_DONE)
-            LOG_ERROR("Failed to update icon info for url %s", urlForLogging(snapshot.iconURL()).ascii().data());
-        
-        m_updateIconInfoStatement->reset();
-        
-        readySQLiteStatement(m_updateIconDataStatement, m_syncDB, "UPDATE IconData SET data = ? WHERE iconID = ?;");
-        m_updateIconDataStatement->bindInt64(2, iconID);
-                
-        // If we *have* image data, bind it to this statement - Otherwise bind "null" for the blob data, 
-        // signifying that this icon doesn't have any data    
-        if (snapshot.data() && snapshot.data()->size())
-            m_updateIconDataStatement->bindBlob(1, snapshot.data()->data(), snapshot.data()->size());
-        else
-            m_updateIconDataStatement->bindNull(1);
-        
-        if (m_updateIconDataStatement->step() != SQLITE_DONE)
-            LOG_ERROR("Failed to update icon data for url %s", urlForLogging(snapshot.iconURL()).ascii().data());
-
-        m_updateIconDataStatement->reset();
-    } else {    
-        readySQLiteStatement(m_setIconInfoStatement, m_syncDB, "INSERT INTO IconInfo (url,stamp) VALUES (?, ?);");
-        m_setIconInfoStatement->bindText(1, snapshot.iconURL());
-        m_setIconInfoStatement->bindInt64(2, snapshot.timestamp());
-
-        if (m_setIconInfoStatement->step() != SQLITE_DONE)
-            LOG_ERROR("Failed to set icon info for url %s", urlForLogging(snapshot.iconURL()).ascii().data());
-        
-        m_setIconInfoStatement->reset();
-        
-        int64_t iconID = m_syncDB.lastInsertRowID();
-
-        readySQLiteStatement(m_setIconDataStatement, m_syncDB, "INSERT INTO IconData (iconID, data) VALUES (?, ?);");
-        m_setIconDataStatement->bindInt64(1, iconID);
-
-        // If we *have* image data, bind it to this statement - Otherwise bind "null" for the blob data, 
-        // signifying that this icon doesn't have any data    
-        if (snapshot.data() && snapshot.data()->size())
-            m_setIconDataStatement->bindBlob(2, snapshot.data()->data(), snapshot.data()->size());
-        else
-            m_setIconDataStatement->bindNull(2);
-        
-        if (m_setIconDataStatement->step() != SQLITE_DONE)
-            LOG_ERROR("Failed to set icon data for url %s", urlForLogging(snapshot.iconURL()).ascii().data());
-
-        m_setIconDataStatement->reset();
-    }
-}
-
-bool IconDatabase::wasExcludedFromBackup()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-    return SQLiteStatement(m_syncDB, "SELECT value FROM IconDatabaseInfo WHERE key = 'ExcludedFromBackup';").getColumnInt(0);
-}
-
-void IconDatabase::setWasExcludedFromBackup()
-{
-    ASSERT_ICON_SYNC_THREAD();
-
-    SQLiteStatement(m_syncDB, "INSERT INTO IconDatabaseInfo (key, value) VALUES ('ExcludedFromBackup', 1)").executeCommand();
-}
-
-void IconDatabase::checkClosedAfterMainThreadCallback()
-{
-    ASSERT_NOT_SYNC_THREAD();
-
-    // If there are still callbacks in flight from the sync thread we cannot possibly be closed.
-    if (--m_mainThreadCallbackCount)
-        return;
-
-    // Even if there's no more pending callbacks the database might otherwise still be open.
-    if (isOpenBesidesMainThreadCallbacks())
-        return;
-
-    // This database is now actually closed! But first notify the client.
-    if (m_client)
-        m_client->didClose();
-}
-
-void IconDatabase::dispatchDidImportIconURLForPageURLOnMainThread(const String& pageURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    ++m_mainThreadCallbackCount;
-
-    callOnMainThread([this, pageURL = pageURL.isolatedCopy()] {
-        if (m_client)
-            m_client->didImportIconURLForPageURL(pageURL);
-        checkClosedAfterMainThreadCallback();
-    });
-}
-
-void IconDatabase::dispatchDidImportIconDataForPageURLOnMainThread(const String& pageURL)
-{
-    ASSERT_ICON_SYNC_THREAD();
-    ++m_mainThreadCallbackCount;
-
-    callOnMainThread([this, pageURL = pageURL.isolatedCopy()] {
-        if (m_client)
-            m_client->didImportIconDataForPageURL(pageURL);
-        checkClosedAfterMainThreadCallback();
-    });
-}
-
-void IconDatabase::dispatchDidRemoveAllIconsOnMainThread()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    ++m_mainThreadCallbackCount;
-
-    callOnMainThread([this] {
-        if (m_client)
-            m_client->didRemoveAllIcons();
-        checkClosedAfterMainThreadCallback();
-    });
-}
-
-void IconDatabase::dispatchDidFinishURLImportOnMainThread()
-{
-    ASSERT_ICON_SYNC_THREAD();
-    ++m_mainThreadCallbackCount;
-
-    callOnMainThread([this] {
-        if (m_client)
-            m_client->didFinishURLImport();
-        checkClosedAfterMainThreadCallback();
-    });
-}
-
-} // namespace WebCore
-
-#endif // ENABLE(ICONDATABASE)
diff --git a/Source/WebCore/loader/icon/IconDatabase.h b/Source/WebCore/loader/icon/IconDatabase.h
deleted file mode 100644 (file)
index 0040b42..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008, 2009, 2014 Apple Inc. All rights reserved.
- * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. 
- */
-#pragma once
-
-#include "IconDatabaseBase.h"
-#include <wtf/text/WTFString.h>
-
-#if ENABLE(ICONDATABASE)
-#include "SQLiteDatabase.h"
-#include "Timer.h"
-#include <wtf/Condition.h>
-#include <wtf/HashCountedSet.h>
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
-#endif
-
-namespace WebCore { 
-
-#if !ENABLE(ICONDATABASE)
-
-// Dummy version of IconDatabase that does nothing.
-class IconDatabase final : public IconDatabaseBase {
-    WTF_MAKE_FAST_ALLOCATED;
-
-public:
-    static void delayDatabaseCleanup() { }
-    static void allowDatabaseCleanup() { }
-    static void checkIntegrityBeforeOpening() { }
-
-    // FIXME: Is it really helpful to return a filename here rather than just the null string?
-    static String defaultDatabaseFilename() { return ASCIILiteral("WebpageIcons.db"); }
-};
-
-#else
-
-class IconRecord;
-class IconSnapshot;
-class PageURLRecord;
-class PageURLSnapshot;
-class SuddenTerminationDisabler;
-
-class IconDatabase final : public IconDatabaseBase {
-    WTF_MAKE_FAST_ALLOCATED;
-    
-// *** Main Thread Only ***
-public:
-    WEBCORE_EXPORT IconDatabase();
-    ~IconDatabase();
-
-    WEBCORE_EXPORT void setClient(IconDatabaseClient*) final;
-
-    WEBCORE_EXPORT bool open(const String& directory, const String& filename) final;
-    WEBCORE_EXPORT void close() final;
-            
-    WEBCORE_EXPORT void removeAllIcons() final;
-
-    void readIconForPageURLFromDisk(const String&);
-
-    WEBCORE_EXPORT Image* defaultIcon(const IntSize&) final;
-
-    WEBCORE_EXPORT void retainIconForPageURL(const String&) final;
-    WEBCORE_EXPORT void releaseIconForPageURL(const String&) final;
-    WEBCORE_EXPORT void setIconDataForIconURL(SharedBuffer* data, const String& iconURL) final;
-    WEBCORE_EXPORT void setIconURLForPageURL(const String& iconURL, const String& pageURL) final;
-
-    WEBCORE_EXPORT Image* synchronousIconForPageURL(const String&, const IntSize&) final;
-    NativeImagePtr synchronousNativeIconForPageURL(const String& pageURLOriginal, const IntSize&) final;
-    WEBCORE_EXPORT String synchronousIconURLForPageURL(const String&) final;
-    bool synchronousIconDataKnownForIconURL(const String&) final;
-    WEBCORE_EXPORT IconLoadDecision synchronousLoadDecisionForIconURL(const String&, DocumentLoader*) final;
-
-    WEBCORE_EXPORT void setEnabled(bool);
-    WEBCORE_EXPORT bool isEnabled() const final;
-
-    WEBCORE_EXPORT void setPrivateBrowsingEnabled(bool flag) final;
-    bool isPrivateBrowsingEnabled() const;
-
-    WEBCORE_EXPORT static void delayDatabaseCleanup();
-    WEBCORE_EXPORT static void allowDatabaseCleanup();
-    WEBCORE_EXPORT static void checkIntegrityBeforeOpening();
-
-    // Support for WebCoreStatistics in WebKit
-    WEBCORE_EXPORT size_t pageURLMappingCount() final;
-    WEBCORE_EXPORT size_t retainedPageURLCount() final;
-    WEBCORE_EXPORT size_t iconRecordCount() final;
-    WEBCORE_EXPORT size_t iconRecordCountWithData() final;
-
-private:
-    friend IconDatabaseBase& iconDatabase();
-
-    void notifyPendingLoadDecisions();
-
-    void wakeSyncThread();
-    void scheduleOrDeferSyncTimer();
-    void syncTimerFired();
-    
-    Timer m_syncTimer;
-    RefPtr<Thread> m_syncThread;
-    bool m_syncThreadRunning;
-    
-    HashSet<RefPtr<DocumentLoader>> m_loadersPendingDecision;
-
-    RefPtr<IconRecord> m_defaultIconRecord;
-
-    bool m_scheduleOrDeferSyncTimerRequested;
-    std::unique_ptr<SuddenTerminationDisabler> m_disableSuddenTerminationWhileSyncTimerScheduled;
-
-// *** Any Thread ***
-public:
-    WEBCORE_EXPORT bool isOpen() const final;
-    WEBCORE_EXPORT String databasePath() const final;
-    WEBCORE_EXPORT static String defaultDatabaseFilename();
-
-private:
-    Ref<IconRecord> getOrCreateIconRecord(const String& iconURL);
-    PageURLRecord* getOrCreatePageURLRecord(const String& pageURL);
-    
-    bool m_isEnabled;
-    bool m_privateBrowsingEnabled;
-
-    mutable Lock m_syncLock;
-    Condition m_syncCondition;
-    String m_databaseDirectory;
-    // Holding m_syncLock is required when accessing m_completeDatabasePath
-    String m_completeDatabasePath;
-
-    bool m_threadTerminationRequested;
-    bool m_removeIconsRequested;
-    bool m_iconURLImportComplete;
-    bool m_syncThreadHasWorkToDo;
-    std::unique_ptr<SuddenTerminationDisabler> m_disableSuddenTerminationWhileSyncThreadHasWorkToDo;
-
-    Lock m_urlAndIconLock;
-    // Holding m_urlAndIconLock is required when accessing any of the following data structures or the objects they contain
-    HashMap<String, IconRecord*> m_iconURLToRecordMap;
-    HashMap<String, PageURLRecord*> m_pageURLToRecordMap;
-    HashSet<String> m_retainedPageURLs;
-
-    Lock m_pendingSyncLock;
-    // Holding m_pendingSyncLock is required when accessing any of the following data structures
-    HashMap<String, PageURLSnapshot> m_pageURLsPendingSync;
-    HashMap<String, IconSnapshot> m_iconsPendingSync;
-    
-    Lock m_pendingReadingLock;    
-    // Holding m_pendingSyncLock is required when accessing any of the following data structures - when dealing with IconRecord*s, holding m_urlAndIconLock is also required
-    HashSet<String> m_pageURLsPendingImport;
-    HashSet<String> m_pageURLsInterestedInIcons;
-    HashSet<IconRecord*> m_iconsPendingReading;
-
-    Lock m_urlsToRetainOrReleaseLock;
-    // Holding m_urlsToRetainOrReleaseLock is required when accessing any of the following data structures.
-    HashCountedSet<String> m_urlsToRetain;
-    HashCountedSet<String> m_urlsToRelease;
-    bool m_retainOrReleaseIconRequested;
-
-// *** Sync Thread Only ***
-public:
-    WEBCORE_EXPORT bool shouldStopThreadActivity() const final;
-
-private:    
-    void iconDatabaseSyncThread();
-    
-    // The following block of methods are called exclusively by the sync thread to manage i/o to and from the database
-    // Each method should periodically monitor m_threadTerminationRequested when it makes sense to return early on shutdown
-    void performOpenInitialization();
-    bool checkIntegrity();
-    void performURLImport();
-    void syncThreadMainLoop();
-    bool readFromDatabase();
-    bool writeToDatabase();
-    void pruneUnretainedIcons();
-    void checkForDanglingPageURLs(bool pruneIfFound);
-    void removeAllIconsOnThread();
-    void deleteAllPreparedStatements();
-    void* cleanupSyncThread();
-    void performRetainIconForPageURL(const String&, int retainCount);
-    void performReleaseIconForPageURL(const String&, int releaseCount);
-    
-    bool wasExcludedFromBackup();
-    void setWasExcludedFromBackup();
-
-    bool isOpenBesidesMainThreadCallbacks() const;
-    void checkClosedAfterMainThreadCallback();
-
-    bool m_initialPruningComplete;
-        
-    void setIconURLForPageURLInSQLDatabase(const String&, const String&);
-    void setIconIDForPageURLInSQLDatabase(int64_t, const String&);
-    void removePageURLFromSQLDatabase(const String& pageURL);
-    int64_t getIconIDForIconURLFromSQLDatabase(const String& iconURL);
-    int64_t addIconURLToSQLDatabase(const String&);
-    RefPtr<SharedBuffer> getImageDataForIconURLFromSQLDatabase(const String& iconURL);
-    void removeIconFromSQLDatabase(const String& iconURL);
-    void writeIconSnapshotToSQLDatabase(const IconSnapshot&);    
-
-    void performPendingRetainAndReleaseOperations();
-
-    // Methods to dispatch client callbacks on the main thread
-    void dispatchDidImportIconURLForPageURLOnMainThread(const String&);
-    void dispatchDidImportIconDataForPageURLOnMainThread(const String&);
-    void dispatchDidRemoveAllIconsOnMainThread();
-    void dispatchDidFinishURLImportOnMainThread();
-    std::atomic<uint32_t> m_mainThreadCallbackCount;
-    
-    // The client is set by the main thread before the thread starts, and from then on is only used by the sync thread
-    IconDatabaseClient* m_client;
-    
-    SQLiteDatabase m_syncDB;
-    
-    std::unique_ptr<SQLiteStatement> m_setIconIDForPageURLStatement;
-    std::unique_ptr<SQLiteStatement> m_removePageURLStatement;
-    std::unique_ptr<SQLiteStatement> m_getIconIDForIconURLStatement;
-    std::unique_ptr<SQLiteStatement> m_getImageDataForIconURLStatement;
-    std::unique_ptr<SQLiteStatement> m_addIconToIconInfoStatement;
-    std::unique_ptr<SQLiteStatement> m_addIconToIconDataStatement;
-    std::unique_ptr<SQLiteStatement> m_getImageDataStatement;
-    std::unique_ptr<SQLiteStatement> m_deletePageURLsForIconURLStatement;
-    std::unique_ptr<SQLiteStatement> m_deleteIconFromIconInfoStatement;
-    std::unique_ptr<SQLiteStatement> m_deleteIconFromIconDataStatement;
-    std::unique_ptr<SQLiteStatement> m_updateIconInfoStatement;
-    std::unique_ptr<SQLiteStatement> m_updateIconDataStatement;
-    std::unique_ptr<SQLiteStatement> m_setIconInfoStatement;
-    std::unique_ptr<SQLiteStatement> m_setIconDataStatement;
-};
-
-#endif // !ENABLE(ICONDATABASE)
-
-} // namespace WebCore
diff --git a/Source/WebCore/loader/icon/IconDatabaseBase.cpp b/Source/WebCore/loader/icon/IconDatabaseBase.cpp
deleted file mode 100644 (file)
index 4c69310..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2011 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 met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "IconDatabaseBase.h"
-
-#include "IconDatabase.h"
-#include "URL.h"
-#include "SharedBuffer.h"
-
-namespace WebCore {
-
-String IconDatabaseBase::synchronousIconURLForPageURL(const String&)
-{
-    return String();
-}
-
-String IconDatabaseBase::databasePath() const
-{
-    return String();
-}
-
-bool IconDatabaseBase::open(const String&, const String&)
-{
-    return false;
-}
-
-static IconDatabaseBase* vmbase = nullptr;
-
-// Functions to get/set the global icon database.
-IconDatabaseBase& iconDatabase()
-{
-    if (vmbase)
-        return *vmbase;
-
-    static IconDatabaseBase* defaultDatabase = nullptr;
-    if (!defaultDatabase)
-        defaultDatabase = new IconDatabase;
-
-    return *defaultDatabase;
-}
-
-void setGlobalIconDatabase(IconDatabaseBase* newGlobalDatabase)
-{
-    vmbase = newGlobalDatabase;
-}
-
-bool documentCanHaveIcon(const String& documentURL)
-{
-    return !documentURL.isEmpty() && !protocolIs(documentURL, "about");
-}
-
-} // namespace WebCore
diff --git a/Source/WebCore/loader/icon/IconDatabaseBase.h b/Source/WebCore/loader/icon/IconDatabaseBase.h
deleted file mode 100644 (file)
index d4051b9..0000000
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2011 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 met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. 
- */
-#pragma once
-
-#include "NativeImage.h"
-#include <wtf/Forward.h>
-#include <wtf/Noncopyable.h>
-#include <wtf/RefCounted.h>
-
-namespace WebCore {
-
-class DocumentLoader;
-class IconDatabaseClient;
-class Image;
-class IntSize;
-class SharedBuffer;
-
-enum IconLoadDecision { IconLoadYes, IconLoadNo, IconLoadUnknown };
-
-class CallbackBase : public RefCounted<CallbackBase> {
-public:
-    virtual ~CallbackBase()
-    {
-    }
-
-    uint64_t callbackID() const { return m_callbackID; }
-
-protected:
-    CallbackBase(void* context)
-        : m_context(context)
-        , m_callbackID(generateCallbackID())
-    {
-    }
-
-    void* context() const { return m_context; }
-
-private:
-    static uint64_t generateCallbackID()
-    {
-        static uint64_t uniqueCallbackID = 1;
-        return uniqueCallbackID++;
-    }
-
-    void* m_context;
-    uint64_t m_callbackID;
-};
-
-template<typename EnumType> 
-class EnumCallback : public CallbackBase {
-public:
-    typedef void (*CallbackFunction)(EnumType, void*);
-
-    static Ref<EnumCallback> create(void* context, CallbackFunction callback)
-    {
-        return adoptRef(*new EnumCallback(context, callback));
-    }
-
-    virtual ~EnumCallback()
-    {
-        ASSERT(!m_callback);
-    }
-
-    void performCallback(EnumType result)
-    {
-        if (!m_callback)
-            return;
-        m_callback(result, context());
-        m_callback = nullptr;
-    }
-    
-    void invalidate()
-    {
-        m_callback = nullptr;
-    }
-
-private:
-    EnumCallback(void* context, CallbackFunction callback)
-        : CallbackBase(context)
-        , m_callback(callback)
-    {
-        ASSERT(m_callback);
-    }
-
-    CallbackFunction m_callback;
-};
-
-template<typename ObjectType> 
-class ObjectCallback : public CallbackBase {
-public:
-    typedef void (*CallbackFunction)(ObjectType, void*);
-
-    static Ref<ObjectCallback> create(void* context, CallbackFunction callback)
-    {
-        return adoptRef(*new ObjectCallback(context, callback));
-    }
-
-    virtual ~ObjectCallback()
-    {
-        ASSERT(!m_callback);
-    }
-
-    void performCallback(ObjectType result)
-    {
-        if (!m_callback)
-            return;
-        m_callback(result, context());
-        m_callback = nullptr;
-    }
-
-    void invalidate()
-    {
-        m_callback = nullptr;
-    }
-
-private:
-    ObjectCallback(void* context, CallbackFunction callback)
-        : CallbackBase(context)
-        , m_callback(callback)
-    {
-        ASSERT(m_callback);
-    }
-
-    CallbackFunction m_callback;
-};
-
-using IconLoadDecisionCallback = EnumCallback<IconLoadDecision>;
-using IconDataCallback = ObjectCallback<SharedBuffer*>;
-
-class WEBCORE_EXPORT IconDatabaseBase {
-    WTF_MAKE_NONCOPYABLE(IconDatabaseBase);
-
-public:
-    virtual ~IconDatabaseBase() { }
-
-    virtual bool isEnabled() const { return false; }
-
-    virtual void retainIconForPageURL(const String&) { }
-    virtual void releaseIconForPageURL(const String&) { }
-
-    virtual void setIconURLForPageURL(const String& /*iconURL*/, const String& /*pageURL*/) { }
-    virtual void setIconDataForIconURL(SharedBuffer*, const String& /*iconURL*/) { }
-
-    // Synchronous calls used internally by WebCore.
-    // Usage should be replaced by asynchronous calls.
-    virtual String synchronousIconURLForPageURL(const String&);
-    virtual bool synchronousIconDataKnownForIconURL(const String&) { return false; }
-    virtual IconLoadDecision synchronousLoadDecisionForIconURL(const String&, DocumentLoader*) { return IconLoadNo; }
-    virtual Image* synchronousIconForPageURL(const String&, const IntSize&) { return nullptr; }
-    virtual NativeImagePtr synchronousNativeIconForPageURL(const String&, const IntSize&) { return nullptr; }
-
-    // Asynchronous calls we should use to replace the above when supported.
-    virtual bool supportsAsynchronousMode() { return false; }
-    virtual void loadDecisionForIconURL(const String&, IconLoadDecisionCallback&) { }
-    virtual void iconDataForIconURL(const String&, IconDataCallback&) { }
-
-    // Used within one or more WebKit ports.
-    // We should try to remove these dependencies from the IconDatabaseBase class.
-
-    virtual void setEnabled(bool) { }
-
-    virtual Image* defaultIcon(const IntSize&) { return nullptr; }
-
-    virtual size_t pageURLMappingCount() { return 0; }
-    virtual size_t retainedPageURLCount() { return 0; }
-    virtual size_t iconRecordCount() { return 0; }
-    virtual size_t iconRecordCountWithData() { return 0; }
-
-    virtual bool shouldStopThreadActivity() const { return true; }
-
-    virtual bool open(const String& directory, const String& filename);
-    virtual void close() { }
-    virtual void removeAllIcons() { }
-
-    virtual void setPrivateBrowsingEnabled(bool) { }
-    virtual void setClient(IconDatabaseClient*) { }
-
-    virtual bool isOpen() const { return false; }
-    virtual String databasePath() const;
-
-protected:
-    IconDatabaseBase() = default;
-};
-
-// Functions to get/set the global icon database.
-WEBCORE_EXPORT IconDatabaseBase& iconDatabase();
-WEBCORE_EXPORT void setGlobalIconDatabase(IconDatabaseBase*);
-bool documentCanHaveIcon(const String&);
-
-} // namespace WebCore
diff --git a/Source/WebCore/loader/icon/IconDatabaseClient.h b/Source/WebCore/loader/icon/IconDatabaseClient.h
deleted file mode 100644 (file)
index 33e5413..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2007, 2011 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.
- */
-#pragma once
-
-#include <wtf/Forward.h>
-namespace WebCore {
-
-class IconDatabaseClient {
-public:
-    virtual ~IconDatabaseClient() { }
-
-    virtual void didImportIconURLForPageURL(const String&) = 0;
-    virtual void didImportIconDataForPageURL(const String&) = 0;
-    virtual void didChangeIconForPageURL(const String&) = 0;
-    virtual void didRemoveAllIcons() = 0;
-    virtual void didFinishURLImport() = 0;
-    virtual void didClose() { }
-};
-} // namespace WebCore 
index 5f822ef..ebe2a06 100644 (file)
@@ -35,8 +35,6 @@
 #include "Frame.h"
 #include "FrameLoader.h"
 #include "FrameLoaderClient.h"
-#include "IconController.h"
-#include "IconDatabase.h"
 #include "Logging.h"
 #include "ResourceRequest.h"
 #include "SharedBuffer.h"
 
 namespace WebCore {
 
-IconLoader::IconLoader(Frame& frame)
-    : m_frame(&frame)
-    , m_url(frame.loader().icon().url())
-{
-}
-
 IconLoader::IconLoader(DocumentLoader& documentLoader, const URL& url)
-    : m_documentLoader(&documentLoader)
+    : m_documentLoader(documentLoader)
     , m_url(url)
 {
 }
@@ -63,19 +55,14 @@ IconLoader::~IconLoader()
 
 void IconLoader::startLoading()
 {
-    ASSERT(m_frame || m_documentLoader);
-
     if (m_resource)
         return;
 
-    if (m_frame && !m_frame->document())
-        return;
-
-
-    if (m_documentLoader && !m_documentLoader->frame())
+    auto* frame = m_documentLoader.frame();
+    if (!frame)
         return;
 
-    ResourceRequest resourceRequest = m_documentLoader ? m_url :  m_frame->loader().icon().url();
+    ResourceRequest resourceRequest = m_url;
     resourceRequest.setPriority(ResourceLoadPriority::Low);
 #if !ERROR_DISABLED
     // Copy this because we may want to access it after transferring the
@@ -88,7 +75,6 @@ void IconLoader::startLoading()
 
     request.setInitiator(cachedResourceRequestInitiators().icon);
 
-    auto* frame = m_frame ? m_frame : m_documentLoader->frame();
     m_resource = frame->document()->cachedResourceLoader().requestIcon(WTFMove(request));
     if (m_resource)
         m_resource->addClient(*this);
@@ -124,22 +110,9 @@ void IconLoader::notifyFinished(CachedResource& resource)
 
     LOG(IconDatabase, "IconLoader::finishLoading() - Committing iconURL %s to database", m_resource->url().string().ascii().data());
 
-    if (!m_frame) {
-        // DocumentLoader::finishedLoadingIcon destroys this IconLoader as it finishes. This will automatically
-        // trigger IconLoader::stopLoading() during destruction, so we should just return here.
-        m_documentLoader->finishedLoadingIcon(*this, data);
-        return;
-    }
-
-    m_frame->loader().icon().commitToDatabase(m_resource->url());
-
-    // Setting the icon data only after committing to the database ensures that the data is
-    // kept in memory (so it does not have to be read from the database asynchronously), since
-    // there is a page URL referencing it.
-    iconDatabase().setIconDataForIconURL(data, m_resource->url().string());
-    m_frame->loader().client().dispatchDidReceiveIcon();
-
-    stopLoading();
+    // DocumentLoader::finishedLoadingIcon destroys this IconLoader as it finishes. This will automatically
+    // trigger IconLoader::stopLoading() during destruction, so we should just return here.
+    m_documentLoader.finishedLoadingIcon(*this, data);
 }
 
 }
index 2de53e8..6aa5537 100644 (file)
@@ -40,7 +40,6 @@ class Frame;
 class IconLoader final : private CachedRawResourceClient {
     WTF_MAKE_NONCOPYABLE(IconLoader); WTF_MAKE_FAST_ALLOCATED;
 public:
-    explicit IconLoader(Frame&);
     IconLoader(DocumentLoader&, const URL&);
     virtual ~IconLoader();
 
@@ -50,8 +49,7 @@ public:
 private:
     void notifyFinished(CachedResource&) final;
 
-    Frame* m_frame { nullptr };
-    DocumentLoader* m_documentLoader { nullptr };
+    DocumentLoader& m_documentLoader;
     URL m_url;
     CachedResourceHandle<CachedRawResource> m_resource;
 };
diff --git a/Source/WebCore/loader/icon/IconRecord.cpp b/Source/WebCore/loader/icon/IconRecord.cpp
deleted file mode 100644 (file)
index c809dc8..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2007 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "IconRecord.h"
-
-#include "BitmapImage.h"
-#include "IconDatabase.h"
-#include "Logging.h"
-#include "SQLiteStatement.h"
-#include "SQLiteTransaction.h"
-#include <wtf/text/CString.h>
-
-#include <limits.h>
-
-namespace WebCore {
-
-IconRecord::IconRecord(const String& url)
-    : m_iconURL(url)
-    , m_stamp(0)
-    , m_dataSet(false)
-{
-
-}
-
-IconRecord::~IconRecord()
-{
-    LOG(IconDatabase, "Destroying IconRecord for icon url %s", m_iconURL.ascii().data());
-}
-
-Image* IconRecord::image(const IntSize&)
-{
-    // FIXME rdar://4680377 - For size right now, we are returning our one and only image and the Bridge
-    // is resizing it in place.  We need to actually store all the original representations here and return a native
-    // one, or resize the best one to the requested size and cache that result.
-    
-    return m_image.get();
-}
-
-void IconRecord::setImageData(RefPtr<SharedBuffer>&& data)
-{
-    // It's okay to delete the raw image here. Any existing clients using this icon will be
-    // managing an image that was created with a copy of this raw image data.
-    m_image = BitmapImage::create();
-
-    // Copy the provided data into the buffer of the new Image object.
-    if (m_image->setData(WTFMove(data), true) < EncodedDataStatus::SizeAvailable) {
-        LOG(IconDatabase, "Manual image data for iconURL '%s' FAILED - it was probably invalid image data", m_iconURL.ascii().data());
-        m_image = nullptr;
-    }
-    
-    m_dataSet = true;
-}
-
-void IconRecord::loadImageFromResource(const char* resource)
-{
-    if (!resource)
-        return;
-        
-    m_image = Image::loadPlatformResource(resource);
-    m_dataSet = true;
-}
-
-ImageDataStatus IconRecord::imageDataStatus()
-{
-    if (!m_dataSet)
-        return ImageDataStatusUnknown;
-    if (!m_image)
-        return ImageDataStatusMissing;
-    return ImageDataStatusPresent;
-}
-
-IconSnapshot IconRecord::snapshot(bool forDeletion) const
-{
-    if (forDeletion)
-        return IconSnapshot(m_iconURL, 0, 0);
-    
-    return IconSnapshot(m_iconURL, m_stamp, m_image ? m_image->data() : 0);
-}
-
-} // namespace WebCore    
diff --git a/Source/WebCore/loader/icon/IconRecord.h b/Source/WebCore/loader/icon/IconRecord.h
deleted file mode 100644 (file)
index f2105a3..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2007 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.
- */
-#pragma once
-
-#include "PageURLRecord.h"
-#include "SharedBuffer.h"
-#include <wtf/HashSet.h>
-#include <wtf/RefCounted.h>
-#include <wtf/text/StringHash.h>
-#include <wtf/text/WTFString.h>
-
-#if OS(SOLARIS)
-#include <sys/types.h> // For time_t structure.
-#endif
-
-namespace WebCore { 
-
-class IconDataSnapshot;
-class Image;
-class IntSize;
-class SQLDatabase;
-
-enum ImageDataStatus {
-    ImageDataStatusPresent, ImageDataStatusMissing, ImageDataStatusUnknown
-};
-
-class IconSnapshot {
-public:
-    IconSnapshot() : m_timestamp(0) { }
-    
-    IconSnapshot(const String& iconURL, int timestamp, SharedBuffer* data)
-        : m_iconURL(iconURL)
-        , m_timestamp(timestamp)
-        , m_data(data)
-    { }
-
-    const String& iconURL() const { return m_iconURL; }
-    int timestamp() const { return m_timestamp; }
-    SharedBuffer* data() const { return m_data.get(); }
-
-private:
-    String m_iconURL;
-    int m_timestamp;
-    RefPtr<SharedBuffer> m_data;
-};
-    
-class IconRecord : public RefCounted<IconRecord> {
-    friend class PageURLRecord;
-public:
-    static Ref<IconRecord> create(const String& url)
-    {
-        return adoptRef(*new IconRecord(url));
-    }
-    ~IconRecord();
-    
-    time_t getTimestamp() { return m_stamp; }
-    void setTimestamp(time_t stamp) { m_stamp = stamp; }
-        
-    void setImageData(RefPtr<SharedBuffer>&&);
-    Image* image(const IntSize&);    
-    
-    String iconURL() { return m_iconURL; }
-
-    void loadImageFromResource(const char*);
-        
-    ImageDataStatus imageDataStatus();
-    
-    const HashSet<String>& retainingPageURLs() { return m_retainingPageURLs; }
-    
-    IconSnapshot snapshot(bool forDeletion = false) const;
-
-private:
-    IconRecord(const String& url); 
-
-    String m_iconURL;
-    time_t m_stamp;
-    RefPtr<Image> m_image;
-    
-    HashSet<String> m_retainingPageURLs;
-        
-    // This allows us to cache whether or not a SiteIcon has had its data set yet
-    // This helps the IconDatabase know if it has to set the data on a new object or not,
-    // and also to determine if the icon is missing data or if it just hasn't been brought
-    // in from the DB yet
-    bool m_dataSet;
-    
-    // FIXME - Right now WebCore::Image doesn't have a very good API for accessing multiple representations
-    // Even the NSImage way of doing things that we do in WebKit isn't very clean...  once we come up with a 
-    // better way of handling that, we'll likely have a map of size-to-images similar to below
-    // typedef HashMap<IntSize, Image*> SizeImageMap;
-    // SizeImageMap m_images;
-};
-
-} //namespace WebCore
diff --git a/Source/WebCore/loader/icon/PageURLRecord.cpp b/Source/WebCore/loader/icon/PageURLRecord.cpp
deleted file mode 100644 (file)
index 99dded8..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2006, 2007 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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 "PageURLRecord.h"
-
-#include "IconRecord.h"
-
-namespace WebCore {
-
-PageURLRecord::PageURLRecord(const String& pageURL)
-    : m_pageURL(pageURL)
-{
-}
-
-PageURLRecord::~PageURLRecord()
-{
-    if (m_iconRecord)
-        m_iconRecord->m_retainingPageURLs.remove(m_pageURL);
-}
-
-void PageURLRecord::setIconRecord(RefPtr<IconRecord>&& icon)
-{
-    if (m_iconRecord)
-        m_iconRecord->m_retainingPageURLs.remove(m_pageURL);
-
-    m_iconRecord = WTFMove(icon);
-
-    if (m_iconRecord)
-        m_iconRecord->m_retainingPageURLs.add(m_pageURL);
-}
-    
-PageURLSnapshot PageURLRecord::snapshot(bool forDeletion) const 
-{
-    return { m_pageURL, (m_iconRecord && !forDeletion) ? m_iconRecord->iconURL() : String() };
-}
-
-} // namespace WebCore
diff --git a/Source/WebCore/loader/icon/PageURLRecord.h b/Source/WebCore/loader/icon/PageURLRecord.h
deleted file mode 100644 (file)
index 189875e..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2007 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.
- */
-#pragma once
-
-#include <wtf/Noncopyable.h>
-#include <wtf/RefPtr.h>
-#include <wtf/text/WTFString.h>
-
-namespace WebCore {
-
-class IconRecord;
-
-class PageURLSnapshot {
-public:
-    PageURLSnapshot() { }
-    
-    PageURLSnapshot(const String& pageURL, const String& iconURL)
-        : m_pageURL(pageURL)
-        , m_iconURL(iconURL)
-    { }
-
-    const String& pageURL() const { return m_pageURL; }
-    const String& iconURL() const { return m_iconURL; }
-
-private:
-    String m_pageURL;
-    String m_iconURL;
-};
-
-class PageURLRecord {
-    WTF_MAKE_NONCOPYABLE(PageURLRecord); WTF_MAKE_FAST_ALLOCATED;
-public:
-    PageURLRecord(const String& pageURL);
-    ~PageURLRecord();
-
-    inline String url() const { return m_pageURL; }
-    
-    void setIconRecord(RefPtr<IconRecord>&&);
-    IconRecord* iconRecord() { return m_iconRecord.get(); }
-
-    PageURLSnapshot snapshot(bool forDeletion = false) const;
-
-    // Returns false if the page wasn't retained beforehand, true if the retain count was already 1 or higher
-    bool retain(int count)
-    {
-        bool wasRetained = m_retainCount > 0;
-        m_retainCount += count;
-        return wasRetained;
-    }
-
-    // Returns true if the page is still retained after the call.  False if the retain count just dropped to 0
-    bool release(int count)
-    {
-        ASSERT(m_retainCount >= count);
-        m_retainCount -= count;
-        return m_retainCount > 0;
-    }
-
-    int retainCount() const { return m_retainCount; }
-
-private:
-    String m_pageURL;
-    RefPtr<IconRecord> m_iconRecord;
-    int m_retainCount { 0 };
-};
-
-} // namespace WebCore
index 31c8fab..656f792 100644 (file)
@@ -51,6 +51,7 @@
 #include "DOMWindow.h"
 #include "DisplayList.h"
 #include "Document.h"
+#include "DocumentLoader.h"
 #include "DocumentMarker.h"
 #include "DocumentMarkerController.h"
 #include "Editor.h"
@@ -79,7 +80,6 @@
 #include "HistoryController.h"
 #include "HistoryItem.h"
 #include "HitTestResult.h"
-#include "IconController.h"
 #include "InspectorClient.h"
 #include "InspectorController.h"
 #include "InspectorFrontendClientLocal.h"
@@ -2528,15 +2528,18 @@ int Internals::pageNumber(Element& element, float pageWidth, float pageHeight)
 
 Vector<String> Internals::shortcutIconURLs() const
 {
-    Vector<String> vector;
-
     if (!frame())
-        return vector;
+        return { };
+    
+    auto* documentLoader = frame()->loader().documentLoader();
+    if (!documentLoader)
+        return { };
 
-    auto string = frame()->loader().icon().url().string();
-    if (!string.isNull())
-        vector.append(string);
-    return vector;
+    Vector<String> result;
+    for (auto& linkIcon : documentLoader->linkIcons())
+        result.append(linkIcon.url.string());
+    
+    return result;
 }
 
 int Internals::numberOfPages(float pageWidth, float pageHeight)
index fa8eedc..71edfa1 100644 (file)
@@ -1,3 +1,15 @@
+2017-07-21  Brady Eidson  <beidson@apple.com>
+
+        Get rid of WebCore IconDatabase code.
+        https://bugs.webkit.org/show_bug.cgi?id=174700
+
+        Reviewed by Tim Horton.
+
+        * UIProcess/API/glib/WebKitWebContext.cpp:
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
+        (WebKit::WebFrameLoaderClient::useIconLoadingClient): Deleted.
+        * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+
 2017-07-21  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Web Automation: implicit navigations don't cause browsing context switch
index 2587f8e..53d94fc 100644 (file)
@@ -55,7 +55,6 @@
 #include "WebsiteDataType.h"
 #include <JavaScriptCore/RemoteInspector.h>
 #include <WebCore/FileSystem.h>
-#include <WebCore/IconDatabase.h>
 #include <WebCore/Language.h>
 #include <glib/gi18n-lib.h>
 #include <libintl.h>
index 3819426..9f5f984 100644 (file)
@@ -1803,11 +1803,6 @@ void WebFrameLoaderClient::didRestoreScrollPosition()
     webPage->didRestoreScrollPosition();
 }
 
-bool WebFrameLoaderClient::useIconLoadingClient()
-{
-    return m_useIconLoadingClient;
-}
-
 void WebFrameLoaderClient::getLoadDecisionForIcons(const Vector<std::pair<WebCore::LinkIcon&, uint64_t>>& icons)
 {
     auto* webPage = m_frame->page();
index 25a8e6a..4d7c5de 100644 (file)
@@ -257,7 +257,6 @@ private:
 
     void didRestoreScrollPosition() final;
 
-    bool useIconLoadingClient() final;
     void getLoadDecisionForIcons(const Vector<std::pair<WebCore::LinkIcon&, uint64_t>>&) final;
     void finishedLoadingIcon(uint64_t callbackIdentifier, WebCore::SharedBuffer*) final;
 
index 92148e3..a0700ec 100644 (file)
@@ -1,3 +1,12 @@
+2017-07-21  Brady Eidson  <beidson@apple.com>
+
+        Get rid of WebCore IconDatabase code.
+        https://bugs.webkit.org/show_bug.cgi?id=174700
+
+        Reviewed by Tim Horton.
+
+        * WebKitLegacy.xcodeproj/project.pbxproj:
+
 2017-07-17  Konstantin Tokarev  <annulen@yandex.ru>
 
         [cmake] Set library types before their targets are created
index 3808859..d4beeea 100644 (file)
                511F3FD80CECC88F00852565 /* WebDatabaseManagerClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 511F3FD40CECC88F00852565 /* WebDatabaseManagerClient.mm */; };
                5120C82C1E54CE8A0025B250 /* WebKitVersionChecks.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5120C82B1E54CE8A0025B250 /* WebKitVersionChecks.mm */; };
                512BDB531C471591006494DF /* WebDatabaseProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 512BDB521C471591006494DF /* WebDatabaseProvider.mm */; };
-               51494CD60C7EBDE0004178C5 /* WebIconDatabaseClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 51494CD40C7EBDE0004178C5 /* WebIconDatabaseClient.h */; };
-               51494CD70C7EBDE0004178C5 /* WebIconDatabaseClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51494CD50C7EBDE0004178C5 /* WebIconDatabaseClient.mm */; };
                5158F6EF106D862A00AF457C /* WebHistoryDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5158F6EE106D862A00AF457C /* WebHistoryDelegate.h */; };
                5185F62610712B80007AA393 /* WebNavigationData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5185F62510712B80007AA393 /* WebNavigationData.h */; settings = {ATTRIBUTES = (Private, ); }; };
                5185F62810712B97007AA393 /* WebNavigationData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5185F62710712B97007AA393 /* WebNavigationData.mm */; };
                51443F9A0429392B00CA2D3A /* WebPolicyDelegate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebPolicyDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                51443F9B0429392B00CA2D3A /* WebPolicyDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebPolicyDelegate.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                51443F9C0429392B00CA2D3A /* WebPolicyDelegatePrivate.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebPolicyDelegatePrivate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
-               51494CD40C7EBDE0004178C5 /* WebIconDatabaseClient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebIconDatabaseClient.h; sourceTree = "<group>"; };
-               51494CD50C7EBDE0004178C5 /* WebIconDatabaseClient.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = WebIconDatabaseClient.mm; sourceTree = "<group>"; };
                5152FADD033FC50400CA2ACD /* WebDefaultContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebDefaultContextMenuDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                5152FADE033FC50400CA2ACD /* WebDefaultContextMenuDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebDefaultContextMenuDelegate.mm; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                5152FADF033FC50400CA2ACD /* WebDefaultPolicyDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = WebDefaultPolicyDelegate.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                                9391F274121B38BD00EBF7E8 /* WebFrameNetworkingContext.mm */,
                                BC7F884910C8775A00D6133D /* WebGeolocationClient.h */,
                                BC7F884A10C8775A00D6133D /* WebGeolocationClient.mm */,
-                               51494CD40C7EBDE0004178C5 /* WebIconDatabaseClient.h */,
-                               51494CD50C7EBDE0004178C5 /* WebIconDatabaseClient.mm */,
                                06693DDA0BFBA85200216072 /* WebInspectorClient.h */,
                                06693DDB0BFBA85200216072 /* WebInspectorClient.mm */,
                                1C7B0C650EB2464D00A28502 /* WebInspectorClientCF.cpp */,
                                939810A10824BF01008DF038 /* WebHTMLViewInternal.h in Headers */,
                                939810580824BF01008DF038 /* WebHTMLViewPrivate.h in Headers */,
                                939810180824BF01008DF038 /* WebIconDatabase.h in Headers */,
-                               51494CD60C7EBDE0004178C5 /* WebIconDatabaseClient.h in Headers */,
                                9321D5921A391DC3008052BE /* WebImmediateActionController.h in Headers */,
                                A560946614D8AD2600799A8A /* WebIndicateLayer.h in Headers */,
                                5D7BF8140C2A1D90008CE06D /* WebInspector.h in Headers */,
                                939810F30824BF01008DF038 /* WebHTMLRepresentation.mm in Sources */,
                                939810F40824BF01008DF038 /* WebHTMLView.mm in Sources */,
                                939810C10824BF01008DF038 /* WebIconDatabase.mm in Sources */,
-                               51494CD70C7EBDE0004178C5 /* WebIconDatabaseClient.mm in Sources */,
                                9321D5941A391DF9008052BE /* WebImmediateActionController.mm in Sources */,
                                A560946714D8AD2600799A8A /* WebIndicateLayer.mm in Sources */,
                                5D7BF8150C2A1D90008CE06D /* WebInspector.mm in Sources */,
index c335dd1..d8284d4 100644 (file)
@@ -1,3 +1,22 @@
+2017-07-21  Brady Eidson  <beidson@apple.com>
+
+        Get rid of WebCore IconDatabase code.
+        https://bugs.webkit.org/show_bug.cgi?id=174700
+
+        Reviewed by Tim Horton.
+
+        * Misc/WebCoreStatistics.mm:
+        (+[WebCoreStatistics iconPageURLMappingCount]):
+        (+[WebCoreStatistics iconRetainedPageURLCount]):
+        (+[WebCoreStatistics iconRecordCount]):
+        (+[WebCoreStatistics iconsWithDataCount]):
+        * WebCoreSupport/WebFrameLoaderClient.h:
+        * WebCoreSupport/WebFrameLoaderClient.mm:
+        * WebCoreSupport/WebIconDatabaseClient.h: Removed.
+        * WebCoreSupport/WebIconDatabaseClient.mm: Removed.
+        * WebView/WebView.mm:
+        (-[WebView mainFrameIconURL]):
+
 2017-07-20  Chris Dumez  <cdumez@apple.com>
 
         Drop legacy XPathException type
index 8b289d1..6096de8 100644 (file)
@@ -39,7 +39,6 @@
 #import <WebCore/GCController.h>
 #import <WebCore/GlyphPage.h>
 #import <WebCore/GraphicsContext.h>
-#import <WebCore/IconDatabase.h>
 #import <WebCore/JSDOMWindow.h>
 #import <WebCore/PageCache.h>
 #import <WebCore/PageConsoleClient.h>
@@ -128,22 +127,22 @@ using namespace WebCore;
 
 + (size_t)iconPageURLMappingCount
 {
-    return iconDatabase().pageURLMappingCount();
+    return 0;
 }
 
 + (size_t)iconRetainedPageURLCount
 {
-    return iconDatabase().retainedPageURLCount();
+    return 0;
 }
 
 + (size_t)iconRecordCount
 {
-    return iconDatabase().iconRecordCount();
+    return 0;
 }
 
 + (size_t)iconsWithDataCount
 {
-    return iconDatabase().iconRecordCountWithData();
+    return 0;
 }
 
 + (size_t)cachedFontDataCount
index aba876d..aad4d6f 100644 (file)
@@ -250,7 +250,6 @@ private:
 
     void prefetchDNS(const String&) final;
 
-    bool useIconLoadingClient() final { return true; }
     void getLoadDecisionForIcons(const Vector<std::pair<WebCore::LinkIcon&, uint64_t>>&) final;
     void finishedLoadingIcon(uint64_t, WebCore::SharedBuffer*) final;
 
index 8ed4a84..7783ff4 100644 (file)
 #import <WebCore/HistoryController.h>
 #import <WebCore/HistoryItem.h>
 #import <WebCore/HitTestResult.h>
-#import <WebCore/IconDatabase.h>
 #import <WebCore/LoaderNSURLExtras.h>
 #import <WebCore/MIMETypeRegistry.h>
 #import <WebCore/MainFrame.h>
diff --git a/Source/WebKitLegacy/mac/WebCoreSupport/WebIconDatabaseClient.h b/Source/WebKitLegacy/mac/WebCoreSupport/WebIconDatabaseClient.h
deleted file mode 100644 (file)
index 907ad25..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2007 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.
- */
-
-#import <WebCore/IconDatabaseClient.h>
-#import <wtf/Forward.h>
-
-class WebIconDatabaseClient : public WebCore::IconDatabaseClient {
-public:
-    void didRemoveAllIcons() override;
-    void didImportIconURLForPageURL(const String&) override;
-    void didImportIconDataForPageURL(const String&) override;
-    void didChangeIconForPageURL(const String&) override;
-    void didFinishURLImport() override;
-};
diff --git a/Source/WebKitLegacy/mac/WebCoreSupport/WebIconDatabaseClient.mm b/Source/WebKitLegacy/mac/WebCoreSupport/WebIconDatabaseClient.mm
deleted file mode 100644 (file)
index 606e00f..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2007 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 met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer. 
- * 2.  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. 
- * 3.  Neither the name of Apple Inc. ("Apple") 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 APPLE AND ITS 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 APPLE OR ITS 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.
- */
-
-#import "WebIconDatabaseClient.h"
-
-#import <wtf/text/WTFString.h>
-
-#if ENABLE(ICONDATABASE)
-
-void WebIconDatabaseClient::didRemoveAllIcons()
-{
-}
-
-void WebIconDatabaseClient::didImportIconURLForPageURL(const String& pageURL)
-{
-}
-
-void WebIconDatabaseClient::didImportIconDataForPageURL(const String& pageURL)
-{
-    // WebKit1 only has a single "icon did change" notification.
-    didImportIconURLForPageURL(pageURL);
-}
-void WebIconDatabaseClient::didChangeIconForPageURL(const String& pageURL)
-{
-    // WebKit1 only has a single "icon did change" notification.
-    didImportIconURLForPageURL(pageURL);
-}
-
-void WebIconDatabaseClient::didFinishURLImport()
-{
-}
-
-#endif // ENABLE(ICONDATABASE)
index b1fd72e..24335ac 100644 (file)
 #import <WebCore/HTMLVideoElement.h>
 #import <WebCore/HistoryController.h>
 #import <WebCore/HistoryItem.h>
-#import <WebCore/IconDatabase.h>
 #import <WebCore/JSCSSStyleDeclaration.h>
 #import <WebCore/JSDocument.h>
 #import <WebCore/JSElement.h>
 #import <WebCore/EventNames.h>
 #import <WebCore/FontCache.h>
 #import <WebCore/GraphicsLayer.h>
-#import <WebCore/IconController.h>
 #import <WebCore/LegacyTileCache.h>
 #import <WebCore/MobileGestaltSPI.h>
 #import <WebCore/PlatformScreen.h>
@@ -7009,9 +7007,17 @@ static WebFrame *incrementFrame(WebFrame *frame, WebFindOptions options = 0)
     Frame *coreMainFrame = core(mainFrame);
     if (!coreMainFrame)
         return nil;
+    
+    auto* documentLoader = coreMainFrame->loader().documentLoader();
+    if (!documentLoader)
+        return nil;
+    
+    auto& linkIcons = documentLoader->linkIcons();
+    if (linkIcons.isEmpty())
+        return nil;
 
-    NSURL *url = (NSURL *)coreMainFrame->loader().icon().url();
-    return url;
+    // We arbitrarily choose the first icon in the list if there is more than one.
+    return (NSURL *)linkIcons[0].url;
 }
 #endif