Title: [222820] trunk
Revision
222820
Author
[email protected]
Date
2017-10-03 16:59:33 -0700 (Tue, 03 Oct 2017)

Log Message

SharedStringHashStore should support removing hashes
https://bugs.webkit.org/show_bug.cgi?id=177770

Reviewed by Alex Christensen.

Source/WebKit:

SharedStringHashStore should support removing hashes. It currently only supports adding hashes or
clearing all of them, which is sufficient for the VisitedLinkStore but will not be for Service
Worker purposes.

* Shared/SharedStringHashStore.cpp:
(WebKit::SharedStringHashStore::SharedStringHashStore):
(WebKit::SharedStringHashStore::add):
(WebKit::SharedStringHashStore::remove):
(WebKit::SharedStringHashStore::contains):
(WebKit::SharedStringHashStore::clear):
(WebKit::SharedStringHashStore::resizeTable):
(WebKit::SharedStringHashStore::pendingOperationsTimerFired):
* Shared/SharedStringHashStore.h:
* Shared/SharedStringHashTable.cpp:
(WebKit::SharedStringHashTable::remove):
* Shared/SharedStringHashTable.h:
* UIProcess/API/Cocoa/_WKVisitedLinkStore.h:
* UIProcess/API/Cocoa/_WKVisitedLinkStore.mm:
(-[_WKVisitedLinkStore containsVisitedLinkWithURL:]):
(-[_WKVisitedLinkStore removeVisitedLinkWithURL:]):
* UIProcess/VisitedLinkStore.cpp:
(WebKit::VisitedLinkStore::containsVisitedLinkHash):
(WebKit::VisitedLinkStore::removeVisitedLinkHash):
(WebKit::VisitedLinkStore::didUpdateSharedStringHashes):
* UIProcess/VisitedLinkStore.h:

Tools:

Add API test coverage.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/VisitedLinkStore.mm: Added.
(TestWebKitAPI::TEST):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (222819 => 222820)


--- trunk/Source/WebKit/ChangeLog	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/ChangeLog	2017-10-03 23:59:33 UTC (rev 222820)
@@ -1,3 +1,36 @@
+2017-10-03  Chris Dumez  <[email protected]>
+
+        SharedStringHashStore should support removing hashes
+        https://bugs.webkit.org/show_bug.cgi?id=177770
+
+        Reviewed by Alex Christensen.
+
+        SharedStringHashStore should support removing hashes. It currently only supports adding hashes or
+        clearing all of them, which is sufficient for the VisitedLinkStore but will not be for Service
+        Worker purposes.
+
+        * Shared/SharedStringHashStore.cpp:
+        (WebKit::SharedStringHashStore::SharedStringHashStore):
+        (WebKit::SharedStringHashStore::add):
+        (WebKit::SharedStringHashStore::remove):
+        (WebKit::SharedStringHashStore::contains):
+        (WebKit::SharedStringHashStore::clear):
+        (WebKit::SharedStringHashStore::resizeTable):
+        (WebKit::SharedStringHashStore::pendingOperationsTimerFired):
+        * Shared/SharedStringHashStore.h:
+        * Shared/SharedStringHashTable.cpp:
+        (WebKit::SharedStringHashTable::remove):
+        * Shared/SharedStringHashTable.h:
+        * UIProcess/API/Cocoa/_WKVisitedLinkStore.h:
+        * UIProcess/API/Cocoa/_WKVisitedLinkStore.mm:
+        (-[_WKVisitedLinkStore containsVisitedLinkWithURL:]):
+        (-[_WKVisitedLinkStore removeVisitedLinkWithURL:]):
+        * UIProcess/VisitedLinkStore.cpp:
+        (WebKit::VisitedLinkStore::containsVisitedLinkHash):
+        (WebKit::VisitedLinkStore::removeVisitedLinkHash):
+        (WebKit::VisitedLinkStore::didUpdateSharedStringHashes):
+        * UIProcess/VisitedLinkStore.h:
+
 2017-10-03  Alex Christensen  <[email protected]>
 
         Fix API tests after r222794.

Modified: trunk/Source/WebKit/Shared/SharedStringHashStore.cpp (222819 => 222820)


--- trunk/Source/WebKit/Shared/SharedStringHashStore.cpp	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/Shared/SharedStringHashStore.cpp	2017-10-03 23:59:33 UTC (rev 222820)
@@ -26,6 +26,8 @@
 #include "config.h"
 #include "SharedStringHashStore.h"
 
+#include <algorithm>
+
 namespace WebKit {
 
 using namespace WebCore;
@@ -63,7 +65,7 @@
 
 SharedStringHashStore::SharedStringHashStore(Client& client)
     : m_client(client)
-    , m_pendingSharedStringHashesTimer(RunLoop::main(), this, &SharedStringHashStore::pendingSharedStringHashesTimerFired)
+    , m_pendingOperationsTimer(RunLoop::main(), this, &SharedStringHashStore::pendingOperationsTimerFired)
 {
 }
 
@@ -74,16 +76,33 @@
 
 void SharedStringHashStore::add(SharedStringHash sharedStringHash)
 {
-    m_pendingSharedStringHashes.add(sharedStringHash);
+    m_pendingOperations.append({ Operation::Add, sharedStringHash });
 
-    if (!m_pendingSharedStringHashesTimer.isActive())
-        m_pendingSharedStringHashesTimer.startOneShot(0_s);
+    if (!m_pendingOperationsTimer.isActive())
+        m_pendingOperationsTimer.startOneShot(0_s);
 }
 
+void SharedStringHashStore::remove(WebCore::SharedStringHash sharedStringHash)
+{
+    m_pendingOperations.append({ Operation::Remove, sharedStringHash });
+
+    if (!m_pendingOperationsTimer.isActive())
+        m_pendingOperationsTimer.startOneShot(0_s);
+}
+
+bool SharedStringHashStore::contains(WebCore::SharedStringHash sharedStringHash)
+{
+    if (m_pendingOperationsTimer.isActive()) {
+        m_pendingOperationsTimer.stop();
+        pendingOperationsTimerFired();
+    }
+    return m_table.contains(sharedStringHash);
+}
+
 void SharedStringHashStore::clear()
 {
-    m_pendingSharedStringHashesTimer.stop();
-    m_pendingSharedStringHashes.clear();
+    m_pendingOperationsTimer.stop();
+    m_pendingOperations.clear();
     m_keyCount = 0;
     m_tableSize = 0;
     m_table.clear();
@@ -122,19 +141,31 @@
         }
     }
 
-    for (auto& sharedStringHash : m_pendingSharedStringHashes) {
-        if (m_table.add(sharedStringHash))
-            ++m_keyCount;
+    for (auto& operation : m_pendingOperations) {
+        switch (operation.type) {
+        case Operation::Add:
+            if (m_table.add(operation.sharedStringHash))
+                ++m_keyCount;
+            break;
+        case Operation::Remove:
+            if (m_table.remove(operation.sharedStringHash))
+                --m_keyCount;
+            break;
+        }
     }
-    m_pendingSharedStringHashes.clear();
+    m_pendingOperations.clear();
 
     m_client.didInvalidateSharedMemory();
 }
 
-void SharedStringHashStore::pendingSharedStringHashesTimerFired()
+void SharedStringHashStore::pendingOperationsTimerFired()
 {
     unsigned currentTableSize = m_tableSize;
-    unsigned newTableSize = tableSizeForKeyCount(m_keyCount + m_pendingSharedStringHashes.size());
+    unsigned approximateNewHashCount = std::count_if(m_pendingOperations.begin(), m_pendingOperations.end(), [](auto& operation) {
+        return operation.type == Operation::Add;
+    });
+    // FIXME: The table can currently only grow. We should probably support shrinking it to save memory.
+    unsigned newTableSize = tableSizeForKeyCount(m_keyCount + approximateNewHashCount);
 
     newTableSize = std::max(currentTableSize, newTableSize);
 
@@ -144,18 +175,30 @@
     }
 
     Vector<SharedStringHash> addedSharedStringHashes;
-    addedSharedStringHashes.reserveInitialCapacity(m_pendingSharedStringHashes.size());
-    for (auto& sharedStringHash : m_pendingSharedStringHashes) {
-        if (m_table.add(sharedStringHash)) {
-            addedSharedStringHashes.uncheckedAppend(sharedStringHash);
-            ++m_keyCount;
+    Vector<SharedStringHash> removedSharedStringHashes;
+    addedSharedStringHashes.reserveInitialCapacity(approximateNewHashCount);
+    removedSharedStringHashes.reserveInitialCapacity(m_pendingOperations.size() - approximateNewHashCount);
+    for (auto& operation : m_pendingOperations) {
+        switch (operation.type) {
+        case Operation::Add:
+            if (m_table.add(operation.sharedStringHash)) {
+                addedSharedStringHashes.uncheckedAppend(operation.sharedStringHash);
+                ++m_keyCount;
+            }
+            break;
+        case Operation::Remove:
+            if (m_table.remove(operation.sharedStringHash)) {
+                removedSharedStringHashes.uncheckedAppend(operation.sharedStringHash);
+                --m_keyCount;
+            }
+            break;
         }
     }
 
-    m_pendingSharedStringHashes.clear();
+    m_pendingOperations.clear();
 
-    if (!addedSharedStringHashes.isEmpty())
-        m_client.didAddSharedStringHashes(addedSharedStringHashes);
+    if (!addedSharedStringHashes.isEmpty() || !removedSharedStringHashes.isEmpty())
+        m_client.didUpdateSharedStringHashes(addedSharedStringHashes, removedSharedStringHashes);
 }
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/Shared/SharedStringHashStore.h (222819 => 222820)


--- trunk/Source/WebKit/Shared/SharedStringHashStore.h	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/Shared/SharedStringHashStore.h	2017-10-03 23:59:33 UTC (rev 222820)
@@ -40,7 +40,7 @@
         virtual ~Client() { }
 
         virtual void didInvalidateSharedMemory() = 0;
-        virtual void didAddSharedStringHashes(const Vector<WebCore::SharedStringHash>&) = 0;
+        virtual void didUpdateSharedStringHashes(const Vector<WebCore::SharedStringHash>& addedHashes, const Vector<WebCore::SharedStringHash>& removedHashes) = 0;
     };
 
     SharedStringHashStore(Client&);
@@ -47,6 +47,8 @@
 
     bool createSharedMemoryHandle(SharedMemory::Handle&);
     void add(WebCore::SharedStringHash);
+    void remove(WebCore::SharedStringHash);
+    bool contains(WebCore::SharedStringHash);
     void clear();
 
     bool isEmpty() const { return !m_keyCount; }
@@ -53,14 +55,20 @@
 
 private:
     void resizeTable(unsigned newTableSize);
-    void pendingSharedStringHashesTimerFired();
+    void pendingOperationsTimerFired();
 
+    struct Operation {
+        enum Type { Add, Remove };
+        Type type;
+        WebCore::SharedStringHash sharedStringHash;
+    };
+
     Client& m_client;
     unsigned m_keyCount { 0 };
     unsigned m_tableSize { 0 };
     SharedStringHashTable m_table;
-    HashSet<WebCore::SharedStringHash, WebCore::SharedStringHashHash> m_pendingSharedStringHashes;
-    RunLoop::Timer<SharedStringHashStore> m_pendingSharedStringHashesTimer;
+    Vector<Operation> m_pendingOperations;
+    RunLoop::Timer<SharedStringHashStore> m_pendingOperationsTimer;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/Shared/SharedStringHashTable.cpp (222819 => 222820)


--- trunk/Source/WebKit/Shared/SharedStringHashTable.cpp	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/Shared/SharedStringHashTable.cpp	2017-10-03 23:59:33 UTC (rev 222820)
@@ -75,39 +75,37 @@
     
 bool SharedStringHashTable::add(SharedStringHash sharedStringHash)
 {
-    ASSERT(m_sharedMemory);
+    auto* slot = findSlot(sharedStringHash);
+    ASSERT(slot);
 
-    int k = 0;
-    SharedStringHash* table = m_table;
-    int sizeMask = m_tableSizeMask;
-    unsigned h = static_cast<unsigned>(sharedStringHash);
-    int i = h & sizeMask;
+    // Check if the same link hash is in the table already.
+    if (*slot)
+        return false;
 
-    SharedStringHash* entry;
-    while (1) {
-        entry = table + i;
+    *slot = sharedStringHash;
+    return true;
+}
 
-        // Check if this bucket is empty.
-        if (!*entry)
-            break;
+bool SharedStringHashTable::remove(SharedStringHash sharedStringHash)
+{
+    auto* slot = findSlot(sharedStringHash);
+    if (!slot || !*slot)
+        return false;
 
-        // Check if the same link hash is in the table already.
-        if (*entry == sharedStringHash)
-            return false;
-
-        if (!k)
-            k = 1 | doubleHash(h);
-        i = (i + k) & sizeMask;
-    }
-
-    *entry = sharedStringHash;
+    *slot = 0;
     return true;
 }
 
 bool SharedStringHashTable::contains(SharedStringHash sharedStringHash) const
 {
+    auto* slot = findSlot(sharedStringHash);
+    return slot && *slot;
+}
+
+SharedStringHash* SharedStringHashTable::findSlot(SharedStringHash sharedStringHash) const
+{
     if (!m_sharedMemory)
-        return false;
+        return nullptr;
 
     int k = 0;
     SharedStringHash* table = m_table;
@@ -114,7 +112,7 @@
     int sizeMask = m_tableSizeMask;
     unsigned h = static_cast<unsigned>(sharedStringHash);
     int i = h & sizeMask;
-    
+
     SharedStringHash* entry;
     while (1) {
         entry = table + i;
@@ -121,17 +119,15 @@
 
         // Check if we've reached the end of the table.
         if (!*entry)
-            break;
-        
+            return entry;
+
         if (*entry == sharedStringHash)
-            return true;
-        
+            return entry;
+
         if (!k)
             k = 1 | doubleHash(h);
         i = (i + k) & sizeMask;
     }
-
-    return false;
 }
 
 void SharedStringHashTable::clear()

Modified: trunk/Source/WebKit/Shared/SharedStringHashTable.h (222819 => 222820)


--- trunk/Source/WebKit/Shared/SharedStringHashTable.h	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/Shared/SharedStringHashTable.h	2017-10-03 23:59:33 UTC (rev 222820)
@@ -41,6 +41,7 @@
 
     // Can only be called if the underlying shared memory is in read / write mode.
     bool add(WebCore::SharedStringHash);
+    bool remove(WebCore::SharedStringHash);
 
     bool contains(WebCore::SharedStringHash) const;
 
@@ -49,6 +50,7 @@
 
 private:
     RefPtr<SharedMemory> m_sharedMemory;
+    WebCore::SharedStringHash* findSlot(WebCore::SharedStringHash) const;
 
     unsigned m_tableSize { 0 };
     unsigned m_tableSizeMask { 0 };

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKVisitedLinkStore.h (222819 => 222820)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKVisitedLinkStore.h	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKVisitedLinkStore.h	2017-10-03 23:59:33 UTC (rev 222820)
@@ -33,6 +33,8 @@
 
 - (void)addVisitedLinkWithURL:(NSURL *)URL;
 - (void)removeAll;
+- (BOOL)containsVisitedLinkWithURL:(NSURL *)URL WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
+- (void)removeVisitedLinkWithURL:(NSURL *)URL WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @end
 

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKVisitedLinkStore.mm (222819 => 222820)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKVisitedLinkStore.mm	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKVisitedLinkStore.mm	2017-10-03 23:59:33 UTC (rev 222820)
@@ -62,6 +62,20 @@
     _visitedLinkStore->removeAll();
 }
 
+- (BOOL)containsVisitedLinkWithURL:(NSURL *)URL
+{
+    auto linkHash = WebCore::computeSharedStringHash(URL.absoluteString);
+
+    return _visitedLinkStore->containsVisitedLinkHash(linkHash);
+}
+
+- (void)removeVisitedLinkWithURL:(NSURL *)URL
+{
+    auto linkHash = WebCore::computeSharedStringHash(URL.absoluteString);
+
+    _visitedLinkStore->removeVisitedLinkHash(linkHash);
+}
+
 #pragma mark WKObject protocol implementation
 
 - (API::Object&)_apiObject

Modified: trunk/Source/WebKit/UIProcess/VisitedLinkStore.cpp (222819 => 222820)


--- trunk/Source/WebKit/UIProcess/VisitedLinkStore.cpp	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/UIProcess/VisitedLinkStore.cpp	2017-10-03 23:59:33 UTC (rev 222820)
@@ -82,6 +82,16 @@
     m_linkHashStore.add(linkHash);
 }
 
+bool VisitedLinkStore::containsVisitedLinkHash(WebCore::SharedStringHash linkHash)
+{
+    return m_linkHashStore.contains(linkHash);
+}
+
+void VisitedLinkStore::removeVisitedLinkHash(WebCore::SharedStringHash linkHash)
+{
+    m_linkHashStore.remove(linkHash);
+}
+
 void VisitedLinkStore::removeAll()
 {
     m_linkHashStore.clear();
@@ -129,17 +139,17 @@
         sendStoreHandleToProcess(*process);
 }
 
-void VisitedLinkStore::didAddSharedStringHashes(const Vector<WebCore::SharedStringHash>& linkHashes)
+void VisitedLinkStore::didUpdateSharedStringHashes(const Vector<WebCore::SharedStringHash>& addedHashes, const Vector<WebCore::SharedStringHash>& removedHashes)
 {
-    ASSERT(!linkHashes.isEmpty());
+    ASSERT(!addedHashes.isEmpty() || !removedHashes.isEmpty());
 
-    for (WebProcessProxy* process : m_processes) {
+    for (auto* process : m_processes) {
         ASSERT(process->processPool().processes().contains(process));
 
-        if (linkHashes.size() > 20)
+        if (addedHashes.size() > 20 || !removedHashes.isEmpty())
             process->send(Messages::VisitedLinkTableController::AllVisitedLinkStateChanged(), identifier());
         else
-            process->send(Messages::VisitedLinkTableController::VisitedLinkStateChanged(linkHashes), identifier());
+            process->send(Messages::VisitedLinkTableController::VisitedLinkStateChanged(addedHashes), identifier());
     }
 }
 

Modified: trunk/Source/WebKit/UIProcess/VisitedLinkStore.h (222819 => 222820)


--- trunk/Source/WebKit/UIProcess/VisitedLinkStore.h	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Source/WebKit/UIProcess/VisitedLinkStore.h	2017-10-03 23:59:33 UTC (rev 222820)
@@ -51,6 +51,8 @@
     void removeProcess(WebProcessProxy&);
 
     void addVisitedLinkHash(WebCore::SharedStringHash);
+    bool containsVisitedLinkHash(WebCore::SharedStringHash);
+    void removeVisitedLinkHash(WebCore::SharedStringHash);
     void removeAll();
 
 private:
@@ -63,7 +65,7 @@
 
     // SharedStringHashStore::Client
     void didInvalidateSharedMemory() final;
-    void didAddSharedStringHashes(const Vector<WebCore::SharedStringHash>&) final;
+    void didUpdateSharedStringHashes(const Vector<WebCore::SharedStringHash>& addedHashes, const Vector<WebCore::SharedStringHash>& removedHashes) final;
 
     void addVisitedLinkHashFromPage(uint64_t pageID, WebCore::SharedStringHash);
 

Modified: trunk/Tools/ChangeLog (222819 => 222820)


--- trunk/Tools/ChangeLog	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Tools/ChangeLog	2017-10-03 23:59:33 UTC (rev 222820)
@@ -1,3 +1,16 @@
+2017-10-03  Chris Dumez  <[email protected]>
+
+        SharedStringHashStore should support removing hashes
+        https://bugs.webkit.org/show_bug.cgi?id=177770
+
+        Reviewed by Alex Christensen.
+
+        Add API test coverage.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKitCocoa/VisitedLinkStore.mm: Added.
+        (TestWebKitAPI::TEST):
+
 2017-10-03  Dewei Zhu  <[email protected]>
 
         Fix missing import for BenchmarkRunner.

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (222819 => 222820)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-10-03 23:35:41 UTC (rev 222819)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-10-03 23:59:33 UTC (rev 222820)
@@ -512,6 +512,7 @@
 		8349D3C41DB9728E004A9F65 /* link-with-download-attribute.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 8349D3C31DB9724F004A9F65 /* link-with-download-attribute.html */; };
 		835CF9671D25FCD6001A65D4 /* RestoreSessionStateWithoutNavigation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 835CF9661D25FCD6001A65D4 /* RestoreSessionStateWithoutNavigation.cpp */; };
 		8361F1781E610B4E00759B25 /* link-with-download-attribute-with-slashes.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 8361F1771E610B2100759B25 /* link-with-download-attribute-with-slashes.html */; };
+		83779C381F82FECE007CDA8A /* VisitedLinkStore.mm in Sources */ = {isa = PBXBuildFile; fileRef = 83779C371F82FEB0007CDA8A /* VisitedLinkStore.mm */; };
 		837A35F11D9A1E7D00663C57 /* DownloadRequestBlobURL.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 837A35F01D9A1E6400663C57 /* DownloadRequestBlobURL.html */; };
 		83B6DE6F1EE75221001E792F /* RestoreSessionState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83B6DE6E1EE7520F001E792F /* RestoreSessionState.cpp */; };
 		83BAEE8D1EF4625500DDE894 /* PluginLoadClientPolicies.mm in Sources */ = {isa = PBXBuildFile; fileRef = 83BAEE8C1EF4625500DDE894 /* PluginLoadClientPolicies.mm */; };
@@ -1446,6 +1447,7 @@
 		8349D3C31DB9724F004A9F65 /* link-with-download-attribute.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "link-with-download-attribute.html"; sourceTree = "<group>"; };
 		835CF9661D25FCD6001A65D4 /* RestoreSessionStateWithoutNavigation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RestoreSessionStateWithoutNavigation.cpp; sourceTree = "<group>"; };
 		8361F1771E610B2100759B25 /* link-with-download-attribute-with-slashes.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "link-with-download-attribute-with-slashes.html"; sourceTree = "<group>"; };
+		83779C371F82FEB0007CDA8A /* VisitedLinkStore.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = VisitedLinkStore.mm; sourceTree = "<group>"; };
 		837A35F01D9A1E6400663C57 /* DownloadRequestBlobURL.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DownloadRequestBlobURL.html; sourceTree = "<group>"; };
 		83B6DE6E1EE7520F001E792F /* RestoreSessionState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RestoreSessionState.cpp; sourceTree = "<group>"; };
 		83B88A331C80056D00BB2418 /* HTMLParserIdioms.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLParserIdioms.cpp; sourceTree = "<group>"; };
@@ -2040,6 +2042,7 @@
 				07EDEFAC1EB9400C00D43292 /* UserMediaDisabled.mm */,
 				93E943F11CD3E87E00AC08C2 /* VideoControlsManager.mm */,
 				6356FB211EC4E0BA0044BF18 /* VisibleContentRect.mm */,
+				83779C371F82FEB0007CDA8A /* VisitedLinkStore.mm */,
 				5C973F5B1F58EF0A00359C27 /* WebGLPolicy.mm */,
 				51714EB61CF8C7A4004723C4 /* WebProcessKillIDBCleanup.mm */,
 				5120C83C1E6750790025B250 /* WebsiteDataStoreCustomPaths.mm */,
@@ -3457,6 +3460,7 @@
 				7C83E0C61D0A654E00FEBCF3 /* VideoControlsManager.mm in Sources */,
 				115EB3431EE0BA03003C2C0A /* ViewportSizeForViewportUnits.mm in Sources */,
 				6356FB221EC4E0BA0044BF18 /* VisibleContentRect.mm in Sources */,
+				83779C381F82FECE007CDA8A /* VisitedLinkStore.mm in Sources */,
 				0F139E771A423A5B00F590F5 /* WeakObjCPtr.mm in Sources */,
 				7CCE7F191A411AE600447C4C /* WebArchive.cpp in Sources */,
 				7C83E04C1D0A641800FEBCF3 /* WebCoreNSURLSession.mm in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/VisitedLinkStore.mm (0 => 222820)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/VisitedLinkStore.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/VisitedLinkStore.mm	2017-10-03 23:59:33 UTC (rev 222820)
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2017 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. 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 INC. 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 "config.h"
+
+#if WK_API_ENABLED
+
+#import <WebKit/_WKVisitedLinkStore.h>
+#import <wtf/RetainPtr.h>
+
+namespace TestWebKitAPI {
+
+TEST(WebKit, VisitedLinkStore_Add)
+{
+    auto visitedLinkStore = adoptNS([[_WKVisitedLinkStore alloc] init]);
+    NSURL *appleURL = [NSURL URLWithString:@"https://www.apple.com"];
+    NSURL *webkitURL = [NSURL URLWithString:@"https://www.webkit.org"];
+    NSURL *bugzillaURL = [NSURL URLWithString:@"https://bugs.webkit.org"];
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    [visitedLinkStore addVisitedLinkWithURL:webkitURL];
+    [visitedLinkStore addVisitedLinkWithURL:bugzillaURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+}
+
+TEST(WebKit, VisitedLinkStore_RemoveAll)
+{
+    auto visitedLinkStore = adoptNS([[_WKVisitedLinkStore alloc] init]);
+    NSURL *appleURL = [NSURL URLWithString:@"https://www.apple.com"];
+    NSURL *webkitURL = [NSURL URLWithString:@"https://www.webkit.org"];
+    NSURL *bugzillaURL = [NSURL URLWithString:@"https://bugs.webkit.org"];
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    [visitedLinkStore addVisitedLinkWithURL:webkitURL];
+    [visitedLinkStore addVisitedLinkWithURL:bugzillaURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+    [visitedLinkStore removeAll];
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+}
+
+TEST(WebKit, VisitedLinkStore_Remove)
+{
+    auto visitedLinkStore = adoptNS([[_WKVisitedLinkStore alloc] init]);
+    NSURL *appleURL = [NSURL URLWithString:@"https://www.apple.com"];
+    NSURL *webkitURL = [NSURL URLWithString:@"https://www.webkit.org"];
+    NSURL *bugzillaURL = [NSURL URLWithString:@"https://bugs.webkit.org"];
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    [visitedLinkStore addVisitedLinkWithURL:webkitURL];
+    [visitedLinkStore addVisitedLinkWithURL:bugzillaURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+    [visitedLinkStore removeVisitedLinkWithURL:appleURL];
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+    [visitedLinkStore removeVisitedLinkWithURL:webkitURL];
+    [visitedLinkStore removeVisitedLinkWithURL:bugzillaURL];
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    [visitedLinkStore removeVisitedLinkWithURL:appleURL];
+    [visitedLinkStore removeVisitedLinkWithURL:appleURL];
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+}
+
+TEST(WebKit, VisitedLinkStore_AddAndRemove)
+{
+    auto visitedLinkStore = adoptNS([[_WKVisitedLinkStore alloc] init]);
+    NSURL *appleURL = [NSURL URLWithString:@"https://www.apple.com"];
+    NSURL *webkitURL = [NSURL URLWithString:@"https://www.webkit.org"];
+    NSURL *bugzillaURL = [NSURL URLWithString:@"https://bugs.webkit.org"];
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    [visitedLinkStore removeVisitedLinkWithURL:appleURL];
+    [visitedLinkStore addVisitedLinkWithURL:webkitURL];
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_FALSE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+    [visitedLinkStore removeVisitedLinkWithURL:appleURL];
+    [visitedLinkStore addVisitedLinkWithURL:appleURL];
+    [visitedLinkStore addVisitedLinkWithURL:bugzillaURL];
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:appleURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:webkitURL]);
+    EXPECT_TRUE([visitedLinkStore containsVisitedLinkWithURL:bugzillaURL]);
+}
+
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to