diff --git a/_locales/en/messages.json b/_locales/en/messages.json
new file mode 100644
index 0000000..1fd8eb3
--- /dev/null
+++ b/_locales/en/messages.json
@@ -0,0 +1,5 @@
+{
+ "test": {
+ "message": "Restore in new window"
+ }
+}
\ No newline at end of file
diff --git a/data/home/home.js b/data/home/home.js
index 87656c9..31ef313 100644
--- a/data/home/home.js
+++ b/data/home/home.js
@@ -15,7 +15,7 @@ function load() {
bullets = document.getElementById('bullets');
tooltip = document.getElementById('tooltip');
- bullets.addEventListener('mouseleave', function(e) {
+ bullets.addEventListener('mouseleave', function() {
tooltip.removeAttribute('active');
});
@@ -47,17 +47,20 @@ var initTutorial = function initTutorial() {
size = TutorialEntries.init();
initCarousel();
- updateActiveBullet(bullets.firstElementChild);
+ updateActiveBullet(bullets.firstElementChild.firstElementChild);
};
function updateActiveBullet(node) {
- console.log(node);
if (activeBullet) {
activeBullet.removeAttribute('active');
}
+
activeBullet = node;
- activeBullet.setAttribute('active', '');
+
+ if (activeBullet) {
+ activeBullet.setAttribute('active', '');
+ }
}
function setCarouselTo(index)
@@ -80,13 +83,13 @@ function advanceCarousel(offset)
}
Carousel.style.left = -position + '%';
Carousel.setAttribute('advance', position);
- updateActiveBullet(offset > 0 ? activeBullet.nextElementSibling : activeBullet.previousElementSibling);
+ updateActiveBullet(TutorialEntries.getEntryByIndex(position / 100).bullet);
}
function initCarousel()
{
- var moveLeft = document.getElementById("scroll-left");
- var moveRight = document.getElementById("scroll-right");
+ var moveLeft = document.getElementById('scroll-left');
+ var moveRight = document.getElementById('scroll-right');
moveLeft.addEventListener('click', advanceCarousel.bind(null, -100));
moveRight.addEventListener('click', advanceCarousel.bind(null, 100));
@@ -120,16 +123,16 @@ function HelpEntry(options)
// Bullet
var reference = document.createElement('a');
- reference.href = '#' + options.info;
+ reference.href = '#' + options.key;
var bullet = document.createElement('div');
bullet.className = 'bullet';
bullet.setAttribute('left', options.index);
bullet.setAttribute('tooltip', options.title);
- bullet.addEventListener('click', function(e) {
+ bullet.addEventListener('click', function() {
setCarouselTo(options.index);
});
- bullet.addEventListener('mouseover', function(e) {
+ bullet.addEventListener('mouseover', function() {
var pos = bullet.getBoundingClientRect();
tooltip.setAttribute('active', '');
tooltip.style.left = pos.x + pos.width / 2 + 'px';
@@ -224,6 +227,7 @@ var TutorialEntries = (function TutorialEntries()
bullets.appendChild(entry.link);
index++;
});
+ return entryList.length;
}
function getEntryByKey(key) {
diff --git a/data/lazy/lazy.html b/data/lazy/lazy.html
index 82ccc2f..5ea1717 100644
--- a/data/lazy/lazy.html
+++ b/data/lazy/lazy.html
@@ -18,7 +18,7 @@
If the page was not loaded automatically please check that lazy loading is enabled in addon configuration panel.
-
Firefox Addon API prevents loading certain URL types. This is not an addon issue.
+
Sadly, Firefox Addon API prevents loading certain URL types. This is not an addon issue but and API limitation.
- chrome: URLs
- javascript: URLs
diff --git a/data/scripts/components/config-panel.js b/data/scripts/components/config-panel.js
index 049dd2e..8d3862e 100644
--- a/data/scripts/components/config-panel.js
+++ b/data/scripts/components/config-panel.js
@@ -160,6 +160,14 @@ define(function(require, exports) {
offState: 'Disabled',
});
+ ToggleOptionConfig({
+ parent: section,
+ name: 'Reverse restore order',
+ key: 'restore.reverse.order',
+ onState: 'Enabled',
+ offState: 'Disabled',
+ });
+
})();
// ------------------------
diff --git a/data/scripts/components/session-bookmark.js b/data/scripts/components/session-bookmark.js
index 5854e72..686ea34 100644
--- a/data/scripts/components/session-bookmark.js
+++ b/data/scripts/components/session-bookmark.js
@@ -313,12 +313,10 @@ define(function(require, exports) {
}
else
{
- var targeType = getTargetType(e);
- if (targeType === 'folder')
+ if (getTargetType(e) === 'folder')
{
var sessionID = getSessionID(e);
if (sessionID != null && SessionSyncModel.bookmarks[sessionID] != undefined) {
- console.log(e.target, sessionID, bookmarkContext);
SessionSyncModel.moveBookmarkTo(bookmarkContext.bookmarkID, sessionID);
}
}
@@ -330,7 +328,8 @@ define(function(require, exports) {
let tabID = getTabID(e);
let tabContext = SyncModel.tabs[tabID];
- if (tabContext) {
+ if (tabContext)
+ {
if (tabContext != bookmarkContext)
{
SessionManager.moveTab(bookmarkContext.tab.id, tabContext.tab.index, tabContext.tab.windowId);
@@ -346,6 +345,21 @@ define(function(require, exports) {
}
}
}
+ else
+ {
+ if (getTargetType(e) === 'folder')
+ {
+ var savingSessionID = getSessionID(e);
+ if (savingSessionID != null) {
+ BookmarkManager.createBookmarkFromTab(bookmarkContext.tab, savingSessionID)
+ .then(function() {
+ WindowEvents.emit(document, 'Notification', {
+ message: 'Saved',
+ });
+ });
+ }
+ }
+ }
}
}
diff --git a/data/scripts/components/session-folder.js b/data/scripts/components/session-folder.js
index 39ceb4c..5598c01 100644
--- a/data/scripts/components/session-folder.js
+++ b/data/scripts/components/session-folder.js
@@ -256,10 +256,16 @@ define(function(require, exports) {
var folderContextMenu = function folderContextMenu(e)
{
- WindowEvents.emit(document, 'SessionContextMenu-Open', {
- context: bookmarkContext.bookmark.id,
- event: e
- });
+ if (bookmarkContext)
+ {
+ WindowEvents.emit(document, 'SessionContextMenu-Open', {
+ context: bookmarkContext.bookmark.id,
+ event: e
+ });
+ }
+ else {
+ WindowEvents.emit(document, 'SessionListMenu-Open', { event: e });
+ }
};
var sessionDblClick = function sessionDblClick(e)
diff --git a/data/scripts/components/session-header-bar.js b/data/scripts/components/session-header-bar.js
index f3389fd..08a5332 100644
--- a/data/scripts/components/session-header-bar.js
+++ b/data/scripts/components/session-header-bar.js
@@ -187,7 +187,29 @@ define(function(require, exports) {
// ------------------------------------------------------------------------
// Dev actions
- if (AppConfig.devMode())
+
+ var DebugMode = {
+ init: AppConfig.devMode(),
+ manualTrigger: 0,
+ triggerDate: new Date(),
+ action : function () {
+ if (this.init == false)
+ {
+ if (new Date() - this.triggerDate < 5000) {
+ this.manualTrigger++;
+ if (this.manualTrigger > 10) {
+ this.init = true;
+ initDevMode();
+ }
+ }
+ else {
+ this.manualTrigger = 0;
+ }
+ }
+ }
+ };
+
+ function initDevMode()
{
var devMenu = DomElem('div', {class: 'menu-row'});
@@ -233,6 +255,8 @@ define(function(require, exports) {
menuArea.appendChild(devMenu);
}
+ if (AppConfig.devMode())
+ initDevMode();
// ------------------------------------------------------------------------
// Events
@@ -259,6 +283,8 @@ define(function(require, exports) {
if (newState == 1) {
document.addEventListener('click', closeOnMiss);
}
+
+ DebugMode.action();
}
});
diff --git a/data/scripts/config.js b/data/scripts/config.js
index 6650f63..7d04237 100644
--- a/data/scripts/config.js
+++ b/data/scripts/config.js
@@ -66,6 +66,7 @@ define(function(require, exports) {
getConfigValue('bookmark.click.newTab', false);
getConfigValue('bookmark.middleClick.newTab', true);
getConfigValue('restore.lazy.loading', true);
+ getConfigValue('restore.reverse.order', false);
// General settings
getConfigValue('context.menu.icons', true);
diff --git a/data/scripts/session-sync-ui.js b/data/scripts/session-sync-ui.js
index 8f104ab..1b10ba9 100644
--- a/data/scripts/session-sync-ui.js
+++ b/data/scripts/session-sync-ui.js
@@ -143,6 +143,10 @@ define(function(require, exports) {
SM.addMenuEntry({value: 'Create new session', callback: SessionManager.createNewSession, icon: 'new-session', separator: 'top'});
content.appendChild(SM.DOMRoot);
+ var SLM = new ContextMenu({name : 'SessionListMenu'});
+ SLM.addMenuEntry({value: 'Create new session', callback: SessionManager.createNewSession, icon: 'new-session'});
+ content.appendChild(SLM.DOMRoot);
+
// History List Context Menu
var confirmDeleteAll = function confirmDeleteAll(context, event)
{
diff --git a/data/scripts/session/management.js b/data/scripts/session/management.js
index 52697df..4ed137d 100644
--- a/data/scripts/session/management.js
+++ b/data/scripts/session/management.js
@@ -24,6 +24,14 @@ define(function(require, exports) {
});
};
+ var getWindowTab = function getWindowTab(tabIndex, windowId, callback)
+ {
+ browser.tabs.query({index: tabIndex, windowId: windowId})
+ .then(function(tabs) {
+ callback(tabs[0]);
+ });
+ };
+
var getCurrentWindow = function getCurrentWindow(callback) {
browser.windows.getCurrent({ populate: true })
.then(callback);
@@ -92,6 +100,7 @@ define(function(require, exports) {
var sessionTitle = (new Date()).toLocaleString();
saveWindowSession(mozWindow, sessionTitle, function onSuccess(folder) {
sessionID = folder.id;
+ sessionCount++;
updateOnSave();
});
}
@@ -302,6 +311,7 @@ define(function(require, exports) {
activateTab: activateTab,
tabTracking: tabTracking,
activateWindow: activateWindow,
+ getWindowTab: getWindowTab,
getCurrentTab: getCurrentTab,
getCurrentWindow: getCurrentWindow,
getAllWindows: getAllWindows,
diff --git a/data/scripts/utils/field-edit-widget.js b/data/scripts/utils/field-edit-widget.js
index 3547a3c..186baaa 100644
--- a/data/scripts/utils/field-edit-widget.js
+++ b/data/scripts/utils/field-edit-widget.js
@@ -103,6 +103,7 @@ define(function(require, exports) {
document.addEventListener('keydown', keyBoardShortcut);
WindowEvents.emit(document, 'FieldWidgetInvoked', widgetID);
first_field.focus();
+ first_field.select();
}
function saveValues()
diff --git a/manifest.json b/manifest.json
index a9ba972..3406eba 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,6 +1,6 @@
{
"name": "Session Sync",
- "version": "3.1.0",
+ "version": "3.1.3beta",
"author": "Gabriel Ivanica",
"description": "Save sessions as bookmarks and sync them through Firefox Sync (or any other sync engine).\nPowerful session management - organize, edit, change, save, restore, etc\n",
"homepage_url": "https://github.com/ReDEnergy/SessionSync",
diff --git a/package.json b/package.json
index e9180ec..4b4336b 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "session-sync",
"author": "Gabriel Ivanica",
"url": "https://github.com/ReDEnergy/SessionSync",
- "version": "3.0.1",
+ "version": "3.1.1",
"description": "Save sessions as bookmarks and sync them through any sync engine.\nManage sessions, edit, save, restore.\nSession-Sync will automatically update sessions across multiple machines",
"license": "MPL-2.0",
"devDependencies": {
diff --git a/scripts/favicon-service.js b/scripts/favicon-service.js
index 309304f..17da074 100644
--- a/scripts/favicon-service.js
+++ b/scripts/favicon-service.js
@@ -62,13 +62,8 @@ var FaviconService = (function FaviconService() {
{
if (tab.favIconUrl)
{
- if (tab.favIconUrl.startsWith('data:image'))
- {
- return;
- }
-
getFaviconUrl(tab.url, function (value) {
- if (value === undefined) {
+ if (value === undefined || tab.url != value) {
var key = '@favIconUrl:' + getHostName(tab.url);
setFaviconUrl(key, tab.favIconUrl)
}
diff --git a/scripts/main.js b/scripts/main.js
index 818faf3..e149729 100644
--- a/scripts/main.js
+++ b/scripts/main.js
@@ -10,8 +10,8 @@ var Commands = {
};
browser.runtime.onInstalled.addListener(function (startInfo) {
- if (startInfo.reason === 'install') {
- checkEvent(Commands.openTutorial);
+ if (startInfo.reason == 'install') {
+ SessionSync.checkEvent(Commands.openTutorial);
}
});
diff --git a/scripts/session-management.js b/scripts/session-management.js
index 3fd24a7..ef18705 100644
--- a/scripts/session-management.js
+++ b/scripts/session-management.js
@@ -4,10 +4,12 @@ var SessionManagement = (function SessionManagement()
{
var lazyLoadingKey = 'restore.lazy.loading';
var lazyLoadingUrl = browser.extension.getURL('data/lazy/lazy.html');
- var lazyLoadingHost = lazyLoadingUrl.substr(16, 8);
var lazyLoading = false;
var windowsTabsToKill = [];
+ var reverseOrderKey = 'restore.reverse.order';
+ var reverseOrder = false;
+
function getLazyLoadingParameters(url)
{
let paramater = {};
@@ -41,12 +43,18 @@ var SessionManagement = (function SessionManagement()
}
};
- var retriveLazyLoadingState = function retriveLazyLoadingState()
+ var initConfig = function initConfig()
{
browser.storage.local.get(lazyLoadingKey)
.then(function (obj) {
setLazyLoading(obj[lazyLoadingKey]);
});
+
+ browser.storage.local.get(reverseOrderKey)
+ .then(function (obj) {
+ reverseOrder = obj[reverseOrderKey] == true;
+ console.log('reverseOrder', reverseOrder);
+ });
};
var openTab = function openTab(options)
@@ -135,6 +143,14 @@ var SessionManagement = (function SessionManagement()
}
};
+ var checkReverseOrder = function checkReverseOrder(bookmarks)
+ {
+ if (reverseOrder === true)
+ {
+ bookmarks = bookmarks.reverse();
+ }
+ };
+
var restoreSession = function restoreSession(folderID, newWindow)
{
browser.bookmarks.getChildren(folderID)
@@ -146,6 +162,7 @@ var SessionManagement = (function SessionManagement()
}
else
{
+ checkReverseOrder(bookmarks);
bookmarks.forEach(function (bookmark) {
if (lazyLoading)
@@ -181,6 +198,7 @@ var SessionManagement = (function SessionManagement()
var windowID = mozWindow.id;
windowsTabsToKill[windowID] = mozWindow.tabs[0].id;
+ checkReverseOrder(bookmarks);
bookmarks.forEach(function (bookmark) {
if (lazyLoading)
{
@@ -231,6 +249,9 @@ var SessionManagement = (function SessionManagement()
{
restoreLazyTab(activeTab);
}
+ else if (activeTab.status == 'loading') {
+ restoreLazyTab(activeTab, activeTab.title);
+ }
});
}
};
@@ -261,6 +282,9 @@ var SessionManagement = (function SessionManagement()
if (object[lazyLoadingKey]) {
setLazyLoading(object[lazyLoadingKey].newValue);
}
+ if (object[reverseOrderKey]) {
+ reverseOrder = object[reverseOrderKey].newValue == true;
+ }
});
browser.tabs.onCreated.addListener(function (tab) {
@@ -276,7 +300,7 @@ var SessionManagement = (function SessionManagement()
// ************************************************************************
// Init
- retriveLazyLoadingState();
+ initConfig();
// ************************************************************************
// Public API