Title: [211068] trunk/Source/WebKit2
- Revision
- 211068
- Author
- [email protected]
- Date
- 2017-01-23 15:37:42 -0800 (Mon, 23 Jan 2017)
Log Message
Maintain ordering when doing speculative loads
https://bugs.webkit.org/show_bug.cgi?id=167324
Reviewed by Chris Dumez.
We currently randomize the ordering of speculative loads because they are serialized as a hash map.
It would be better to load in the same order as the requests were originally issued as that is
likely to match the order the document needs them.
* NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
(WebKit::NetworkCache::SpeculativeLoadManager::startSpeculativeRevalidation):
* NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp:
(WebKit::NetworkCache::SubresourceInfo::encode):
(WebKit::NetworkCache::SubresourceInfo::decode):
Include key into SubresourceInfo.
(WebKit::NetworkCache::makeSubresourcesVector):
Deduplicate the entries.
(WebKit::NetworkCache::SubresourcesEntry::SubresourcesEntry):
(WebKit::NetworkCache::SubresourcesEntry::updateSubresourceLoads):
* NetworkProcess/cache/NetworkCacheSubresourcesEntry.h:
(WebKit::NetworkCache::SubresourceInfo::SubresourceInfo):
(WebKit::NetworkCache::SubresourceInfo::key):
(WebKit::NetworkCache::SubresourceInfo::setTransient):
(WebKit::NetworkCache::SubresourcesEntry::subresources):
Keep the resources in a Vector instead of a HashMap to maintain order.
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (211067 => 211068)
--- trunk/Source/WebKit2/ChangeLog 2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/ChangeLog 2017-01-23 23:37:42 UTC (rev 211068)
@@ -1,3 +1,36 @@
+2017-01-23 Antti Koivisto <[email protected]>
+
+ Maintain ordering when doing speculative loads
+ https://bugs.webkit.org/show_bug.cgi?id=167324
+
+ Reviewed by Chris Dumez.
+
+ We currently randomize the ordering of speculative loads because they are serialized as a hash map.
+ It would be better to load in the same order as the requests were originally issued as that is
+ likely to match the order the document needs them.
+
+ * NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
+ (WebKit::NetworkCache::SpeculativeLoadManager::startSpeculativeRevalidation):
+ * NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp:
+ (WebKit::NetworkCache::SubresourceInfo::encode):
+ (WebKit::NetworkCache::SubresourceInfo::decode):
+
+ Include key into SubresourceInfo.
+
+ (WebKit::NetworkCache::makeSubresourcesVector):
+
+ Deduplicate the entries.
+
+ (WebKit::NetworkCache::SubresourcesEntry::SubresourcesEntry):
+ (WebKit::NetworkCache::SubresourcesEntry::updateSubresourceLoads):
+ * NetworkProcess/cache/NetworkCacheSubresourcesEntry.h:
+ (WebKit::NetworkCache::SubresourceInfo::SubresourceInfo):
+ (WebKit::NetworkCache::SubresourceInfo::key):
+ (WebKit::NetworkCache::SubresourceInfo::setTransient):
+ (WebKit::NetworkCache::SubresourcesEntry::subresources):
+
+ Keep the resources in a Vector instead of a HashMap to maintain order.
+
2017-01-23 Matt Rajca <[email protected]>
Pass down website autoplay policies to media elements
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp (211067 => 211068)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp 2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp 2017-01-23 23:37:42 UTC (rev 211068)
@@ -514,9 +514,8 @@
void SpeculativeLoadManager::startSpeculativeRevalidation(const GlobalFrameID& frameID, SubresourcesEntry& entry)
{
- for (auto& subresourcePair : entry.subresources()) {
- auto& key = subresourcePair.key;
- auto& subresourceInfo = subresourcePair.value;
+ for (auto& subresourceInfo : entry.subresources()) {
+ auto& key = subresourceInfo.key();
if (!subresourceInfo.isTransient())
preloadEntry(key, subresourceInfo, frameID);
else {
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp (211067 => 211068)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp 2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp 2017-01-23 23:37:42 UTC (rev 211068)
@@ -36,6 +36,7 @@
void SubresourceInfo::encode(WTF::Persistence::Encoder& encoder) const
{
+ encoder << m_key;
encoder << m_isTransient;
// Do not bother serializing other data members of transient resources as they are empty.
@@ -49,6 +50,9 @@
bool SubresourceInfo::decode(WTF::Persistence::Decoder& decoder, SubresourceInfo& info)
{
+ if (!decoder.decode(info.m_key))
+ return false;
+
if (!decoder.decode(info.m_isTransient))
return false;
@@ -99,24 +103,42 @@
{
ASSERT(m_key.type() == "SubResources");
}
+
+static Vector<SubresourceInfo> makeSubresourceInfoVector(const Vector<std::unique_ptr<SubresourceLoad>>& subresourceLoads)
+{
+ Vector<SubresourceInfo> result;
+ result.reserveCapacity(subresourceLoads.size());
+
+ HashSet<Key> seenKeys;
+ for (auto& load : subresourceLoads) {
+ if (!seenKeys.add(load->key).isNewEntry)
+ continue;
+ result.append({ load->key, load->request });
+ }
+ return result;
+}
+
SubresourcesEntry::SubresourcesEntry(Key&& key, const Vector<std::unique_ptr<SubresourceLoad>>& subresourceLoads)
: m_key(WTFMove(key))
, m_timeStamp(std::chrono::system_clock::now())
+ , m_subresources(makeSubresourceInfoVector(subresourceLoads))
{
ASSERT(m_key.type() == "SubResources");
- for (auto& subresourceLoad : subresourceLoads)
- m_subresources.add(subresourceLoad->key, SubresourceInfo(subresourceLoad->request));
}
void SubresourcesEntry::updateSubresourceLoads(const Vector<std::unique_ptr<SubresourceLoad>>& subresourceLoads)
{
- auto oldSubresources = WTFMove(m_subresources);
+ HashSet<Key> previousKeys;
+ for (auto& info : m_subresources)
+ previousKeys.add(info.key());
+
+ m_subresources = makeSubresourceInfoVector(subresourceLoads);
- // Mark keys that are common with last load as non-Transient.
- for (auto& subresourceLoad : subresourceLoads) {
- bool isTransient = !oldSubresources.contains(subresourceLoad->key);
- m_subresources.add(subresourceLoad->key, SubresourceInfo(subresourceLoad->request, isTransient));
+ // Mark keys that are not common with the last load as transient.
+ for (auto& subresourceInfo : m_subresources) {
+ if (!previousKeys.contains(subresourceInfo.key()))
+ subresourceInfo.setTransient();
}
}
Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.h (211067 => 211068)
--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.h 2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.h 2017-01-23 23:37:42 UTC (rev 211068)
@@ -43,21 +43,25 @@
static bool decode(WTF::Persistence::Decoder&, SubresourceInfo&);
SubresourceInfo() = default;
- SubresourceInfo(const WebCore::ResourceRequest& request, bool isTransient = false)
- : m_isTransient(isTransient)
- , m_firstPartyForCookies(isTransient ? WebCore::URL() : request.firstPartyForCookies())
- , m_requestHeaders(isTransient ? WebCore::HTTPHeaderMap() : request.httpHeaderFields())
+ SubresourceInfo(const Key& key, const WebCore::ResourceRequest& request)
+ : m_key(key)
+ , m_firstPartyForCookies(request.firstPartyForCookies())
+ , m_requestHeaders(request.httpHeaderFields())
, m_priority(request.priority())
{
}
+ const Key& key() const { return m_key; }
bool isTransient() const { return m_isTransient; }
const WebCore::URL& firstPartyForCookies() const { ASSERT(!m_isTransient); return m_firstPartyForCookies; }
const WebCore::HTTPHeaderMap& requestHeaders() const { ASSERT(!m_isTransient); return m_requestHeaders; }
WebCore::ResourceLoadPriority priority() const { ASSERT(!m_isTransient); return m_priority; }
+
+ void setTransient() { m_isTransient = true; }
private:
- bool m_isTransient { true };
+ Key m_key;
+ bool m_isTransient { false };
WebCore::URL m_firstPartyForCookies;
WebCore::HTTPHeaderMap m_requestHeaders;
WebCore::ResourceLoadPriority m_priority;
@@ -86,7 +90,7 @@
const Key& key() const { return m_key; }
std::chrono::system_clock::time_point timeStamp() const { return m_timeStamp; }
- const HashMap<Key, SubresourceInfo>& subresources() const { return m_subresources; }
+ const Vector<SubresourceInfo>& subresources() const { return m_subresources; }
void updateSubresourceLoads(const Vector<std::unique_ptr<SubresourceLoad>>&);
@@ -93,7 +97,7 @@
private:
Key m_key;
std::chrono::system_clock::time_point m_timeStamp;
- HashMap<Key, SubresourceInfo> m_subresources;
+ Vector<SubresourceInfo> m_subresources;
};
} // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes