diff --git a/mobile/chrome/content/BrowserView.js b/mobile/chrome/content/BrowserView.js index fe271cddd857..80e0a8e2f6db 100644 --- a/mobile/chrome/content/BrowserView.js +++ b/mobile/chrome/content/BrowserView.js @@ -575,8 +575,11 @@ BrowserView.prototype = { if (!browser) return 0; - if (Util.contentIsHandheld(browser)) + let metaData = Util.contentIsHandheld(browser); + if (metaData.reason == "handheld" || metaData.reason == "doctype") return 1; + else if (metaData.reason == "viewport" && metaData.scale > 0) + return metaData.scale; let bvs = this._browserViewportState; // browser exists, so bvs must as well let w = this.viewportToBrowser(bvs.viewportRect.right); diff --git a/mobile/chrome/content/Util.js b/mobile/chrome/content/Util.js index 80db3230fa71..9da0a1416ce4 100644 --- a/mobile/chrome/content/Util.js +++ b/mobile/chrome/content/Util.js @@ -112,16 +112,27 @@ let Util = { contentIsHandheld: function contentIsHandheld(browser) { let doctype = browser.contentDocument.doctype; if (doctype && /(WAP|WML|Mobile)/.test(doctype.publicId)) - return true; + return {reason: "doctype", result: true}; let windowUtils = browser.contentWindow .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindowUtils); let handheldFriendly = windowUtils.getDocumentMetadata("HandheldFriendly"); if (handheldFriendly == "true") - return true; + return {reason: "handheld", result: true}; - return false; + let viewportScale = parseFloat(windowUtils.getDocumentMetadata("viewport-initial-scale")); + if (viewportScale > 0) { + return { + reason: "viewport", + result: true, + scale: viewportScale, + width: parseInt(windowUtils.getDocumentMetadata("viewport-width")), + height: parseInt(windowUtils.getDocumentMetadata("viewport-height")) + } + } + + return {reason: "", result: false}; } }; diff --git a/mobile/chrome/content/browser.js b/mobile/chrome/content/browser.js index cc26f39a7e43..21e15dfbe948 100644 --- a/mobile/chrome/content/browser.js +++ b/mobile/chrome/content/browser.js @@ -372,7 +372,7 @@ var Browser = { bv.beginBatchOperation(); let stylesheet = document.styleSheets[0]; - for each (let style in ['window-width', 'window-height', 'toolbar-height', 'browser', 'browser-handheld']) { + for each (let style in ["window-width", "window-height", "toolbar-height", "browser", "browser-handheld", "browser-viewport"]) { let index = stylesheet.insertRule("." + style + " {}", stylesheet.cssRules.length); this.styles[style] = stylesheet.cssRules[index].style; } @@ -2489,8 +2489,29 @@ Tab.prototype = { endLoading: function() { // Determine at what resolution the browser is rendered based on meta tag let browser = this._browser; - if (Util.contentIsHandheld(browser)) { + let metaData = Util.contentIsHandheld(browser); + + if (metaData.reason == "handheld" || metaData.reason == "doctype") { browser.className = "browser-handheld"; + } else if (metaData.reason == "viewport") { + let screenW = window.innerWidth; + let screenH = window.innerHeight; + let viewportW = metaData.width; + let viewportH = metaData.height; + let validW = viewportW > 0; + let validH = viewportH > 0; + + if (validW && !validH) { + viewportH = viewportW * (screenH / screenW); + } else if (!validW && validH) { + viewportW = viewportH * (screenW / screenH); + } else { + viewportW = kDefaultBrowserWidth; + viewportH = kDefaultBrowserWidth * (screenH / screenW); + } + browser.className = "browser-viewport"; + browser.style.width = viewportW + "px"; + browser.style.height = viewportH + "px"; } else { browser.className = "browser"; }