Skip to content
This repository was archived by the owner on Apr 10, 2025. It is now read-only.

Commit e398794

Browse files
morlovichjeffkaufman
authored andcommitted
Don't store webp-animated and non-webp capable image opts under same cache key.
Change the non-webp cache key to avoid picking up any that we previously messed up. Also restructure the code a bit to lower the risk of this occuring again. Part of issue #1216
1 parent 0f77262 commit e398794

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

net/instaweb/rewriter/image_rewrite_filter_test.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3740,4 +3740,26 @@ TEST_F(ImageRewriteTest, GifToWebpLosslessWithWebpAnimatedUa) {
37403740
true);
37413741
}
37423742

3743+
TEST_F(ImageRewriteTest, AnimatedNoCacheReuse) {
3744+
// Make sure we don't reuse results for animated webp-capable UAs for
3745+
// non-webp targets.
3746+
AddFileToMockFetcher(StrCat(kTestDomain, "a.jpeg"), kPuzzleJpgFile,
3747+
kContentTypeJpeg, 100);
3748+
3749+
options()->EnableFilter(RewriteOptions::kConvertJpegToWebp);
3750+
options()->EnableFilter(RewriteOptions::kConvertToWebpAnimated);
3751+
options()->set_image_recompress_quality(85);
3752+
rewrite_driver()->AddFilters();
3753+
3754+
// WebP capable browser --- made a WebP image.
3755+
SetCurrentUserAgent("webp-animated");
3756+
ValidateExpected("webp broswer", "<img src=a.jpeg>",
3757+
"<img src=xa.jpeg.pagespeed.ic.0.webp>");
3758+
ClearRewriteDriver();
3759+
3760+
// Not a WebP browser -- don't!
3761+
SetCurrentUserAgent("curl");
3762+
ValidateNoChanges("non-webp broswer", "<img src=a.jpeg>");
3763+
}
3764+
37433765
} // namespace net_instaweb

net/instaweb/rewriter/image_url_encoder.cc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ const char kMissingDimension = 'N';
4242
// Constants for UserAgent cache key enteries.
4343
const char kWebpLossyUserAgentKey[] = "w";
4444
const char kWebpLossyLossLessAlphaUserAgentKey[] = "v";
45+
const char kWebpAnimatedUserAgentKey[] = "a";
46+
// This used to not have a separate key, but we mixed up animated and it
47+
// at one point, so this is now here to force a flush.
48+
const char kWebpNoneUserAgentKey[] = ".";
4549
const char kMobileUserAgentKey[] = "m";
4650
const char kSmallScreenKey[] = "ss";
4751

@@ -305,13 +309,19 @@ void ImageUrlEncoder::SetSmallScreen(const RewriteDriver& driver,
305309
GoogleString ImageUrlEncoder::CacheKeyFromResourceContext(
306310
const ResourceContext& resource_context) {
307311
GoogleString user_agent_cache_key = "";
308-
if (resource_context.libwebp_level() ==
309-
ResourceContext::LIBWEBP_LOSSY_LOSSLESS_ALPHA) {
310-
StrAppend(&user_agent_cache_key, kWebpLossyLossLessAlphaUserAgentKey);
311-
}
312-
if (resource_context.libwebp_level() ==
313-
ResourceContext::LIBWEBP_LOSSY_ONLY) {
314-
StrAppend(&user_agent_cache_key, kWebpLossyUserAgentKey);
312+
switch (resource_context.libwebp_level()) {
313+
case ResourceContext::LIBWEBP_NONE:
314+
StrAppend(&user_agent_cache_key, kWebpNoneUserAgentKey);
315+
break;
316+
case ResourceContext::LIBWEBP_LOSSY_LOSSLESS_ALPHA:
317+
StrAppend(&user_agent_cache_key, kWebpLossyLossLessAlphaUserAgentKey);
318+
break;
319+
case ResourceContext::LIBWEBP_LOSSY_ONLY:
320+
StrAppend(&user_agent_cache_key, kWebpLossyUserAgentKey);
321+
break;
322+
case ResourceContext::LIBWEBP_ANIMATED:
323+
StrAppend(&user_agent_cache_key, kWebpAnimatedUserAgentKey);
324+
break;
315325
}
316326
if (resource_context.mobile_user_agent()) {
317327
StrAppend(&user_agent_cache_key, kMobileUserAgentKey);

net/instaweb/rewriter/image_url_encoder_test.cc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,25 @@ TEST_F(ImageUrlEncoderTest, SmallScreen) {
363363
context.set_use_small_screen_quality(true);
364364
GoogleString cache_key =
365365
ImageUrlEncoder::CacheKeyFromResourceContext(context);
366-
EXPECT_EQ("ss", cache_key);
366+
EXPECT_EQ(".ss", cache_key);
367+
}
368+
369+
TEST_F(ImageUrlEncoderTest, DifferentWebpLevels) {
370+
// Make sure different levels of WebP support get different cache keys.
371+
std::set<GoogleString> seen;
372+
for (int webp_level = ResourceContext::LibWebpLevel_MIN;
373+
webp_level <= ResourceContext::LibWebpLevel_MAX;
374+
++webp_level) {
375+
if (ResourceContext::LibWebpLevel_IsValid(webp_level)) {
376+
ResourceContext ctx;
377+
ctx.set_libwebp_level(
378+
static_cast<ResourceContext::LibWebpLevel>(webp_level));
379+
GoogleString cache_key =
380+
ImageUrlEncoder::CacheKeyFromResourceContext(ctx);
381+
EXPECT_EQ(seen.find(cache_key), seen.end());
382+
seen.insert(cache_key);
383+
}
384+
}
367385
}
368386

369387
TEST_F(ImageUrlEncoderTest, BadFirst) {

0 commit comments

Comments
 (0)