summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp64
1 files changed, 56 insertions, 8 deletions
diff --git a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp b/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp
index 29882526a7c..7e99a0bc721 100644
--- a/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp
+++ b/chromium/third_party/WebKit/Source/core/fetch/ResourceLoadPriorityOptimizer.cpp
@@ -30,12 +30,23 @@
#include "config.h"
#include "core/fetch/ResourceLoadPriorityOptimizer.h"
+#include "core/rendering/RenderObject.h"
+#include "platform/TraceEvent.h"
+
+#include "wtf/Vector.h"
namespace WebCore {
-ResourceLoadPriorityOptimizer::ResourceAndVisibility::ResourceAndVisibility(ImageResource* image, VisibilityStatus v)
+ResourceLoadPriorityOptimizer* ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()
+{
+ DEFINE_STATIC_LOCAL(ResourceLoadPriorityOptimizer, s_renderLoadOptimizer, ());
+ return &s_renderLoadOptimizer;
+}
+
+ResourceLoadPriorityOptimizer::ResourceAndVisibility::ResourceAndVisibility(ImageResource* image, VisibilityStatus visibilityStatus, uint32_t screenArea)
: imageResource(image)
- , status(v)
+ , status(visibilityStatus)
+ , screenArea(screenArea)
{
}
@@ -49,6 +60,37 @@ ResourceLoadPriorityOptimizer::ResourceLoadPriorityOptimizer()
ResourceLoadPriorityOptimizer::~ResourceLoadPriorityOptimizer()
{
+}
+
+void ResourceLoadPriorityOptimizer::addRenderObject(RenderObject* renderer)
+{
+ m_objects.add(renderer);
+ renderer->setHasPendingResourceUpdate(true);
+}
+
+void ResourceLoadPriorityOptimizer::removeRenderObject(RenderObject* renderer)
+{
+ if (!renderer->hasPendingResourceUpdate())
+ return;
+ m_objects.remove(renderer);
+ renderer->setHasPendingResourceUpdate(false);
+}
+
+void ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities()
+{
+ TRACE_EVENT0("webkit", "ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities");
+
+ m_imageResources.clear();
+
+ Vector<RenderObject*> objectsToRemove;
+ for (RenderObjectSet::iterator it = m_objects.begin(); it != m_objects.end(); ++it) {
+ RenderObject* obj = *it;
+ if (!obj->updateImageLoadingPriorities()) {
+ objectsToRemove.append(obj);
+ }
+ }
+ m_objects.removeAll(objectsToRemove);
+
updateImageResourcesWithLoadPriority();
}
@@ -59,21 +101,27 @@ void ResourceLoadPriorityOptimizer::updateImageResourcesWithLoadPriority()
ResourceLoadPriorityLow : ResourceLoadPriorityVeryLow;
if (priority != it->value->imageResource->resourceRequest().priority()) {
- it->value->imageResource->resourceRequest().setPriority(priority);
- it->value->imageResource->didChangePriority(priority);
+ it->value->imageResource->resourceRequest().setPriority(priority, it->value->screenArea);
+ it->value->imageResource->didChangePriority(priority, it->value->screenArea);
}
}
m_imageResources.clear();
}
-void ResourceLoadPriorityOptimizer::notifyImageResourceVisibility(ImageResource* img, VisibilityStatus status)
+void ResourceLoadPriorityOptimizer::notifyImageResourceVisibility(ImageResource* img, VisibilityStatus status, const LayoutRect& screenRect)
{
if (!img || img->isLoaded())
return;
- ImageResourceMap::AddResult result = m_imageResources.add(img->identifier(), adoptPtr(new ResourceAndVisibility(img, status)));
- if (!result.isNewEntry && status == Visible)
- result.iterator->value->status = status;
+ int screenArea = 0;
+ if (!screenRect.isEmpty() && status == Visible)
+ screenArea += static_cast<uint32_t>(screenRect.width() * screenRect.height());
+
+ ImageResourceMap::AddResult result = m_imageResources.add(img->identifier(), adoptPtr(new ResourceAndVisibility(img, status, screenArea)));
+ if (!result.isNewEntry && status == Visible) {
+ result.storedValue->value->status = status;
+ result.storedValue->value->screenArea = status;
+ }
}
}