Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / fetch / ResourceLoadPriorityOptimizer.cpp
index 625a999..bdb63a7 100644 (file)
 #include "config.h"
 #include "core/fetch/ResourceLoadPriorityOptimizer.h"
 #include "core/rendering/RenderObject.h"
+#include "platform/TraceEvent.h"
 
 #include "wtf/Vector.h"
 
-namespace WebCore {
+namespace blink {
 
 ResourceLoadPriorityOptimizer* ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()
 {
@@ -42,9 +43,10 @@ ResourceLoadPriorityOptimizer* ResourceLoadPriorityOptimizer::resourceLoadPriori
     return &s_renderLoadOptimizer;
 }
 
-ResourceLoadPriorityOptimizer::ResourceAndVisibility::ResourceAndVisibility(ImageResource* image, VisibilityStatus v)
+ResourceLoadPriorityOptimizer::ResourceAndVisibility::ResourceAndVisibility(ImageResource* image, VisibilityStatus visibilityStatus, uint32_t screenArea)
     : imageResource(image)
-    , status(v)
+    , status(visibilityStatus)
+    , screenArea(screenArea)
 {
 }
 
@@ -76,6 +78,8 @@ void ResourceLoadPriorityOptimizer::removeRenderObject(RenderObject* renderer)
 
 void ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities()
 {
+    TRACE_EVENT0("blink", "ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities");
+
     m_imageResources.clear();
 
     Vector<RenderObject*> objectsToRemove;
@@ -85,9 +89,7 @@ void ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities()
             objectsToRemove.append(obj);
         }
     }
-
-    for (Vector<RenderObject*>::iterator it = objectsToRemove.begin(); it != objectsToRemove.end(); ++it)
-        m_objects.remove(*it);
+    m_objects.removeAll(objectsToRemove);
 
     updateImageResourcesWithLoadPriority();
 }
@@ -99,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->mutableResourceRequest().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)
+    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;
+    }
 }
 
 }