Bug 1015516 - Save closedTabs when saving session to disk. r=bnicholson

This commit is contained in:
vivek 2014-12-17 20:06:50 +02:00
Родитель d17a17e989
Коммит 092f4014ef
3 изменённых файлов: 32 добавлений и 21 удалений

Просмотреть файл

@ -1650,6 +1650,7 @@ public abstract class GeckoApp
// updated before Gecko has restored.
if (mShouldRestore) {
final JSONArray tabs = new JSONArray();
final JSONObject windowObject = new JSONObject();
SessionParser parser = new SessionParser() {
@Override
public void onTabRead(SessionTab sessionTab) {
@ -1670,6 +1671,11 @@ public abstract class GeckoApp
}
tabs.put(tabObject);
}
@Override
public void onClosedTabsRead(final JSONArray closedTabData) throws JSONException {
windowObject.put("closedTabs", closedTabData);
}
};
if (mPrivateBrowsingSession == null) {
@ -1679,7 +1685,8 @@ public abstract class GeckoApp
}
if (tabs.length() > 0) {
sessionString = new JSONObject().put("windows", new JSONArray().put(new JSONObject().put("tabs", tabs))).toString();
windowObject.put("tabs", tabs);
sessionString = new JSONObject().put("windows", new JSONArray().put(windowObject)).toString();
} else {
throw new SessionRestoreException("No tabs could be read from session file");
}
@ -1688,7 +1695,6 @@ public abstract class GeckoApp
JSONObject restoreData = new JSONObject();
restoreData.put("sessionString", sessionString);
return restoreData.toString();
} catch (JSONException e) {
throw new SessionRestoreException(e);
}

Просмотреть файл

@ -52,6 +52,15 @@ public abstract class SessionParser {
abstract public void onTabRead(SessionTab tab);
/**
* Placeholder method that must be overloaded to handle closedTabs while parsing session data.
*
* @param closedTabs, JSONArray of recently closed tab entries.
* @throws JSONException
*/
public void onClosedTabsRead(final JSONArray closedTabs) throws JSONException{
}
public void parse(String... sessionStrings) {
final LinkedList<SessionTab> sessionTabs = new LinkedList<SessionTab>();
int totalCount = 0;
@ -61,6 +70,10 @@ public abstract class SessionParser {
final JSONObject window = new JSONObject(sessionString).getJSONArray("windows").getJSONObject(0);
final JSONArray tabs = window.getJSONArray("tabs");
final int optSelected = window.optInt("selected", -1);
final JSONArray closedTabs = window.optJSONArray("closedTabs");
if (closedTabs != null) {
onClosedTabsRead(closedTabs);
}
for (int i = 0; i < tabs.length(); i++) {
final JSONObject tab = tabs.getJSONObject(i);

Просмотреть файл

@ -434,6 +434,10 @@ SessionStore.prototype = {
normalWin[prop] = data[prop];
}
normalWin.tabs = [];
// Save normal closed tabs. Forget about private closed tabs.
normalWin.closedTabs = win.closedTabs.filter(tab => !tab.isPrivate);
normalData.windows.push(normalWin);
privateData.windows.push({ tabs: [] });
@ -865,6 +869,11 @@ SessionStore.prototype = {
tab.browser.__SS_extdata = tabData.extData;
}
// Restore the closed tabs array on the current window.
if (state.windows[0].closedTabs) {
this._windows[window.__SSID].closedTabs = state.windows[0].closedTabs;
}
},
getClosedTabCount: function ss_getClosedTabCount(aWindow) {
@ -994,26 +1003,9 @@ SessionStore.prototype = {
let notifyMessage = "";
try {
// Normally, we'll receive the session string from Java, but there are
// cases where we may want to restore that Java cannot detect (e.g., if
// browser.sessionstore.resume_session_once is true). In these cases, the
// session will be read from sessionstore.bak (which is also used for
// "tabs from last time").
let data = aSessionString;
if (data == null) {
let bytes = yield OS.File.read(this._sessionFileBackup.path);
data = JSON.parse(new TextDecoder().decode(bytes) || "");
}
this._restoreWindow(data);
this._restoreWindow(aSessionString);
} catch (e) {
if (e instanceof OS.File.Error) {
Cu.reportError("SessionStore: " + e.message);
} else {
Cu.reportError("SessionStore: " + e);
}
Cu.reportError("SessionStore: " + e);
notifyMessage = "fail";
}