зеркало из https://github.com/mozilla/gecko-dev.git
Bug 590777 - part 1: Viewport metadata cleanup [r=mfinkle]
This commit is contained in:
Родитель
fec4a6b94d
Коммит
7963153801
|
@ -62,7 +62,7 @@ const kBrowserFormZoomLevelMin = 0.8;
|
|||
const kBrowserFormZoomLevelMax = 2.0;
|
||||
const kBrowserViewZoomLevelPrecision = 10000;
|
||||
|
||||
const kDefaultMetadata = { allowZoom: true };
|
||||
const kDefaultMetadata = { autoSize: false, allowZoom: true, autoScale: true };
|
||||
|
||||
// Override sizeToContent in the main window. It breaks things (bug 565887)
|
||||
window.sizeToContent = function() {
|
||||
|
@ -2531,14 +2531,17 @@ Tab.prototype = {
|
|||
let viewportW, viewportH;
|
||||
|
||||
let metadata = this.metadata;
|
||||
|
||||
let scaleRatio = this.getScaleRatio();
|
||||
if (metadata.autoScale) {
|
||||
metadata.defaultZoom *= scaleRatio;
|
||||
metadata.minZoom *= scaleRatio;
|
||||
metadata.maxZoom *= scaleRatio;
|
||||
}
|
||||
|
||||
if (metadata.autoSize) {
|
||||
viewportW = screenW;
|
||||
viewportH = screenH;
|
||||
if (metadata.defaultZoom != 1.0) {
|
||||
let dpiScale = Services.prefs.getIntPref("zoom.dpiScale") / 100;
|
||||
viewportW /= dpiScale;
|
||||
viewportH /= dpiScale;
|
||||
}
|
||||
viewportW = screenW / metadata.defaultZoom;
|
||||
viewportH = screenH / metadata.defaultZoom;
|
||||
} else {
|
||||
viewportW = metadata.width;
|
||||
viewportH = metadata.height;
|
||||
|
@ -2560,9 +2563,16 @@ Tab.prototype = {
|
|||
viewportH = kDefaultBrowserWidth * (screenH / screenW);
|
||||
}
|
||||
}
|
||||
|
||||
browser.setWindowSize(viewportW, viewportH);
|
||||
},
|
||||
|
||||
// The device-pixel-to-CSS-px ratio used to adjust meta viewport values.
|
||||
// This is higher on higher-dpi displays, so pages stay about the same physical size.
|
||||
getScaleRatio: function getScaleRatio() {
|
||||
return Services.prefs.getIntPref("zoom.dpiScale") / 100;
|
||||
},
|
||||
|
||||
restoreViewportPosition: function restoreViewportPosition(aOldWidth, aNewWidth) {
|
||||
let browser = this._browser;
|
||||
let pos = browser.getPosition();
|
||||
|
|
|
@ -586,25 +586,34 @@ let ViewportHandler = {
|
|||
sendAsyncMessage("Browser:ViewportMetadata", this.metadata);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns an object with the page's preferred viewport properties:
|
||||
* defaultZoom (optional float): The initial scale when the page is loaded.
|
||||
* minZoom (optional float): The minimum zoom level.
|
||||
* maxZoom (optional float): The maximum zoom level.
|
||||
* width (optional int): The CSS viewport width in px.
|
||||
* height (optional int): The CSS viewport height in px.
|
||||
* autoSize (boolean): Resize the CSS viewport when the window resizes.
|
||||
* allowZoom (boolean): Let the user zoom in or out.
|
||||
* autoScale (boolean): Adjust the viewport properties to account for display density.
|
||||
*/
|
||||
getViewportMetadata: function getViewportMetadata() {
|
||||
let dpiScale = Services.prefs.getIntPref("zoom.dpiScale") / 100;
|
||||
|
||||
let doctype = content.document.doctype;
|
||||
if (doctype && /(WAP|WML|Mobile)/.test(doctype.publicId))
|
||||
return { defaultZoom: dpiScale, autoSize: true };
|
||||
return { defaultZoom: 1, autoSize: true, allowZoom: true, autoScale: true };
|
||||
|
||||
let windowUtils = Util.getWindowUtils(content);
|
||||
let handheldFriendly = windowUtils.getDocumentMetadata("HandheldFriendly");
|
||||
if (handheldFriendly == "true")
|
||||
return { defaultZoom: dpiScale, autoSize: true };
|
||||
return { defaultZoom: 1, autoSize: true, allowZoom: true, autoScale: true };
|
||||
|
||||
if (content.document instanceof XULDocument)
|
||||
return { defaultZoom: 1.0, autoSize: true, allowZoom: false };
|
||||
return { defaultZoom: 1, autoSize: true, allowZoom: false, autoScale: false };
|
||||
|
||||
// HACK: Since we can't set the scale in local tabs (bug 597081), we force
|
||||
// them to device-width and scale=1 so they will lay out reasonably.
|
||||
if (Util.isParentProcess())
|
||||
return { defaultZoom: 1.0, autoSize: true, allowZoom: false };
|
||||
return { defaultZoom: 1, autoSize: true, allowZoom: false, autoScale: false };
|
||||
|
||||
// viewport details found here
|
||||
// http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html
|
||||
|
@ -612,43 +621,35 @@ let ViewportHandler = {
|
|||
|
||||
// Note: These values will be NaN if parseFloat or parseInt doesn't find a number.
|
||||
// Remember that NaN is contagious: Math.max(1, NaN) == Math.min(1, NaN) == NaN.
|
||||
let viewportScale = parseFloat(windowUtils.getDocumentMetadata("viewport-initial-scale"));
|
||||
let viewportMinScale = parseFloat(windowUtils.getDocumentMetadata("viewport-minimum-scale"));
|
||||
let viewportMaxScale = parseFloat(windowUtils.getDocumentMetadata("viewport-maximum-scale"));
|
||||
let viewportWidthStr = windowUtils.getDocumentMetadata("viewport-width");
|
||||
let viewportHeightStr = windowUtils.getDocumentMetadata("viewport-height");
|
||||
let scale = parseFloat(windowUtils.getDocumentMetadata("viewport-initial-scale"));
|
||||
let minScale = parseFloat(windowUtils.getDocumentMetadata("viewport-minimum-scale"));
|
||||
let maxScale = parseFloat(windowUtils.getDocumentMetadata("viewport-maximum-scale"));
|
||||
|
||||
viewportScale = Util.clamp(viewportScale, kViewportMinScale, kViewportMaxScale);
|
||||
viewportMinScale = Util.clamp(viewportMinScale, kViewportMinScale, kViewportMaxScale);
|
||||
viewportMaxScale = Util.clamp(viewportMaxScale, kViewportMinScale, kViewportMaxScale);
|
||||
let widthStr = windowUtils.getDocumentMetadata("viewport-width");
|
||||
let heightStr = windowUtils.getDocumentMetadata("viewport-height");
|
||||
let width = Util.clamp(parseInt(widthStr), kViewportMinWidth, kViewportMaxWidth);
|
||||
let height = Util.clamp(parseInt(heightStr), kViewportMinHeight, kViewportMaxHeight);
|
||||
|
||||
let allowZoomStr = windowUtils.getDocumentMetadata("viewport-user-scalable");
|
||||
let allowZoom = !/^(0|no|false)$/.test(allowZoomStr); // WebKit allows 0, "no", or "false"
|
||||
|
||||
scale = Util.clamp(scale, kViewportMinScale, kViewportMaxScale);
|
||||
minScale = Util.clamp(minScale, kViewportMinScale, kViewportMaxScale);
|
||||
maxScale = Util.clamp(maxScale, kViewportMinScale, kViewportMaxScale);
|
||||
|
||||
// If initial scale is 1.0 and width is not set, assume width=device-width
|
||||
let autoSize = (viewportWidthStr == "device-width" ||
|
||||
viewportHeightStr == "device-height" ||
|
||||
(viewportScale == 1.0 && !viewportWidthStr));
|
||||
|
||||
let viewportWidth = Util.clamp(parseInt(viewportWidthStr), kViewportMinWidth, kViewportMaxWidth);
|
||||
let viewportHeight = Util.clamp(parseInt(viewportHeightStr), kViewportMinHeight, kViewportMaxHeight);
|
||||
|
||||
// Zoom level is the final (device pixel : CSS pixel) ratio for content.
|
||||
// Since web content specifies scale as (reference pixel : CSS pixel) ratio,
|
||||
// multiply the requested scale by a constant (device pixel : reference pixel)
|
||||
// factor to account for high DPI devices.
|
||||
//
|
||||
// See bug 561445 or any of the examples of chrome/tests/browser_viewport_XX.html
|
||||
// for more information and examples.
|
||||
let defaultZoom = viewportScale * dpiScale;
|
||||
let minZoom = viewportMinScale * dpiScale;
|
||||
let maxZoom = viewportMaxScale * dpiScale;
|
||||
let autoSize = (widthStr == "device-width" ||
|
||||
(!widthStr && (heightStr == "device-height" || scale == 1.0)));
|
||||
|
||||
return {
|
||||
defaultZoom: defaultZoom,
|
||||
minZoom: minZoom,
|
||||
maxZoom: maxZoom,
|
||||
width: viewportWidth,
|
||||
height: viewportHeight,
|
||||
defaultZoom: scale,
|
||||
minZoom: minScale,
|
||||
maxZoom: maxScale,
|
||||
width: width,
|
||||
height: height,
|
||||
autoSize: autoSize,
|
||||
allowZoom: windowUtils.getDocumentMetadata("viewport-user-scalable") != "no"
|
||||
allowZoom: allowZoom,
|
||||
autoScale: true
|
||||
};
|
||||
}
|
||||
};
|
||||
|
|
|
@ -65,12 +65,15 @@ let gTestData = [
|
|||
{ metadata: "width=device-width, initial-scale=1", width: 533.33, scale: 1.5 },
|
||||
{ metadata: "width=320, initial-scale=1", width: 533.33, scale: 1.5 },
|
||||
{ metadata: "initial-scale=1.0, user-scalable=no", width: 533.33, scale: 1.5, disableZoom: true },
|
||||
{ metadata: "initial-scale=1.0, user-scalable=0", width: 533.33, scale: 1.5, disableZoom: true },
|
||||
{ metadata: "initial-scale=1.0, user-scalable=false", width: 533.33, scale: 1.5, disableZoom: true },
|
||||
{ metadata: "initial-scale=1.0, user-scalable=NO", width: 533.33, scale: 1.5, disableZoom: false }, // values are case-sensitive
|
||||
{ metadata: "width=200,height=500", width: 200, scale: 4 },
|
||||
{ metadata: "width=2000, minimum-scale=0.75", width: 2000, scale: 1.125, minScale: 1.125 },
|
||||
{ metadata: "width=100, maximum-scale=2.0", width: 266.67, scale: 3, maxScale: 3 },
|
||||
{ metadata: "width=2000, initial-scale=0.75", width: 2000, scale: 1.125 },
|
||||
{ metadata: "width=20000, initial-scale=100", width: 10000, scale: 4 },
|
||||
{ metadata: "XHTML", width: 533.33, scale: 1.5, disableZoom: true },
|
||||
{ metadata: "XHTML", width: 533.33, scale: 1.5, disableZoom: false },
|
||||
/* testing spaces between arguments (bug 572696) */
|
||||
{ metadata: "width= 2000, minimum-scale=0.75", width: 2000, scale: 1.125 },
|
||||
{ metadata: "width = 2000, minimum-scale=0.75", width: 2000, scale: 1.125 },
|
||||
|
@ -87,6 +90,7 @@ let gTestData = [
|
|||
function test() {
|
||||
// This test is async
|
||||
waitForExplicitFinish();
|
||||
requestLongerTimeout(2);
|
||||
|
||||
working_tab = Browser.addTab("about:blank", true);
|
||||
ok(working_tab, "Tab Opened");
|
||||
|
|
Загрузка…
Ссылка в новой задаче