Commit ad030e8d authored by Kunihiko Sakamoto's avatar Kunihiko Sakamoto Committed by Commit Bot

Fix viewport calculation for Link: header preload

This fixes a bug that viewport width was evaluated to zero
when evaluating media queries from Link: rel=preload headers, if
"width=device-width" was specified in <meta name="viewport">.

viewport_description->max_width has type = kDeviceWidth and value = 0
in such case, so device width must be resolved before overriding
viewport dimensions.

Note: HTMLPreloadScanner is already doing this, in HandleMetaViewport().

Bug: 590188
Change-Id: Iffb0e031e0316bd41aaf52014609d5e7d0b32284
Reviewed-on: https://chromium-review.googlesource.com/c/1360209
Commit-Queue: Kunihiko Sakamoto <ksakamoto@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#614305}
parent daae39a7
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/settings.h"
#include "third_party/blink/renderer/core/frame/use_counter.h" #include "third_party/blink/renderer/core/frame/use_counter.h"
#include "third_party/blink/renderer/core/frame/viewport_data.h"
#include "third_party/blink/renderer/core/html/cross_origin_attribute.h" #include "third_party/blink/renderer/core/html/cross_origin_attribute.h"
#include "third_party/blink/renderer/core/html/link_rel_attribute.h" #include "third_party/blink/renderer/core/html/link_rel_attribute.h"
#include "third_party/blink/renderer/core/html/parser/html_preload_scanner.h" #include "third_party/blink/renderer/core/html/parser/html_preload_scanner.h"
...@@ -331,9 +332,12 @@ static MediaValues* CreateMediaValues( ...@@ -331,9 +332,12 @@ static MediaValues* CreateMediaValues(
MediaValues* media_values = MediaValues* media_values =
MediaValues::CreateDynamicIfFrameExists(document.GetFrame()); MediaValues::CreateDynamicIfFrameExists(document.GetFrame());
if (viewport_description) { if (viewport_description) {
media_values->OverrideViewportDimensions( FloatSize initial_viewport(media_values->DeviceWidth(),
viewport_description->max_width.GetFloatValue(), media_values->DeviceHeight());
viewport_description->max_height.GetFloatValue()); PageScaleConstraints constraints = viewport_description->Resolve(
initial_viewport, document.GetViewportData().ViewportDefaultMinWidth());
media_values->OverrideViewportDimensions(constraints.layout_size.Width(),
constraints.layout_size.Height());
} }
return media_values; return media_values;
} }
......
<!DOCTYPE html>
<script>
if (window.testRunner) {
testRunner.setCanOpenWindows(true);
testRunner.setCloseRemainingWindowsWhenComplete(true);
}
</script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
var t = async_test('Makes sure that media queries in Link headers correctly evaluate viewport width when <meta content=viewport width=device-width> is specified');
addEventListener("message", t.step_func(function(event) {
if (event.data == "zeroloaded")
assert_unreached("FAIL: media query (width: 0px) matched");
if (event.data == "nonzeronotloaded")
assert_unreached("FAIL: media query (min-width: 1px) did not match");
t.done();
}, false));
var w = window.open("resources/enable-viewport-and-refresh.html?media-link-headers-device-width.php");
</script>
<?php
header("Link: <http://127.0.0.1:8000/resources/square.png?nonzero>;rel=preload;as=image;media=\"(min-width: 1px)\"", false);
header("Link: <http://127.0.0.1:8000/resources/square.png?zero>;rel=preload;as=image;media=\"(width: 0px)\"", false);
?>
<!DOCTYPE html>
<meta name="viewport" content="width=device-width">
<script>
window.addEventListener("load", function() {
var entries = performance.getEntriesByType("resource");
var nonzeroLoaded = false;
for (var i = 0; i < entries.length; ++i) {
if (entries[i].name.indexOf("?zero") != -1)
window.opener.postMessage("zeroloaded", "*");
if (entries[i].name.indexOf("?nonzero") != -1)
nonzeroLoaded = true;
}
if (nonzeroLoaded)
window.opener.postMessage("success", "*")
window.opener.postMessage("nonzeronotloaded", "*");
});
</script>
<script src="../resources/slow-script.pl?delay=200"></script>
<?php <?php
header('Link: <http://127.0.0.1:8000/resources/square.png?large>; rel=preload; as=image; imagesrcset="http://127.0.0.1:8000/resources/square.png?small 150w, http://127.0.0.1:8000/resources/square.png?large 300w"; imagesizes="(min-width: 150px) and (max-width: 150px) 150px, 300px"', false); header('Link: <http://127.0.0.1:8000/resources/square.png?large>; rel=preload; as=image; imagesrcset="http://127.0.0.1:8000/resources/square.png?small 300w, http://127.0.0.1:8000/resources/square.png?large 600w"; imagesizes="(min-width: 300px) and (max-width: 300px) 300px, 600px"', false);
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<meta name="viewport" content="width=150"> <meta name="viewport" content="width=300">
<script> <script>
window.addEventListener("load", function() { window.addEventListener("load", function() {
var entries = performance.getEntriesByType("resource"); var entries = performance.getEntriesByType("resource");
......
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