Commit 1085cbf4 authored by Becca Hughes's avatar Becca Hughes Committed by Commit Bot

Media Controls: Count the UA resources on the resource itself.

Move the UA resource counter into ImageResource itself. This means it
will always line up with the corresponding Resource counter and there is
no chance of a miscount.

BUG=790979

Change-Id: Icbb514b151cf9b2800807e3a201db51bdd506076
Reviewed-on: https://chromium-review.googlesource.com/803347
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarNate Chapin <japhet@chromium.org>
Reviewed-by: default avatarRune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/master@{#522098}
parent 6398aeac
...@@ -139,9 +139,6 @@ StyleImage* CSSImageSetValue::CacheImage( ...@@ -139,9 +139,6 @@ StyleImage* CSSImageSetValue::CacheImage(
cached_image_ = StyleInvalidImage::Create(image.image_url); cached_image_ = StyleInvalidImage::Create(image.image_url);
} }
cached_scale_factor_ = device_scale_factor; cached_scale_factor_ = device_scale_factor;
if (parser_mode_ == kUASheetMode)
cached_image_->FlagAsUserAgentResource();
} }
return cached_image_.Get(); return cached_image_.Get();
......
...@@ -30,14 +30,17 @@ ...@@ -30,14 +30,17 @@
#include "core/loader/resource/ImageResourceContent.h" #include "core/loader/resource/ImageResourceContent.h"
#include "core/loader/resource/ImageResourceInfo.h" #include "core/loader/resource/ImageResourceInfo.h"
#include "platform/Histogram.h" #include "platform/Histogram.h"
#include "platform/InstanceCounters.h"
#include "platform/SharedBuffer.h" #include "platform/SharedBuffer.h"
#include "platform/instrumentation/tracing/TraceEvent.h" #include "platform/instrumentation/tracing/TraceEvent.h"
#include "platform/loader/fetch/FetchParameters.h"
#include "platform/loader/fetch/MemoryCache.h" #include "platform/loader/fetch/MemoryCache.h"
#include "platform/loader/fetch/ResourceClient.h" #include "platform/loader/fetch/ResourceClient.h"
#include "platform/loader/fetch/ResourceFetcher.h" #include "platform/loader/fetch/ResourceFetcher.h"
#include "platform/loader/fetch/ResourceLoader.h" #include "platform/loader/fetch/ResourceLoader.h"
#include "platform/loader/fetch/ResourceLoaderOptions.h" #include "platform/loader/fetch/ResourceLoaderOptions.h"
#include "platform/loader/fetch/ResourceLoadingLog.h" #include "platform/loader/fetch/ResourceLoadingLog.h"
#include "platform/loader/fetch/fetch_initiator_type_names.h"
#include "platform/network/HTTPParsers.h" #include "platform/network/HTTPParsers.h"
#include "platform/runtime_enabled_features.h" #include "platform/runtime_enabled_features.h"
#include "platform/weborigin/KURL.h" #include "platform/weborigin/KURL.h"
...@@ -184,8 +187,14 @@ ImageResource* ImageResource::Fetch(FetchParameters& params, ...@@ -184,8 +187,14 @@ ImageResource* ImageResource::Fetch(FetchParameters& params,
return nullptr; return nullptr;
} }
return ToImageResource( ImageResource* resource = ToImageResource(
fetcher->RequestResource(params, ImageResourceFactory(params))); fetcher->RequestResource(params, ImageResourceFactory(params)));
// If the fetch originated from user agent CSS we should mark it as a user
// agent resource.
if (params.Options().initiator_info.name == FetchInitiatorTypeNames::uacss)
resource->FlagAsUserAgentResource();
return resource;
} }
bool ImageResource::CanReuse(const FetchParameters& params) const { bool ImageResource::CanReuse(const FetchParameters& params) const {
...@@ -240,6 +249,9 @@ ImageResource::ImageResource(const ResourceRequest& resource_request, ...@@ -240,6 +249,9 @@ ImageResource::ImageResource(const ResourceRequest& resource_request,
ImageResource::~ImageResource() { ImageResource::~ImageResource() {
RESOURCE_LOADING_DVLOG(1) << "~ImageResource " << this; RESOURCE_LOADING_DVLOG(1) << "~ImageResource " << this;
if (is_referenced_from_ua_stylesheet_)
InstanceCounters::DecrementCounter(InstanceCounters::kUACSSResourceCounter);
} }
void ImageResource::Trace(blink::Visitor* visitor) { void ImageResource::Trace(blink::Visitor* visitor) {
...@@ -711,4 +723,12 @@ void ImageResource::UpdateImage( ...@@ -711,4 +723,12 @@ void ImageResource::UpdateImage(
} }
} }
void ImageResource::FlagAsUserAgentResource() {
if (is_referenced_from_ua_stylesheet_)
return;
InstanceCounters::IncrementCounter(InstanceCounters::kUACSSResourceCounter);
is_referenced_from_ua_stylesheet_ = true;
}
} // namespace blink } // namespace blink
...@@ -100,6 +100,10 @@ class CORE_EXPORT ImageResource final ...@@ -100,6 +100,10 @@ class CORE_EXPORT ImageResource final
bool ShouldShowPlaceholder() const; bool ShouldShowPlaceholder() const;
// If the ImageResource came from a user agent CSS stylesheet then we should
// flag it so that it can persist beyond navigation.
void FlagAsUserAgentResource();
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
...@@ -178,6 +182,8 @@ class CORE_EXPORT ImageResource final ...@@ -178,6 +182,8 @@ class CORE_EXPORT ImageResource final
double last_flush_time_ = 0.; double last_flush_time_ = 0.;
bool is_during_finish_as_error_ = false; bool is_during_finish_as_error_ = false;
bool is_referenced_from_ua_stylesheet_ = false;
}; };
DEFINE_RESOURCE_TYPE_CASTS(Image); DEFINE_RESOURCE_TYPE_CASTS(Image);
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <memory> #include <memory>
#include "core/loader/resource/MockImageResourceObserver.h" #include "core/loader/resource/MockImageResourceObserver.h"
#include "platform/InstanceCounters.h"
#include "platform/SharedBuffer.h" #include "platform/SharedBuffer.h"
#include "platform/exported/WrappedResourceResponse.h" #include "platform/exported/WrappedResourceResponse.h"
#include "platform/graphics/BitmapImage.h" #include "platform/graphics/BitmapImage.h"
...@@ -43,6 +44,7 @@ ...@@ -43,6 +44,7 @@
#include "platform/loader/fetch/ResourceFinishObserver.h" #include "platform/loader/fetch/ResourceFinishObserver.h"
#include "platform/loader/fetch/ResourceLoader.h" #include "platform/loader/fetch/ResourceLoader.h"
#include "platform/loader/fetch/UniqueIdentifier.h" #include "platform/loader/fetch/UniqueIdentifier.h"
#include "platform/loader/fetch/fetch_initiator_type_names.h"
#include "platform/loader/testing/MockFetchContext.h" #include "platform/loader/testing/MockFetchContext.h"
#include "platform/loader/testing/MockResourceClient.h" #include "platform/loader/testing/MockResourceClient.h"
#include "platform/network/http_names.h" #include "platform/network/http_names.h"
...@@ -1945,4 +1947,86 @@ TEST(ImageResourceTest, DeferredInvalidation) { ...@@ -1945,4 +1947,86 @@ TEST(ImageResourceTest, DeferredInvalidation) {
} }
} // namespace } // namespace
class ImageResourceCounterTest : public ::testing::Test {
public:
ImageResourceCounterTest() {}
~ImageResourceCounterTest() {}
void CreateImageResource(const char* url_part, bool ua_resource) {
// Create a unique fake data url.
String url("data:image/png;base64,");
url.append(url_part);
// Setup the fetcher and request.
ResourceFetcher* fetcher = CreateFetcher();
KURL test_url(url);
ResourceRequest request = ResourceRequest(test_url);
FetchParameters fetch_params(request);
scheduler::FakeWebTaskRunner* task_runner =
static_cast<scheduler::FakeWebTaskRunner*>(
fetcher->Context().GetLoadingTaskRunner().get());
task_runner->SetTime(1);
// Mark it as coming from a UA stylesheet (if needed).
if (ua_resource) {
fetch_params.MutableOptions().initiator_info.name =
FetchInitiatorTypeNames::uacss;
}
// Fetch the ImageResource.
ImageResource::Fetch(fetch_params, fetcher);
task_runner->RunUntilIdle();
}
int GetResourceCount() const {
return InstanceCounters::CounterValue(InstanceCounters::kResourceCounter);
}
int GetUACSSResourceCount() const {
return InstanceCounters::CounterValue(
InstanceCounters::kUACSSResourceCounter);
}
};
TEST_F(ImageResourceCounterTest, InstanceCounters) {
// Get the current resource count.
int current_count = GetResourceCount();
int current_ua_count = GetUACSSResourceCount();
// Create a non-UA sourced image.
CreateImageResource("a", false);
// Check the instance counters have been updated.
EXPECT_EQ(++current_count, GetResourceCount());
EXPECT_EQ(current_ua_count, GetUACSSResourceCount());
// Create another non-UA sourced image.
CreateImageResource("b", false);
// Check the instance counters have been updated.
EXPECT_EQ(++current_count, GetResourceCount());
EXPECT_EQ(current_ua_count, GetUACSSResourceCount());
}
TEST_F(ImageResourceCounterTest, InstanceCounters_UserAgent) {
// Get the current resource count.
int current_count = GetResourceCount();
int current_ua_count = GetUACSSResourceCount();
// Create a non-UA sourced image.
CreateImageResource("c", false);
// Check the instance counters have been updated.
EXPECT_EQ(++current_count, GetResourceCount());
EXPECT_EQ(current_ua_count, GetUACSSResourceCount());
// Create a UA sourced image.
CreateImageResource("d", true);
// Check the instance counters have been updated.
EXPECT_EQ(++current_count, GetResourceCount());
EXPECT_EQ(++current_ua_count, GetUACSSResourceCount());
}
} // namespace blink } // namespace blink
...@@ -6,16 +6,10 @@ ...@@ -6,16 +6,10 @@
#include "core/svg/graphics/SVGImage.h" #include "core/svg/graphics/SVGImage.h"
#include "core/svg/graphics/SVGImageForContainer.h" #include "core/svg/graphics/SVGImageForContainer.h"
#include "platform/InstanceCounters.h"
#include "platform/geometry/LayoutSize.h" #include "platform/geometry/LayoutSize.h"
namespace blink { namespace blink {
StyleImage::~StyleImage() {
if (is_ua_css_resource_)
InstanceCounters::DecrementCounter(InstanceCounters::kUACSSResourceCounter);
}
LayoutSize StyleImage::ApplyZoom(const LayoutSize& size, LayoutSize StyleImage::ApplyZoom(const LayoutSize& size,
float multiplier) const { float multiplier) const {
if (multiplier == 1.0f || ImageHasRelativeSize()) if (multiplier == 1.0f || ImageHasRelativeSize())
...@@ -45,12 +39,4 @@ LayoutSize StyleImage::ImageSizeForSVGImage( ...@@ -45,12 +39,4 @@ LayoutSize StyleImage::ImageSizeForSVGImage(
return ApplyZoom(image_size, multiplier); return ApplyZoom(image_size, multiplier);
} }
void StyleImage::FlagAsUserAgentResource() {
if (is_ua_css_resource_)
return;
InstanceCounters::IncrementCounter(InstanceCounters::kUACSSResourceCounter);
is_ua_css_resource_ = true;
}
} // namespace blink } // namespace blink
...@@ -46,7 +46,7 @@ typedef void* WrappedImagePtr; ...@@ -46,7 +46,7 @@ typedef void* WrappedImagePtr;
// value. // value.
class CORE_EXPORT StyleImage : public GarbageCollectedFinalized<StyleImage> { class CORE_EXPORT StyleImage : public GarbageCollectedFinalized<StyleImage> {
public: public:
virtual ~StyleImage(); virtual ~StyleImage() {}
bool operator==(const StyleImage& other) const { bool operator==(const StyleImage& other) const {
return Data() == other.Data(); return Data() == other.Data();
...@@ -133,10 +133,6 @@ class CORE_EXPORT StyleImage : public GarbageCollectedFinalized<StyleImage> { ...@@ -133,10 +133,6 @@ class CORE_EXPORT StyleImage : public GarbageCollectedFinalized<StyleImage> {
ALWAYS_INLINE bool IsInvalidImage() const { return is_invalid_image_; } ALWAYS_INLINE bool IsInvalidImage() const { return is_invalid_image_; }
ALWAYS_INLINE bool IsPaintImage() const { return is_paint_image_; } ALWAYS_INLINE bool IsPaintImage() const { return is_paint_image_; }
// If the StyleImage belongs to a User Agent stylesheet, it should be flagged
// so that it can persist beyond a navigation.
void FlagAsUserAgentResource();
virtual void Trace(blink::Visitor* visitor) {} virtual void Trace(blink::Visitor* visitor) {}
protected: protected:
...@@ -154,8 +150,6 @@ class CORE_EXPORT StyleImage : public GarbageCollectedFinalized<StyleImage> { ...@@ -154,8 +150,6 @@ class CORE_EXPORT StyleImage : public GarbageCollectedFinalized<StyleImage> {
bool is_invalid_image_ : 1; bool is_invalid_image_ : 1;
bool is_paint_image_ : 1; bool is_paint_image_ : 1;
bool is_ua_css_resource_ = false;
LayoutSize ApplyZoom(const LayoutSize&, float multiplier) const; LayoutSize ApplyZoom(const LayoutSize&, float multiplier) const;
LayoutSize ImageSizeForSVGImage(SVGImage*, LayoutSize ImageSizeForSVGImage(SVGImage*,
float multiplier, float multiplier,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment