From e7483beacf9bdba100d38546eb352b21caa9bec9 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Tue, 13 Dec 2011 14:12:07 -0500 Subject: [PATCH] Bug 708683 - Guard more rigorously against bad viewport updates. r=kats a=android-only Check more values in browser.js when updating the viewport, and restructure the JSON conversion in Java so that it's easier to tell what value caused a bad viewport if it comes from Java. --- mobile/android/base/gfx/ViewportMetrics.java | 22 ++++++++++---------- mobile/android/chrome/content/browser.js | 12 +++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/mobile/android/base/gfx/ViewportMetrics.java b/mobile/android/base/gfx/ViewportMetrics.java index e50e160d504f..a9a48ab20b10 100644 --- a/mobile/android/base/gfx/ViewportMetrics.java +++ b/mobile/android/base/gfx/ViewportMetrics.java @@ -236,17 +236,17 @@ public class ViewportMetrics { public String toJSON() { try { - return new JSONStringer().object() - .key("x").value(mViewportRect.left) - .key("y").value(mViewportRect.top) - .key("width").value(mViewportRect.width()) - .key("height").value(mViewportRect.height()) - .key("pageWidth").value(mPageSize.width) - .key("pageHeight").value(mPageSize.height) - .key("offsetX").value(mViewportOffset.x) - .key("offsetY").value(mViewportOffset.y) - .key("zoom").value(mZoomFactor) - .endObject().toString(); + JSONStringer object = new JSONStringer().object(); + object.key("zoom").value(mZoomFactor); + object.key("offsetY").value(mViewportOffset.y); + object.key("offsetX").value(mViewportOffset.x); + object.key("pageHeight").value(mPageSize.height); + object.key("pageWidth").value(mPageSize.width); + object.key("height").value(mViewportRect.height()); + object.key("width").value(mViewportRect.width()); + object.key("y").value(mViewportRect.top); + object.key("x").value(mViewportRect.left); + return object.endObject().toString(); } catch (JSONException je) { Log.e(LOGTAG, "Error serializing viewportmetrics", je); return ""; diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 351c5e7be160..2884e3502268 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -1160,10 +1160,10 @@ Tab.prototype = { get viewport() { // Update the viewport to current dimensions - this._viewport.x = this.browser.contentWindow.scrollX + - this.viewportExcess.x; - this._viewport.y = this.browser.contentWindow.scrollY + - this.viewportExcess.y; + this._viewport.x = (this.browser.contentWindow.scrollX + + this.viewportExcess.x) || 0; + this._viewport.y = (this.browser.contentWindow.scrollY + + this.viewportExcess.y) || 0; // Transform coordinates based on zoom this._viewport.x = Math.round(this._viewport.x * this._viewport.zoom); @@ -1192,8 +1192,8 @@ Tab.prototype = { updateViewport: function(aReset) { let win = this.browser.contentWindow; let zoom = (aReset ? this.getDefaultZoomLevel() : this._viewport.zoom); - let xpos = (aReset ? win.scrollX * zoom : this._viewport.x); - let ypos = (aReset ? win.scrollY * zoom : this._viewport.y); + let xpos = ((aReset && win) ? win.scrollX * zoom : this._viewport.x); + let ypos = ((aReset && win) ? win.scrollY * zoom : this._viewport.y); this.viewportExcess = { x: 0, y: 0 }; this.viewport = { x: xpos, y: ypos,