Bug 1240326 - Part 2: Utilize lazyWidth and lazyHeight properties from frame loaders for tab width and height. r?kmag
MozReview-Commit-ID: FI41LGDrFFK
--- 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": [],
},