Bug 1240326 - Part 2: Utilize lazyWidth and lazyHeight properties from frame loaders for tab width and height. r?kmag draft
authorBob Silverberg <bsilverberg@mozilla.com>
Tue, 26 Apr 2016 10:25:20 -0400
changeset 375666 338940f4ca8ee0d47b6d3f807f58915f604877a2
parent 375665 699e3e22e0c1569c291e163087d9943aed16f972
child 522932 e4a4fabd9fd214f325e77999e3ebc90a62ef0365
push id20344
push userbmo:bob.silverberg@gmail.com
push dateMon, 06 Jun 2016 12:42:11 +0000
reviewerskmag
bugs1240326
milestone49.0a1
Bug 1240326 - Part 2: Utilize lazyWidth and lazyHeight properties from frame loaders for tab width and height. r?kmag MozReview-Commit-ID: FI41LGDrFFK
browser/components/extensions/ext-utils.js
browser/components/extensions/test/browser/browser_ext_tabs_events.js
browser/components/extensions/test/browser/browser_ext_tabs_query.js
--- a/browser/components/extensions/ext-utils.js
+++ b/browser/components/extensions/ext-utils.js
@@ -466,16 +466,17 @@ ExtensionTabManager.prototype = {
   },
 
   hasTabPermission(tab) {
     return this.extension.hasPermission("tabs") || this.hasActiveTabPermission(tab);
   },
 
   convert(tab) {
     let window = tab.ownerDocument.defaultView;
+    let browser = tab.linkedBrowser;
 
     let mutedInfo = {muted: tab.muted};
     if (tab.muteReason === null) {
       mutedInfo.reason = "user";
     } else if (tab.muteReason) {
       mutedInfo.reason = "extension";
       mutedInfo.extensionId = tab.muteReason;
     }
@@ -484,27 +485,27 @@ ExtensionTabManager.prototype = {
       id: TabManager.getId(tab),
       index: tab._tPos,
       windowId: WindowManager.getId(window),
       selected: tab.selected,
       highlighted: tab.selected,
       active: tab.selected,
       pinned: tab.pinned,
       status: TabManager.getStatus(tab),
-      incognito: PrivateBrowsingUtils.isBrowserPrivate(tab.linkedBrowser),
-      width: tab.linkedBrowser.clientWidth,
-      height: tab.linkedBrowser.clientHeight,
+      incognito: PrivateBrowsingUtils.isBrowserPrivate(browser),
+      width: browser.frameLoader.lazyWidth || browser.clientWidth,
+      height: browser.frameLoader.lazyHeight || browser.clientHeight,
       audible: tab.soundPlaying,
       mutedInfo,
     };
 
     if (this.hasTabPermission(tab)) {
-      result.url = tab.linkedBrowser.currentURI.spec;
-      if (tab.linkedBrowser.contentTitle) {
-        result.title = tab.linkedBrowser.contentTitle;
+      result.url = browser.currentURI.spec;
+      if (browser.contentTitle) {
+        result.title = browser.contentTitle;
       }
       let icon = window.gBrowser.getIcon(tab);
       if (icon) {
         result.favIconUrl = icon;
       }
     }
 
     return result;
--- a/browser/components/extensions/test/browser/browser_ext_tabs_events.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_events.js
@@ -154,8 +154,85 @@ add_task(function* testTabEvents() {
 
     background,
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs-events");
   yield extension.unload();
 });
+
+add_task(function* testTabEventsSize() {
+  function background() {
+    function sendSizeMessages(tab, type) {
+      browser.test.sendMessage(`${type}-dims`, {width: tab.width, height: tab.height});
+    }
+
+    browser.tabs.onCreated.addListener(tab => {
+      sendSizeMessages(tab, "on-created");
+    });
+
+    browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
+      if (tab.status == "complete") {
+        sendSizeMessages(tab, "on-updated");
+      }
+    });
+
+    browser.test.onMessage.addListener((msg, arg) => {
+      if (msg === "create-tab") {
+        browser.tabs.create({url: "http://example.com/"}).then(tab => {
+          sendSizeMessages(tab, "create");
+          browser.test.sendMessage("created-tab-id", tab.id);
+        });
+      } else if (msg === "update-tab") {
+        browser.tabs.update(arg, {url: "http://example.org/"}).then(tab => {
+          sendSizeMessages(tab, "update");
+        });
+      } else if (msg === "remove-tab") {
+        browser.tabs.remove(arg);
+        browser.test.sendMessage("tab-removed");
+      }
+    });
+
+    browser.test.sendMessage("ready");
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["tabs"],
+    },
+    background,
+  });
+
+  const RESOLUTION_PREF = "layout.css.devPixelsPerPx";
+  registerCleanupFunction(() => {
+    SpecialPowers.clearUserPref(RESOLUTION_PREF);
+  });
+
+  function checkDimensions(dims, type) {
+    is(dims.width, gBrowser.selectedBrowser.clientWidth, `tab from ${type} reports expected width`);
+    is(dims.height, gBrowser.selectedBrowser.clientHeight, `tab from ${type} reports expected height`);
+  }
+
+  yield Promise.all([extension.startup(), extension.awaitMessage("ready")]);
+
+  for (let resolution of [2, 1]) {
+    SpecialPowers.setCharPref(RESOLUTION_PREF, String(resolution));
+    is(window.devicePixelRatio, resolution, "window has the required resolution");
+
+    extension.sendMessage("create-tab");
+    let tabId = yield extension.awaitMessage("created-tab-id");
+
+    checkDimensions(yield extension.awaitMessage("create-dims"), "create");
+    checkDimensions(yield extension.awaitMessage("on-created-dims"), "onCreated");
+
+    extension.sendMessage("update-tab", tabId);
+
+    checkDimensions(yield extension.awaitMessage("update-dims"), "update");
+    checkDimensions(yield extension.awaitMessage("on-updated-dims"), "onUpdated");
+
+    extension.sendMessage("remove-tab", tabId);
+    yield extension.awaitMessage("tab-removed");
+  }
+
+  yield extension.unload();
+  SpecialPowers.clearUserPref(RESOLUTION_PREF);
+});
--- a/browser/components/extensions/test/browser/browser_ext_tabs_query.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_query.js
@@ -127,19 +127,58 @@ add_task(function* () {
       });
     },
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs.query");
   yield extension.unload();
 
+  // test width and height
+  extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["tabs"],
+    },
+
+    background: function() {
+      browser.test.onMessage.addListener((msg) => {
+        browser.tabs.query({active: true}).then(tabs => {
+          browser.test.assertEq(tabs.length, 1, "should have one tab");
+          browser.test.sendMessage("dims", {width: tabs[0].width, height: tabs[0].height});
+        });
+      });
+      browser.test.sendMessage("ready");
+    },
+  });
+
+  const RESOLUTION_PREF = "layout.css.devPixelsPerPx";
+  registerCleanupFunction(() => {
+    SpecialPowers.clearUserPref(RESOLUTION_PREF);
+  });
+
+  yield Promise.all([extension.startup(), extension.awaitMessage("ready")]);
+
+  for (let resolution of [2, 1]) {
+    SpecialPowers.setCharPref(RESOLUTION_PREF, String(resolution));
+    is(window.devicePixelRatio, resolution, "window has the required resolution");
+
+    let {clientHeight, clientWidth} = gBrowser.selectedBrowser;
+
+    extension.sendMessage("check-size");
+    let dims = yield extension.awaitMessage("dims");
+    is(dims.width, clientWidth, "tab reports expected width");
+    is(dims.height, clientHeight, "tab reports expected height");
+  }
+
+  yield extension.unload();
+
   yield BrowserTestUtils.removeTab(tab1);
   yield BrowserTestUtils.removeTab(tab2);
   yield BrowserTestUtils.removeTab(tab3);
+  SpecialPowers.clearUserPref(RESOLUTION_PREF);
 });
 
 add_task(function* testQueryPermissions() {
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "permissions": [],
     },