Bug 590777 - part 1: Viewport metadata cleanup [r=mfinkle]

This commit is contained in:
Matt Brubeck 2010-11-16 09:22:31 -08:00
Родитель fec4a6b94d
Коммит 7963153801
3 изменённых файлов: 61 добавлений и 46 удалений

Просмотреть файл

@ -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");