Bug 1365562 - Ensure that SessionStore is initialized before any interaction via WebExtension APIs, r=mixedpuppy

Awaiting the resolution of SessionStore.promiseInitialized as the first step in each API method that needs to interact with SessionStore.
As I needed to await a promise, took the opportunity to migrate the entire file to async/await.

MozReview-Commit-ID: 3ovavDHimhj
This commit is contained in:
Bob Silverberg
2017-05-24 09:26:16 -04:00
parent 1feb20e4e3
commit 77f15c8cfe

View File

@@ -3,6 +3,7 @@
"use strict";
var {
ExtensionError,
promiseObserved,
} = ExtensionUtils;
@@ -37,19 +38,18 @@ function getRecentlyClosed(maxResults, extension) {
return recentlyClosed.slice(0, maxResults);
}
function createSession(restored, extension, sessionId) {
async function createSession(restored, extension, sessionId) {
if (!restored) {
return Promise.reject({message: `Could not restore object using sessionId ${sessionId}.`});
throw new ExtensionError(`Could not restore object using sessionId ${sessionId}.`);
}
let sessionObj = {lastModified: Date.now()};
if (restored instanceof Ci.nsIDOMChromeWindow) {
return promiseObserved("sessionstore-single-window-restored", subject => subject == restored).then(() => {
sessionObj.window = extension.windowManager.convert(restored, {populate: true});
return Promise.resolve(sessionObj);
});
await promiseObserved("sessionstore-single-window-restored", subject => subject == restored);
sessionObj.window = extension.windowManager.convert(restored, {populate: true});
return sessionObj;
}
sessionObj.tab = extension.tabManager.convert(restored);
return Promise.resolve(sessionObj);
return sessionObj;
}
this.sessions = class extends ExtensionAPI {
@@ -57,12 +57,14 @@ this.sessions = class extends ExtensionAPI {
let {extension} = context;
return {
sessions: {
getRecentlyClosed: function(filter) {
async getRecentlyClosed(filter) {
await SessionStore.promiseInitialized;
let maxResults = filter.maxResults == undefined ? this.MAX_SESSION_RESULTS : filter.maxResults;
return Promise.resolve(getRecentlyClosed(maxResults, extension));
return getRecentlyClosed(maxResults, extension);
},
forgetClosedTab: function(windowId, sessionId) {
async forgetClosedTab(windowId, sessionId) {
await SessionStore.promiseInitialized;
let window = context.extension.windowManager.get(windowId).window;
let closedTabData = SessionStore.getClosedTabData(window, false);
@@ -71,14 +73,14 @@ this.sessions = class extends ExtensionAPI {
});
if (closedTabIndex < 0) {
return Promise.reject({message: `Could not find closed tab using sessionId ${sessionId}.`});
throw new ExtensionError(`Could not find closed tab using sessionId ${sessionId}.`);
}
SessionStore.forgetClosedTab(window, closedTabIndex);
return Promise.resolve();
},
forgetClosedWindow: function(sessionId) {
async forgetClosedWindow(sessionId) {
await SessionStore.promiseInitialized;
let closedWindowData = SessionStore.getClosedWindowData(false);
let closedWindowIndex = closedWindowData.findIndex((closedWindow) => {
@@ -86,14 +88,14 @@ this.sessions = class extends ExtensionAPI {
});
if (closedWindowIndex < 0) {
return Promise.reject({message: `Could not find closed window using sessionId ${sessionId}.`});
throw new ExtensionError(`Could not find closed window using sessionId ${sessionId}.`);
}
SessionStore.forgetClosedWindow(closedWindowIndex);
return Promise.resolve();
},
restore: function(sessionId) {
async restore(sessionId) {
await SessionStore.promiseInitialized;
let session, closedId;
if (sessionId) {
closedId = sessionId;