[Curl][WinCairo] Add Public Suffix support to WinCairo
https://bugs.webkit.org/show_bug.cgi?id=183060

Reviewed by Alex Christensen.

.:

* Source/cmake/FindLibPSL.cmake: Added.
* Source/cmake/OptionsWin.cmake:
* Source/cmake/OptionsWinCairo.cmake:

Source/WebCore:

Add Public Suffix support to WinCairo using LibPSL.
LibPSL has been added to WinCairoRequirements in v2018.10.09.

* platform/Curl.cmake:
* platform/network/curl/CookieJarDB.cpp:
(WebCore::CookieJarDB::searchCookies): Search for cookies using the topPrivatelyControlledDomain
(WebCore::CookieJarDB::setCookie): Prevent cookies from being added under TLDs
* platform/network/curl/PublicSuffixCurl.cpp: Added.
(WebCore::isPublicSuffix):
(WebCore::topPrivatelyControlledDomainInternal):
(WebCore::topPrivatelyControlledDomain):

Tools:

Share mac's PublicSuffix tests with all ports.

* TestWebKitAPI/PlatformWin.cmake:
* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp:
* TestWebKitAPI/Tests/mac/PublicSuffix.mm: Removed.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@237118 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/ChangeLog b/ChangeLog
index 2d02dbe..386f62c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2018-10-15  Christopher Reid  <chris.reid@sony.com>
+
+        [Curl][WinCairo] Add Public Suffix support to WinCairo
+        https://bugs.webkit.org/show_bug.cgi?id=183060
+
+        Reviewed by Alex Christensen.
+
+        * Source/cmake/FindLibPSL.cmake: Added.
+        * Source/cmake/OptionsWin.cmake:
+        * Source/cmake/OptionsWinCairo.cmake:
+
 2018-10-15  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         Add new files missing from previous commit.
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index c5cd281..3ba98e6 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,22 @@
+2018-10-15  Christopher Reid  <chris.reid@sony.com>
+
+        [Curl][WinCairo] Add Public Suffix support to WinCairo
+        https://bugs.webkit.org/show_bug.cgi?id=183060
+
+        Reviewed by Alex Christensen.
+
+        Add Public Suffix support to WinCairo using LibPSL.
+        LibPSL has been added to WinCairoRequirements in v2018.10.09.
+
+        * platform/Curl.cmake:
+        * platform/network/curl/CookieJarDB.cpp:
+        (WebCore::CookieJarDB::searchCookies): Search for cookies using the topPrivatelyControlledDomain
+        (WebCore::CookieJarDB::setCookie): Prevent cookies from being added under TLDs
+        * platform/network/curl/PublicSuffixCurl.cpp: Added.
+        (WebCore::isPublicSuffix):
+        (WebCore::topPrivatelyControlledDomainInternal):
+        (WebCore::topPrivatelyControlledDomain):
+
 2018-10-15  Simon Fraser  <simon.fraser@apple.com>
 
         RenderLayer tree-related cleanup
diff --git a/Source/WebCore/platform/Curl.cmake b/Source/WebCore/platform/Curl.cmake
index 1603ef8..1cd8d9d 100644
--- a/Source/WebCore/platform/Curl.cmake
+++ b/Source/WebCore/platform/Curl.cmake
@@ -25,6 +25,7 @@
     platform/network/curl/DNSResolveQueueCurl.cpp
     platform/network/curl/NetworkStorageSessionCurl.cpp
     platform/network/curl/ProxyServerCurl.cpp
+    platform/network/curl/PublicSuffixCurl.cpp
     platform/network/curl/ResourceErrorCurl.cpp
     platform/network/curl/ResourceHandleCurl.cpp
     platform/network/curl/ResourceResponseCurl.cpp
@@ -34,10 +35,12 @@
 
 list(APPEND WebCore_SYSTEM_INCLUDE_DIRECTORIES
     ${CURL_INCLUDE_DIRS}
+    ${LIBPSL_INCLUDE_DIR}
     ${OPENSSL_INCLUDE_DIR}
 )
 
 list(APPEND WebCore_LIBRARIES
     ${CURL_LIBRARIES}
+    ${LIBPSL_LIBRARIES}
     ${OPENSSL_LIBRARIES}
 )
diff --git a/Source/WebCore/platform/network/curl/CookieJarDB.cpp b/Source/WebCore/platform/network/curl/CookieJarDB.cpp
index 650038d..42049ed 100644
--- a/Source/WebCore/platform/network/curl/CookieJarDB.cpp
+++ b/Source/WebCore/platform/network/curl/CookieJarDB.cpp
@@ -33,6 +33,10 @@
 
 #include <wtf/MonotonicTime.h>
 
+#if ENABLE(PUBLIC_SUFFIX_LIST)
+#include "PublicSuffix.h"
+#endif
+
 namespace WebCore {
 
 #define CORRUPT_MARKER_SUFFIX "-corrupted"
@@ -334,28 +338,35 @@
         "AND ((domain = ?) OR (domain GLOB ?)) "\
         "ORDER BY length(path) DESC, lastupdated";
 
-    std::unique_ptr<SQLiteStatement> pstmt = std::make_unique<SQLiteStatement>(m_database, sql);
+    auto pstmt = std::make_unique<SQLiteStatement>(m_database, sql);
+    if (!pstmt)
+        return false;
+
     pstmt->prepare();
     pstmt->bindInt(1, httpOnly ? *httpOnly : -1);
     pstmt->bindInt(2, secure ? *secure : -1);
     pstmt->bindInt(3, session ? *session : -1);
     pstmt->bindText(4, requestHost);
 
-    size_t topLevelSeparator = requestHost.reverseFind('.');
-    if (CookieUtil::isIPAddress(requestHost) || topLevelSeparator == notFound)
+    if (CookieUtil::isIPAddress(requestHost) || !requestHost.contains('.'))
         pstmt->bindNull(5);
     else {
-        /* FIXME: currently we currently do not have a public suffic list in wincairo
-           so right now we glob using just the second level domain e.g. *.DOMAIN.com
-           This will return too many cookies under multilevel tlds such as *.co.uk
-           but we filter those out later
-        */
-
+#if ENABLE(PUBLIC_SUFFIX_LIST)
+        String topPrivateDomain = topPrivatelyControlledDomain(requestHost);
+        if (!topPrivateDomain.isEmpty())
+            pstmt->bindText(5, String("*.") + topPrivateDomain);
+        else
+            pstmt->bindNull(5);
+#else
+        // Fallback to glob for cookies under the second level domain e.g. *.domain.com
+        // This will return too many cookies under multilevel tlds such as *.co.uk, but they will get filtered out later.
+        size_t topLevelSeparator = requestHost.reverseFind('.');
         size_t secondLevelSeparator = requestHost.reverseFind('.', topLevelSeparator-1);
         String localDomain = secondLevelSeparator == notFound ? requestHost : requestHost.substring(secondLevelSeparator+1);
 
         ASSERT(!localDomain.isEmpty());
         pstmt->bindText(5, String("*.") + localDomain);
+#endif
     }
 
     if (!pstmt)
@@ -468,7 +479,10 @@
     if (cookieObj.path.isEmpty())
         cookieObj.path = CookieUtil::defaultPathForURL(urlObj);
 
-    // FIXME: Need to check that a domain doesn't a set cookie for a tld when wincairo supports PSL
+#if ENABLE(PUBLIC_SUFFIX_LIST)
+    if (isPublicSuffix(cookieObj.domain))
+        return -1;
+#endif
 
     if (fromJavaScript && cookieObj.httpOnly)
         return -1;
diff --git a/Source/WebCore/platform/network/curl/PublicSuffixCurl.cpp b/Source/WebCore/platform/network/curl/PublicSuffixCurl.cpp
new file mode 100644
index 0000000..5e8d5c8
--- /dev/null
+++ b/Source/WebCore/platform/network/curl/PublicSuffixCurl.cpp
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 Sony Interactive Entertainment Inc.
+ *
+ * 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.
+ */
+
+#include "config.h"
+#include "PublicSuffix.h"
+
+#if ENABLE(PUBLIC_SUFFIX_LIST)
+
+#include "URL.h"
+#include <libpsl.h>
+
+namespace WebCore {
+
+bool isPublicSuffix(const String& domain)
+{
+    if (domain.isEmpty())
+        return false;
+
+    const psl_ctx_t* psl = psl_builtin();
+    ASSERT(psl);
+    bool ret = psl_is_public_suffix2(psl, domain.convertToLowercaseWithoutLocale().utf8().data(), PSL_TYPE_ANY | PSL_TYPE_NO_STAR_RULE);
+    return ret;
+}
+
+static String topPrivatelyControlledDomainInternal(const psl_ctx_t* psl, const char* domain)
+{
+    // psl_registerable_domain returns a pointer to domain's data or null if there is no private domain
+    if (const char* topPrivateDomain = psl_registrable_domain(psl, domain))
+        return topPrivateDomain;
+    return String();
+}
+
+String topPrivatelyControlledDomain(const String& domain)
+{
+    if (URL::hostIsIPAddress(domain) || !domain.isAllASCII())
+        return domain;
+
+    String lowercaseDomain = domain.convertToASCIILowercase();
+    if (lowercaseDomain == "localhost")
+        return lowercaseDomain;
+
+    if (isPublicSuffix(lowercaseDomain))
+        return String();
+
+    const psl_ctx_t* psl = psl_builtin();
+    ASSERT(psl);
+    return topPrivatelyControlledDomainInternal(psl, lowercaseDomain.utf8().data());
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(PUBLIC_SUFFIX_LIST)
diff --git a/Source/cmake/FindLibPSL.cmake b/Source/cmake/FindLibPSL.cmake
new file mode 100644
index 0000000..cf4b3fa
--- /dev/null
+++ b/Source/cmake/FindLibPSL.cmake
@@ -0,0 +1,67 @@
+# - Try to find LibPSL
+# This module defines the following variables:
+#
+#  LIBPSL_FOUND - LibPSL was found
+#  LIBPSL_INCLUDE_DIRS - the LibPSL include directories
+#  LIBPSL_LIBRARIES - link these to use LibPSL
+#
+# Copyright (C) 2018 Sony Interactive Entertainment Inc.
+#
+# 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 THE COPYRIGHT HOLDER 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 THE COPYRIGHT HOLDER 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.
+
+find_path(LIBPSL_INCLUDE_DIRS
+    NAMES libpsl.h
+    PATH_SUFFIXES libpsl
+)
+
+find_library(LIBPSL_LIBRARIES
+    NAMES psl
+)
+
+if (LIBPSL_INCLUDE_DIRS)
+    if (EXISTS "${LIBPSL_INCLUDE_DIRS}/libpsl.h")
+        file(READ "${LIBPSL_INCLUDE_DIRS}/libpsl.h" LIBPSL_VERSION_CONTENT)
+
+        string(REGEX MATCH "#define +PSL_VERSION_MAJOR +([0-9]+)" _dummy "${LIBPSL_VERSION_CONTENT}")
+        set(LIBPSL_VERSION_MAJOR "${CMAKE_MATCH_1}")
+
+        string(REGEX MATCH "#define +PSL_VERSION_MINOR +([0-9]+)" _dummy "${LIBPSL_VERSION_CONTENT}")
+        set(LIBPSL_VERSION_MINOR "${CMAKE_MATCH_1}")
+
+        string(REGEX MATCH "#define +PSL_VERSION_PATCH +([0-9]+)" _dummy "${LIBPSL_VERSION_CONTENT}")
+        set(LIBPSL_VERSION_PATCH "${CMAKE_MATCH_1}")
+
+        set(LIBPSL_VERSION "${LIBPSL_VERSION_MAJOR}.${LIBPSL_VERSION_MINOR}.${LIBPSL_VERSION_PATCH}")
+    endif ()
+endif ()
+
+if ("${LibPSL_FIND_VERSION}" VERSION_GREATER "${LIBPSL_VERSION}")
+    message(FATAL_ERROR "Required version (" ${LibPSL_FIND_VERSION} ") is higher than found version (" ${LIBPSL_VERSION} ")")
+endif ()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(LIBPSL REQUIRED_VARS LIBPSL_INCLUDE_DIRS LIBPSL_LIBRARIES)
+
+mark_as_advanced(
+    LIBPSL_INCLUDE_DIRS
+    LIBPSL_LIBRARIES
+)
diff --git a/Source/cmake/OptionsWin.cmake b/Source/cmake/OptionsWin.cmake
index 38292f3..f22f3f1 100644
--- a/Source/cmake/OptionsWin.cmake
+++ b/Source/cmake/OptionsWin.cmake
@@ -67,7 +67,6 @@
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEBVTT_REGIONS PUBLIC ON)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_XSLT PUBLIC ON)
 
-WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_PUBLIC_SUFFIX_LIST PRIVATE OFF)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_REMOTE_INSPECTOR PRIVATE OFF)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SMOOTH_SCROLLING PRIVATE OFF)
 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SUBTLE_CRYPTO PRIVATE OFF)
@@ -83,6 +82,7 @@
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_LEGACY_CUSTOM_PROTOCOL_MANAGER PUBLIC OFF)
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_LEGACY_ENCRYPTED_MEDIA PUBLIC OFF)
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_INTL PUBLIC ON)
+    WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_PUBLIC_SUFFIX_LIST PRIVATE ON)
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEBGL PUBLIC ON)
 
     # FIXME: Implement plugin process on Modern WebKit. https://bugs.webkit.org/show_bug.cgi?id=185313
@@ -90,6 +90,7 @@
 else ()
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_LEGACY_ENCRYPTED_MEDIA PUBLIC ON)
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_INTL PUBLIC OFF)
+    WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_PUBLIC_SUFFIX_LIST PRIVATE OFF)
     WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEBGL PUBLIC OFF)
 endif ()
 
diff --git a/Source/cmake/OptionsWinCairo.cmake b/Source/cmake/OptionsWinCairo.cmake
index fa618f7..4ad2c4b 100644
--- a/Source/cmake/OptionsWinCairo.cmake
+++ b/Source/cmake/OptionsWinCairo.cmake
@@ -10,6 +10,7 @@
 find_package(PNG 1.6.34 REQUIRED)
 find_package(Sqlite 3.23.1 REQUIRED)
 find_package(ZLIB 1.2.11 REQUIRED)
+find_package(LibPSL 0.20.2 REQUIRED)
 
 find_package(WebP 1.0.0)
 
diff --git a/Tools/ChangeLog b/Tools/ChangeLog
index b8ad5ec..6d62216 100644
--- a/Tools/ChangeLog
+++ b/Tools/ChangeLog
@@ -1,3 +1,17 @@
+2018-10-15  Christopher Reid  <chris.reid@sony.com>
+
+        [Curl][WinCairo] Add Public Suffix support to WinCairo
+        https://bugs.webkit.org/show_bug.cgi?id=183060
+
+        Reviewed by Alex Christensen.
+
+        Share mac's PublicSuffix tests with all ports.
+
+        * TestWebKitAPI/PlatformWin.cmake:
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp:
+        * TestWebKitAPI/Tests/mac/PublicSuffix.mm: Removed.
+
 2018-10-15  Myles C. Maxfield  <mmaxfield@apple.com>
 
         [WHLSL] Migrated WebGPUShadingLanguageRI to the W3C
diff --git a/Tools/TestWebKitAPI/PlatformWin.cmake b/Tools/TestWebKitAPI/PlatformWin.cmake
index 0e415a1..f13b82e 100644
--- a/Tools/TestWebKitAPI/PlatformWin.cmake
+++ b/Tools/TestWebKitAPI/PlatformWin.cmake
@@ -76,6 +76,7 @@
     list(APPEND TestWebCoreLib_SOURCES
         ${TESTWEBKITAPI_DIR}/Tests/WebCore/win/BitmapImage.cpp
         ${TESTWEBKITAPI_DIR}/Tests/WebCore/CryptoDigest.cpp
+        ${TESTWEBKITAPI_DIR}/Tests/WebCore/PublicSuffix.cpp
     )
 else ()
     list(APPEND test_webcore_LIBRARIES
diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
index a44232f..4982f4f 100644
--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
@@ -22,6 +22,7 @@
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
+		041A1E34216FFDBC00789E0A /* PublicSuffix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 041A1E33216FFDBC00789E0A /* PublicSuffix.cpp */; };
 		07492B3B1DF8B14C00633DE1 /* EnumerateMediaDevices.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07492B3A1DF8AE2D00633DE1 /* EnumerateMediaDevices.cpp */; };
 		07492B3C1DF8B86600633DE1 /* enumerateMediaDevices.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 07492B391DF8ADA400633DE1 /* enumerateMediaDevices.html */; };
 		074994421EA5034B000DA44E /* getUserMedia.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 4A410F4D19AF7BEF002EBAB5 /* getUserMedia.html */; };
@@ -465,7 +466,6 @@
 		7CCE7EC51A411A7E00447C4C /* MemoryCacheDisableWithinResourceLoadDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = E1220D9F155B25480013E2FC /* MemoryCacheDisableWithinResourceLoadDelegate.mm */; };
 		7CCE7EC61A411A7E00447C4C /* MemoryCachePruneWithinResourceLoadDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 517E7DFB15110EA600D0B008 /* MemoryCachePruneWithinResourceLoadDelegate.mm */; };
 		7CCE7EC71A411A7E00447C4C /* PageVisibilityStateWithWindowChanges.mm in Sources */ = {isa = PBXBuildFile; fileRef = A57A34EF16AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm */; };
-		7CCE7EC81A411A7E00447C4C /* PublicSuffix.mm in Sources */ = {isa = PBXBuildFile; fileRef = 00BC16851680FE810065F1E5 /* PublicSuffix.mm */; };
 		7CCE7EC91A411A7E00447C4C /* RenderedImageFromDOMNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37C784DE197C8F2E0010A496 /* RenderedImageFromDOMNode.mm */; };
 		7CCE7ECA1A411A7E00447C4C /* RenderedImageFromDOMRange.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3722C8681461E03E00C45D00 /* RenderedImageFromDOMRange.mm */; };
 		7CCE7ECB1A411A7E00447C4C /* SetAndUpdateCacheModel.mm in Sources */ = {isa = PBXBuildFile; fileRef = 261516D515B0E60500A2C201 /* SetAndUpdateCacheModel.mm */; };
@@ -1225,8 +1225,8 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		00BC16851680FE810065F1E5 /* PublicSuffix.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PublicSuffix.mm; sourceTree = "<group>"; };
 		00CD9F6215BE312C002DA2CE /* BackForwardList.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = BackForwardList.mm; sourceTree = "<group>"; };
+		041A1E33216FFDBC00789E0A /* PublicSuffix.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PublicSuffix.cpp; sourceTree = "<group>"; };
 		07492B391DF8ADA400633DE1 /* enumerateMediaDevices.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = enumerateMediaDevices.html; sourceTree = "<group>"; };
 		07492B3A1DF8AE2D00633DE1 /* EnumerateMediaDevices.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EnumerateMediaDevices.cpp; sourceTree = "<group>"; };
 		0766DD1F1A5AD5200023E3BB /* PendingAPIRequestURL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PendingAPIRequestURL.cpp; sourceTree = "<group>"; };
@@ -2556,6 +2556,7 @@
 				CE1866471F72E8F100A0CAB6 /* MarkedText.cpp */,
 				A5B149DD1F5A19DC00C6DAFF /* MIMETypeRegistry.cpp */,
 				CD225C071C45A69200140761 /* ParsedContentRange.cpp */,
+				041A1E33216FFDBC00789E0A /* PublicSuffix.cpp */,
 				F418BE141F71B7DC001970E6 /* RoundedRectTests.cpp */,
 				CDCFA7A91E45122F00C2433D /* SampleMap.cpp */,
 				CE06DF9A1E1851F200E570C9 /* SecurityOrigin.cpp */,
@@ -3276,7 +3277,6 @@
 				E19DB9781B32137C00DB38D4 /* NavigatorLanguage.mm */,
 				83F22C6320B355EB0034277E /* NoPolicyDelegateResponse.mm */,
 				A57A34EF16AF677200C2501F /* PageVisibilityStateWithWindowChanges.mm */,
-				00BC16851680FE810065F1E5 /* PublicSuffix.mm */,
 				37C784DE197C8F2E0010A496 /* RenderedImageFromDOMNode.mm */,
 				3722C8681461E03E00C45D00 /* RenderedImageFromDOMRange.mm */,
 				261516D515B0E60500A2C201 /* SetAndUpdateCacheModel.mm */,
@@ -3969,7 +3969,7 @@
 				41882F0321010C0D002FF288 /* ProcessPreWarming.mm in Sources */,
 				518C1153205B0504001FF4AE /* ProcessSwapOnNavigation.mm in Sources */,
 				7C83E0C11D0A652F00FEBCF3 /* ProvisionalURLNotChange.mm in Sources */,
-				7CCE7EC81A411A7E00447C4C /* PublicSuffix.mm in Sources */,
+				041A1E34216FFDBC00789E0A /* PublicSuffix.cpp in Sources */,
 				7C83E0C21D0A653500FEBCF3 /* QuickLook.mm in Sources */,
 				7CCE7F0D1A411AE600447C4C /* ReloadPageAfterCrash.cpp in Sources */,
 				7C83E0C31D0A653A00FEBCF3 /* RemoteObjectRegistry.mm in Sources */,
diff --git a/Tools/TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp b/Tools/TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp
index f87ba63..6069301 100644
--- a/Tools/TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebCore/PublicSuffix.cpp
@@ -43,6 +43,8 @@
     }
 };
 
+const char16_t bidirectionalDomain[28] = u"bidirectional\u0786\u07AE\u0782\u07B0\u0795\u07A9\u0793\u07A6\u0783\u07AA.com";
+
 TEST_F(PublicSuffix, IsPublicSuffix)
 {
     EXPECT_TRUE(isPublicSuffix("com"));
@@ -54,10 +56,107 @@
     EXPECT_FALSE(isPublicSuffix("bl.uk"));
     EXPECT_FALSE(isPublicSuffix("test.co.uk"));
     EXPECT_TRUE(isPublicSuffix("xn--zf0ao64a.tw"));
+    EXPECT_FALSE(isPublicSuffix("r4---asdf.test.com"));
+    EXPECT_FALSE(isPublicSuffix(utf16String(bidirectionalDomain)));
+    EXPECT_TRUE(isPublicSuffix(utf16String(u"\u6803\u6728.jp")));
+    EXPECT_FALSE(isPublicSuffix(""));
+    EXPECT_FALSE(isPublicSuffix("åäö"));
+
+    // UK
+    EXPECT_TRUE(isPublicSuffix("uk"));
+    EXPECT_FALSE(isPublicSuffix("webkit.uk"));
+    EXPECT_TRUE(isPublicSuffix("co.uk"));
+    EXPECT_FALSE(isPublicSuffix("company.co.uk"));
+
+    // Note: These tests are based on the Public Domain TLD test suite
+    // https://raw.githubusercontent.com/publicsuffix/list/master/tests/test_psl.txt
+    //
+    // That file states:
+    //     Any copyright is dedicated to the Public Domain.
+    //     https://creativecommons.org/publicdomain/zero/1.0/
+
+    // null input.
+    EXPECT_FALSE(isPublicSuffix(""));
+    // Mixed case.
+    EXPECT_TRUE(isPublicSuffix("COM"));
+    EXPECT_FALSE(isPublicSuffix("example.COM"));
+    EXPECT_FALSE(isPublicSuffix("WwW.example.COM"));
+    // Unlisted TLD.
+    EXPECT_FALSE(isPublicSuffix("example"));
+    EXPECT_FALSE(isPublicSuffix("example.example"));
+    EXPECT_FALSE(isPublicSuffix("b.example.example"));
+    EXPECT_FALSE(isPublicSuffix("a.b.example.example"));
+    // TLD with only 1 rule.
+    EXPECT_TRUE(isPublicSuffix("biz"));
+    EXPECT_FALSE(isPublicSuffix("domain.biz"));
+    EXPECT_FALSE(isPublicSuffix("b.domain.biz"));
+    EXPECT_FALSE(isPublicSuffix("a.b.domain.biz"));
+    // TLD with some 2-level rules.
+    EXPECT_FALSE(isPublicSuffix("example.com"));
+    EXPECT_FALSE(isPublicSuffix("b.example.com"));
+    EXPECT_FALSE(isPublicSuffix("a.b.example.com"));
+    EXPECT_TRUE(isPublicSuffix("uk.com"));
+    EXPECT_FALSE(isPublicSuffix("example.uk.com"));
+    EXPECT_FALSE(isPublicSuffix("b.example.uk.com"));
+    EXPECT_FALSE(isPublicSuffix("a.b.example.uk.com"));
+    EXPECT_FALSE(isPublicSuffix("test.ac"));
+    // TLD with only 1 (wildcard) rule.
+    EXPECT_TRUE(isPublicSuffix("mm"));
+    EXPECT_TRUE(isPublicSuffix("c.mm"));
+    EXPECT_FALSE(isPublicSuffix("b.c.mm"));
+    EXPECT_FALSE(isPublicSuffix("a.b.c.mm"));
+    // More complex TLD.
+    EXPECT_TRUE(isPublicSuffix("jp"));
+    EXPECT_FALSE(isPublicSuffix("test.jp"));
+    EXPECT_FALSE(isPublicSuffix("www.test.jp"));
+    EXPECT_TRUE(isPublicSuffix("ac.jp"));
+    EXPECT_FALSE(isPublicSuffix("test.ac.jp"));
+    EXPECT_FALSE(isPublicSuffix("www.test.ac.jp"));
+    EXPECT_TRUE(isPublicSuffix("kyoto.jp"));
+    EXPECT_FALSE(isPublicSuffix("test.kyoto.jp"));
+    EXPECT_TRUE(isPublicSuffix("ide.kyoto.jp"));
+    EXPECT_FALSE(isPublicSuffix("b.ide.kyoto.jp"));
+    EXPECT_FALSE(isPublicSuffix("a.b.ide.kyoto.jp"));
+    EXPECT_TRUE(isPublicSuffix("c.kobe.jp"));
+    EXPECT_FALSE(isPublicSuffix("b.c.kobe.jp"));
+    EXPECT_FALSE(isPublicSuffix("a.b.c.kobe.jp"));
+    EXPECT_FALSE(isPublicSuffix("city.kobe.jp"));
+    EXPECT_FALSE(isPublicSuffix("www.city.kobe.jp"));
+    // TLD with a wildcard rule and exceptions.
+    EXPECT_TRUE(isPublicSuffix("ck"));
+    EXPECT_TRUE(isPublicSuffix("test.ck"));
+    EXPECT_FALSE(isPublicSuffix("b.test.ck"));
+    EXPECT_FALSE(isPublicSuffix("a.b.test.ck"));
+    EXPECT_FALSE(isPublicSuffix("www.ck"));
+    EXPECT_FALSE(isPublicSuffix("www.www.ck"));
+    // US K12.
+    EXPECT_TRUE(isPublicSuffix("us"));
+    EXPECT_FALSE(isPublicSuffix("test.us"));
+    EXPECT_FALSE(isPublicSuffix("www.test.us"));
+    EXPECT_TRUE(isPublicSuffix("ak.us"));
+    EXPECT_FALSE(isPublicSuffix("test.ak.us"));
+    EXPECT_FALSE(isPublicSuffix("www.test.ak.us"));
+    EXPECT_TRUE(isPublicSuffix("k12.ak.us"));
+    EXPECT_FALSE(isPublicSuffix("test.k12.ak.us"));
+    EXPECT_FALSE(isPublicSuffix("www.test.k12.ak.us"));
+    // IDN labels (punycoded)
+    EXPECT_FALSE(isPublicSuffix("xn--85x722f.com.cn"));
+    EXPECT_FALSE(isPublicSuffix("xn--85x722f.xn--55qx5d.cn"));
+    EXPECT_FALSE(isPublicSuffix("www.xn--85x722f.xn--55qx5d.cn"));
+    EXPECT_FALSE(isPublicSuffix("shishi.xn--55qx5d.cn"));
+    EXPECT_TRUE(isPublicSuffix("xn--55qx5d.cn"));
+    EXPECT_FALSE(isPublicSuffix("xn--85x722f.xn--fiqs8s"));
+    EXPECT_FALSE(isPublicSuffix("www.xn--85x722f.xn--fiqs8s"));
+    EXPECT_FALSE(isPublicSuffix("shishi.xn--fiqs8s"));
+    EXPECT_TRUE(isPublicSuffix("xn--fiqs8s"));
 }
 
 TEST_F(PublicSuffix, TopPrivatelyControlledDomain)
 {
+    EXPECT_EQ(utf16String(u"\u6803\u6728.jp"), topPrivatelyControlledDomain(utf16String(u"\u6803\u6728.jp")));
+    EXPECT_EQ(String(utf16String(u"example.\u6803\u6728.jp")), topPrivatelyControlledDomain(utf16String(u"example.\u6803\u6728.jp")));
+    EXPECT_EQ(String(), topPrivatelyControlledDomain(String()));
+    EXPECT_EQ(String(), topPrivatelyControlledDomain(""));
     EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("test.com"));
     EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("com.test.com"));
     EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("subdomain.test.com"));
@@ -71,6 +170,16 @@
     EXPECT_EQ(String("127.0.0.1"), topPrivatelyControlledDomain("127.0.0.1"));
     EXPECT_EQ(String(), topPrivatelyControlledDomain("1"));
     EXPECT_EQ(String(), topPrivatelyControlledDomain("com"));
+    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("r4---asdf.test.com"));
+    EXPECT_EQ(String("r4---asdf.com"), topPrivatelyControlledDomain("r4---asdf.com"));
+    EXPECT_EQ(String(), topPrivatelyControlledDomain("r4---asdf"));
+    EXPECT_EQ(utf16String(bidirectionalDomain), utf16String(bidirectionalDomain));
+    EXPECT_EQ(String("example.com"), topPrivatelyControlledDomain("ExamPle.com"));
+    EXPECT_EQ(String("example.com"), topPrivatelyControlledDomain("SUB.dOmain.ExamPle.com"));
+    EXPECT_EQ(String("localhost"), topPrivatelyControlledDomain("localhost"));
+    EXPECT_EQ(String("localhost"), topPrivatelyControlledDomain("LocalHost"));
+    EXPECT_EQ(String("åäö"), topPrivatelyControlledDomain("åäö"));
+    EXPECT_EQ(String("ÅÄÖ"), topPrivatelyControlledDomain("ÅÄÖ"));
 }
 
 }
diff --git a/Tools/TestWebKitAPI/Tests/mac/PublicSuffix.mm b/Tools/TestWebKitAPI/Tests/mac/PublicSuffix.mm
deleted file mode 100644
index f500baaa..0000000
--- a/Tools/TestWebKitAPI/Tests/mac/PublicSuffix.mm
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#include "config.h"
-
-#if ENABLE(PUBLIC_SUFFIX_LIST)
-
-#include "WTFStringUtilities.h"
-#include <WebCore/PublicSuffix.h>
-#include <wtf/MainThread.h>
-
-using namespace WebCore;
-
-namespace TestWebKitAPI {
-
-class PublicSuffix: public testing::Test {
-public:
-    virtual void SetUp()
-    {
-        WTF::initializeMainThread();
-        [WebView initialize];
-    }
-};
-
-const char16_t bidirectionalDomain[28] = u"bidirectional\u0786\u07AE\u0782\u07B0\u0795\u07A9\u0793\u07A6\u0783\u07AA.com";
-
-TEST_F(PublicSuffix, IsPublicSuffix)
-{
-    EXPECT_TRUE(isPublicSuffix("com"));
-    EXPECT_FALSE(isPublicSuffix("test.com"));
-    EXPECT_FALSE(isPublicSuffix("com.com"));
-    EXPECT_TRUE(isPublicSuffix("net"));
-    EXPECT_TRUE(isPublicSuffix("org"));
-    EXPECT_TRUE(isPublicSuffix("co.uk"));
-    EXPECT_FALSE(isPublicSuffix("bl.uk"));
-    EXPECT_FALSE(isPublicSuffix("test.co.uk"));
-    EXPECT_TRUE(isPublicSuffix("xn--zf0ao64a.tw"));
-    EXPECT_FALSE(isPublicSuffix("r4---asdf.test.com"));
-    EXPECT_FALSE(isPublicSuffix(utf16String(bidirectionalDomain)));
-    EXPECT_TRUE(isPublicSuffix(utf16String(u"\u6803\u6728.jp")));
-    EXPECT_FALSE(isPublicSuffix(""));
-    EXPECT_FALSE(isPublicSuffix("åäö"));
-
-    // UK
-    EXPECT_TRUE(isPublicSuffix("uk"));
-    EXPECT_FALSE(isPublicSuffix("webkit.uk"));
-    EXPECT_TRUE(isPublicSuffix("co.uk"));
-    EXPECT_FALSE(isPublicSuffix("company.co.uk"));
-
-    // Note: These tests are based on the Public Domain TLD test suite
-    // https://raw.githubusercontent.com/publicsuffix/list/master/tests/test_psl.txt
-    //
-    // That file states:
-    //     Any copyright is dedicated to the Public Domain.
-    //     https://creativecommons.org/publicdomain/zero/1.0/
-
-    // null input.
-    EXPECT_FALSE(isPublicSuffix(""));
-    // Mixed case.
-    EXPECT_TRUE(isPublicSuffix("COM"));
-    EXPECT_FALSE(isPublicSuffix("example.COM"));
-    EXPECT_FALSE(isPublicSuffix("WwW.example.COM"));
-    // Unlisted TLD.
-    EXPECT_FALSE(isPublicSuffix("example"));
-    EXPECT_FALSE(isPublicSuffix("example.example"));
-    EXPECT_FALSE(isPublicSuffix("b.example.example"));
-    EXPECT_FALSE(isPublicSuffix("a.b.example.example"));
-    // TLD with only 1 rule.
-    EXPECT_TRUE(isPublicSuffix("biz"));
-    EXPECT_FALSE(isPublicSuffix("domain.biz"));
-    EXPECT_FALSE(isPublicSuffix("b.domain.biz"));
-    EXPECT_FALSE(isPublicSuffix("a.b.domain.biz"));
-    // TLD with some 2-level rules.
-    EXPECT_FALSE(isPublicSuffix("example.com"));
-    EXPECT_FALSE(isPublicSuffix("b.example.com"));
-    EXPECT_FALSE(isPublicSuffix("a.b.example.com"));
-    EXPECT_TRUE(isPublicSuffix("uk.com"));
-    EXPECT_FALSE(isPublicSuffix("example.uk.com"));
-    EXPECT_FALSE(isPublicSuffix("b.example.uk.com"));
-    EXPECT_FALSE(isPublicSuffix("a.b.example.uk.com"));
-    EXPECT_FALSE(isPublicSuffix("test.ac"));
-    // TLD with only 1 (wildcard) rule.
-    EXPECT_TRUE(isPublicSuffix("mm"));
-    EXPECT_TRUE(isPublicSuffix("c.mm"));
-    EXPECT_FALSE(isPublicSuffix("b.c.mm"));
-    EXPECT_FALSE(isPublicSuffix("a.b.c.mm"));
-    // More complex TLD.
-    EXPECT_TRUE(isPublicSuffix("jp"));
-    EXPECT_FALSE(isPublicSuffix("test.jp"));
-    EXPECT_FALSE(isPublicSuffix("www.test.jp"));
-    EXPECT_TRUE(isPublicSuffix("ac.jp"));
-    EXPECT_FALSE(isPublicSuffix("test.ac.jp"));
-    EXPECT_FALSE(isPublicSuffix("www.test.ac.jp"));
-    EXPECT_TRUE(isPublicSuffix("kyoto.jp"));
-    EXPECT_FALSE(isPublicSuffix("test.kyoto.jp"));
-    EXPECT_TRUE(isPublicSuffix("ide.kyoto.jp"));
-    EXPECT_FALSE(isPublicSuffix("b.ide.kyoto.jp"));
-    EXPECT_FALSE(isPublicSuffix("a.b.ide.kyoto.jp"));
-    EXPECT_TRUE(isPublicSuffix("c.kobe.jp"));
-    EXPECT_FALSE(isPublicSuffix("b.c.kobe.jp"));
-    EXPECT_FALSE(isPublicSuffix("a.b.c.kobe.jp"));
-    EXPECT_FALSE(isPublicSuffix("city.kobe.jp"));
-    EXPECT_FALSE(isPublicSuffix("www.city.kobe.jp"));
-    // TLD with a wildcard rule and exceptions.
-    EXPECT_TRUE(isPublicSuffix("ck"));
-    EXPECT_TRUE(isPublicSuffix("test.ck"));
-    EXPECT_FALSE(isPublicSuffix("b.test.ck"));
-    EXPECT_FALSE(isPublicSuffix("a.b.test.ck"));
-    EXPECT_FALSE(isPublicSuffix("www.ck"));
-    EXPECT_FALSE(isPublicSuffix("www.www.ck"));
-    // US K12.
-    EXPECT_TRUE(isPublicSuffix("us"));
-    EXPECT_FALSE(isPublicSuffix("test.us"));
-    EXPECT_FALSE(isPublicSuffix("www.test.us"));
-    EXPECT_TRUE(isPublicSuffix("ak.us"));
-    EXPECT_FALSE(isPublicSuffix("test.ak.us"));
-    EXPECT_FALSE(isPublicSuffix("www.test.ak.us"));
-    EXPECT_TRUE(isPublicSuffix("k12.ak.us"));
-    EXPECT_FALSE(isPublicSuffix("test.k12.ak.us"));
-    EXPECT_FALSE(isPublicSuffix("www.test.k12.ak.us"));
-    // IDN labels (punycoded)
-    EXPECT_FALSE(isPublicSuffix("xn--85x722f.com.cn"));
-    EXPECT_FALSE(isPublicSuffix("xn--85x722f.xn--55qx5d.cn"));
-    EXPECT_FALSE(isPublicSuffix("www.xn--85x722f.xn--55qx5d.cn"));
-    EXPECT_FALSE(isPublicSuffix("shishi.xn--55qx5d.cn"));
-    EXPECT_TRUE(isPublicSuffix("xn--55qx5d.cn"));
-    EXPECT_FALSE(isPublicSuffix("xn--85x722f.xn--fiqs8s"));
-    EXPECT_FALSE(isPublicSuffix("www.xn--85x722f.xn--fiqs8s"));
-    EXPECT_FALSE(isPublicSuffix("shishi.xn--fiqs8s"));
-    EXPECT_TRUE(isPublicSuffix("xn--fiqs8s"));
-}
-
-TEST_F(PublicSuffix, TopPrivatelyControlledDomain)
-{
-    EXPECT_EQ(utf16String(u"\u6803\u6728.jp"), topPrivatelyControlledDomain(utf16String(u"\u6803\u6728.jp")));
-    EXPECT_EQ(String(utf16String(u"example.\u6803\u6728.jp")), topPrivatelyControlledDomain(utf16String(u"example.\u6803\u6728.jp")));
-    EXPECT_EQ(String(), topPrivatelyControlledDomain(String()));
-    EXPECT_EQ(String(), topPrivatelyControlledDomain(""));
-    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("test.com"));
-    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("com.test.com"));
-    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("subdomain.test.com"));
-    EXPECT_EQ(String("com.com"), topPrivatelyControlledDomain("www.com.com"));
-    EXPECT_EQ(String("test.co.uk"), topPrivatelyControlledDomain("test.co.uk"));
-    EXPECT_EQ(String("test.co.uk"), topPrivatelyControlledDomain("subdomain.test.co.uk"));
-    EXPECT_EQ(String("bl.uk"), topPrivatelyControlledDomain("bl.uk"));
-    EXPECT_EQ(String("bl.uk"), topPrivatelyControlledDomain("subdomain.bl.uk"));
-    EXPECT_EQ(String("test.xn--zf0ao64a.tw"), topPrivatelyControlledDomain("test.xn--zf0ao64a.tw"));
-    EXPECT_EQ(String("test.xn--zf0ao64a.tw"), topPrivatelyControlledDomain("www.test.xn--zf0ao64a.tw"));
-    EXPECT_EQ(String("127.0.0.1"), topPrivatelyControlledDomain("127.0.0.1"));
-    EXPECT_EQ(String(), topPrivatelyControlledDomain("1"));
-    EXPECT_EQ(String(), topPrivatelyControlledDomain("com"));
-    EXPECT_EQ(String("test.com"), topPrivatelyControlledDomain("r4---asdf.test.com"));
-    EXPECT_EQ(String("r4---asdf.com"), topPrivatelyControlledDomain("r4---asdf.com"));
-    EXPECT_EQ(String(), topPrivatelyControlledDomain("r4---asdf"));
-    EXPECT_EQ(utf16String(bidirectionalDomain), utf16String(bidirectionalDomain));
-    EXPECT_EQ(String("example.com"), topPrivatelyControlledDomain("ExamPle.com"));
-    EXPECT_EQ(String("example.com"), topPrivatelyControlledDomain("SUB.dOmain.ExamPle.com"));
-    EXPECT_EQ(String("localhost"), topPrivatelyControlledDomain("localhost"));
-    EXPECT_EQ(String("localhost"), topPrivatelyControlledDomain("LocalHost"));
-    EXPECT_EQ(String("åäö"), topPrivatelyControlledDomain("åäö"));
-    EXPECT_EQ(String("ÅÄÖ"), topPrivatelyControlledDomain("ÅÄÖ"));
-}
-
-}
-
-#endif