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