Make CachedResourceLoader originsMatch check more efficient
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Oct 2016 08:08:11 +0000 (08:08 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Oct 2016 08:08:11 +0000 (08:08 +0000)
https://bugs.webkit.org/show_bug.cgi?id=163938

Patch by Youenn Fablet <youenn@apple.com> on 2016-10-26
Reviewed by Darin Adler.

No change of behavior.

* loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::shouldUpdateCachedResourceWithCurrentRequest):
(WebCore::originsMatch): Moved to SecurityOrigin.cpp.
* page/SecurityOrigin.cpp:
(WebCore::areOriginsMatching): Helper routine to check whether origins are matching.
(WebCore::originsMatch): Ensuring string comparison provides the same result as this function.
* page/SecurityOrigin.h:
(WebCore::SecurityOrigin::protocol):
(WebCore::SecurityOrigin::host):
(WebCore::SecurityOrigin::domain):

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

Source/WebCore/ChangeLog
Source/WebCore/loader/cache/CachedResourceLoader.cpp
Source/WebCore/page/SecurityOrigin.cpp
Source/WebCore/page/SecurityOrigin.h

index 4a90d0a..a6fd3c3 100644 (file)
@@ -1,3 +1,23 @@
+2016-10-26  Youenn Fablet  <youenn@apple.com>
+
+        Make CachedResourceLoader originsMatch check more efficient
+        https://bugs.webkit.org/show_bug.cgi?id=163938
+
+        Reviewed by Darin Adler.
+
+        No change of behavior.
+
+        * loader/cache/CachedResourceLoader.cpp:
+        (WebCore::CachedResourceLoader::shouldUpdateCachedResourceWithCurrentRequest):
+        (WebCore::originsMatch): Moved to SecurityOrigin.cpp.
+        * page/SecurityOrigin.cpp:
+        (WebCore::areOriginsMatching): Helper routine to check whether origins are matching.
+        (WebCore::originsMatch): Ensuring string comparison provides the same result as this function.
+        * page/SecurityOrigin.h:
+        (WebCore::SecurityOrigin::protocol):
+        (WebCore::SecurityOrigin::host):
+        (WebCore::SecurityOrigin::domain):
+
 2016-10-25  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         [DOMJIT] Tell IDL result type to DFG to drop type checks in AI
index 40b30b4..0638bc8 100644 (file)
@@ -551,17 +551,6 @@ bool CachedResourceLoader::shouldContinueAfterNotifyingLoadedFromMemoryCache(con
     return !newRequest.isNull();
 }
 
-static inline bool originsMatch(const CachedResourceRequest& request, const CachedResource& resource)
-{
-    if (request.origin() == resource.origin())
-        return true;
-    if (!request.origin() || !resource.origin())
-        return false;
-    // We use string comparison as this is how they are serialized as HTTP Origin header value.
-    // This is in particular useful for unique origins that are serialized as "null"
-    return request.origin()->toString() == resource.origin()->toString();
-}
-
 bool CachedResourceLoader::shouldUpdateCachedResourceWithCurrentRequest(const CachedResource& resource, const CachedResourceRequest& request)
 {
     // WebKit is not supporting CORS for fonts (https://bugs.webkit.org/show_bug.cgi?id=86817), no need to update the resource before reusing it.
@@ -595,7 +584,7 @@ bool CachedResourceLoader::shouldUpdateCachedResourceWithCurrentRequest(const Ca
         break;
     }
 
-    if (resource.options().mode != request.options().mode || !originsMatch(request, resource))
+    if (resource.options().mode != request.options().mode || !originsMatch(request.origin(), resource.origin()))
         return true;
 
     if (resource.options().redirect != request.options().redirect && resource.hasRedirections())
index e1ae74e..e35a237 100644 (file)
@@ -462,6 +462,42 @@ String SecurityOrigin::toRawString() const
     return result.toString();
 }
 
+static inline bool areOriginsMatching(const SecurityOrigin& origin1, const SecurityOrigin& origin2)
+{
+    if (origin1.isUnique() || origin2.isUnique())
+        return origin1.isUnique() == origin2.isUnique();
+
+    if (origin1.protocol() != origin2.protocol())
+        return false;
+
+    if (origin1.protocol() == "file")
+        return true;
+
+    if (origin1.host() != origin2.host())
+        return false;
+
+    return origin1.port() == origin2.port();
+}
+
+// This function mimics the result of string comparison of serialized origins
+bool originsMatch(const SecurityOrigin& origin1, const SecurityOrigin& origin2)
+{
+    if (&origin1 == &origin2)
+        return true;
+
+    bool result = areOriginsMatching(origin1, origin2);
+    ASSERT(result == (origin1.toString() == origin2.toString()));
+    return result;
+}
+
+bool originsMatch(const SecurityOrigin* origin1, const SecurityOrigin* origin2)
+{
+    if (!origin1 || !origin2)
+        return origin1 == origin2;
+
+    return originsMatch(*origin1, *origin2);
+}
+
 Ref<SecurityOrigin> SecurityOrigin::createFromString(const String& originString)
 {
     return SecurityOrigin::create(URL(URL(), originString));
@@ -470,12 +506,12 @@ Ref<SecurityOrigin> SecurityOrigin::createFromString(const String& originString)
 static const char separatorCharacter = '_';
 
 RefPtr<SecurityOrigin> SecurityOrigin::maybeCreateFromDatabaseIdentifier(const String& databaseIdentifier)
-{ 
+{
     // Make sure there's a first separator
     size_t separator1 = databaseIdentifier.find(separatorCharacter);
     if (separator1 == notFound)
         return nullptr;
-        
+
     // Make sure there's a second separator
     size_t separator2 = databaseIdentifier.reverseFind(separatorCharacter);
     if (separator2 == notFound)
index 011d20e..7875a1e 100644 (file)
@@ -84,9 +84,9 @@ public:
     void setDomainFromDOM(const String& newDomain);
     bool domainWasSetInDOM() const { return m_domainWasSetInDOM; }
 
-    String protocol() const { return m_protocol; }
-    String host() const { return m_host; }
-    String domain() const { return m_domain; }
+    const String& protocol() const { return m_protocol; }
+    const String& host() const { return m_host; }
+    const String& domain() const { return m_domain; }
     Optional<uint16_t> port() const { return m_port; }
 
     // Returns true if a given URL is secure, based either directly on its
@@ -235,4 +235,8 @@ private:
     bool m_needsDatabaseIdentifierQuirkForFiles;
 };
 
+// Returns true if the Origin header values serialized from these two origins would be the same.
+bool originsMatch(const SecurityOrigin&, const SecurityOrigin&);
+bool originsMatch(const SecurityOrigin*, const SecurityOrigin*);
+
 } // namespace WebCore