1
0
mirror of https://github.com/MatMoul/quickdial-webext.git synced 2025-12-15 16:33:13 +00:00

45 Commits

Author SHA1 Message Date
d8620464a3 Version 0.1.10 2017-11-19 01:05:43 +01:00
1a71f96a91 Feature disabled: Auto ratio dont provide a stable solution 2017-11-19 00:56:00 +01:00
45f7e60fb8 Improvement: Invert Ratio X,Y field in settings 2017-11-18 23:59:39 +01:00
190d54a0f1 Bug: Settings page save problem 2017-11-18 23:47:05 +01:00
05a78e2d63 Feature: Add custom ratio settings 2017-11-18 23:16:49 +01:00
1ba60232f2 Version 0.1.9 2017-11-18 01:42:13 +01:00
eaf451c957 Code: Remove TODO, look now at issue 2017-11-18 01:02:32 +01:00
b2bb50d95e Feature: Add snapshot delay setting 2017-11-18 00:17:36 +01:00
a9a4212299 Improvement: Tile and snapshot relative to grid size 2017-11-18 00:06:49 +01:00
7b0ac506d8 Bug: Transparent hover tile background doesn't has effect 2017-11-17 23:34:44 +01:00
93a384b765 Version 0.1.8 2017-11-12 20:26:12 +01:00
6cad651ee4 Improvement: Update default title height 2017-11-12 19:48:30 +01:00
178627aa51 Project: Update git ignore 2017-11-12 17:04:00 +01:00
0eae0a9919 Project: Update build scripts 2017-11-12 16:46:24 +01:00
66418995b8 Project: Update build scripts 2017-11-12 16:39:37 +01:00
17739110ff Bug: Updating bookmark url don't refresh tile 2017-11-12 16:13:13 +01:00
a64561835c Bug: Prevent drag drop from unmanaged data 2017-11-12 16:03:01 +01:00
0be3f1df96 Bug: Editing bookmark url don't update tile url 2017-11-12 15:01:26 +01:00
71df90fad4 Version 0.1.7 2017-11-11 15:53:28 +01:00
e300ae2142 Bug: Data not correclty upgraded 2017-11-11 15:34:34 +01:00
accb853a85 Bug: Tile instable when resizing to speed 2017-11-11 15:30:03 +01:00
2a12e35320 Data: Version upgrade 2017-11-11 15:10:58 +01:00
827680c906 Improvement: Handle Bookmark large change or restore 2017-11-11 14:19:41 +01:00
dedd421b85 Feature: Add stretch mode to each tiles 2017-11-11 02:59:25 +01:00
f3285e790d Feature: Add stretch mode for back and folder icon 2017-11-11 01:13:34 +01:00
2aebed015f Feature: Add stretch mode for back and folder icon 2017-11-11 01:11:08 +01:00
07dfa858e8 Feature: Add stretch mode for background 2017-11-11 00:44:56 +01:00
5e07132316 Improvement: Bookmarks sync 2017-11-10 23:40:13 +01:00
63c06fe5a5 Improvement: Bookmarks sync 2017-11-10 23:32:53 +01:00
dd95e95b20 Improvement: Update bookmark when setting tile parameters 2017-11-10 22:48:12 +01:00
7f719497dc Feature Disabled: Capture here has too poor quality 2017-11-10 22:26:42 +01:00
1592569ada Feature: Add support of default and hover state of all properties 2017-11-10 21:56:36 +01:00
3156068ca7 Improvement: Add limit to input number 2017-11-10 20:55:12 +01:00
1a608b634f Feature: Add opacity setting for tiles 2017-11-10 20:45:52 +01:00
356bf74e8d Feature: Add border size setting for tiles 2017-11-10 20:34:19 +01:00
0b59809758 Version 0.1.6 2017-11-03 21:21:12 +01:00
f387c3662f Feature: Add page up and page down to change page 2017-11-03 21:11:57 +01:00
dbbf5ff718 Feature: Add page up and page down to change page 2017-11-03 21:02:57 +01:00
33c227a5a4 Merge branch 'patch-1' of https://github.com/Alexey71/quickdial-webext into Alexey71-patch-1 2017-11-03 20:54:11 +01:00
351d043094 Improvement: Limit sync bookmark surcharge 2017-11-03 20:52:41 +01:00
Alexey
b99ee356f0 Add Russian string 2017-11-01 15:35:47 +03:00
340a84730e Merge pull request #22 from mrprobot/develop
add german translation
2017-10-26 21:10:41 +02:00
mrprobot
ddd57dd446 add german translation 2017-10-25 13:04:20 +02:00
mrprobot
4a510a1a86 add german translation 2017-10-25 12:55:37 +02:00
170b1a7dc6 Improvement: Add new capture method (Capture here) 2017-10-22 16:36:06 +02:00
15 changed files with 703 additions and 69 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
**/src.zip
/*.zip

5
TODO
View File

@@ -1,5 +0,0 @@
Create style for popup
Add a visual hint for multipage
Need a best solution to update folder and bookmark when it are updated from Firefox
Improve screenshot result
Add favicon support

43
makebeta Executable file
View File

@@ -0,0 +1,43 @@
#!/bin/bash
if [ "$1" == "" ]; then
echo "Error: No version provided"
echo "./makebeta 0.0.1b1"
exit 1
fi
clear
branch=$(git rev-parse --abbrev-ref HEAD)
read -p "Current branch is $branch. Continue ? (y/N)" choice
case "$choice" in
n|N|'' )
echo "Cancel !"
exit 1
;;
y|Y ) echo "Make beta...";;
* )
echo "Cancel !"
exit 1
;;
esac
# Ready to update :
git branch beta
git checkout beta
version=$1
sed -i "/\"version\":/c\ \ \"version\": \"$version\"," src/manifest.json
git commit -a -m "Beta Version $version"
cd src
zip -r ../quickdial-beta-$version.zip . -x src.zip
cd ..
git checkout $branch
git branch -D beta

View File

@@ -46,3 +46,7 @@ git tag -a "v$version" -m "Version $version"
git push --tags
git checkout $branch
cd src
zip -r ../quickdial-$version.zip . -x src.zip
cd ..

View File

@@ -0,0 +1,72 @@
{
"extensionDescription": {
"message": "Quick Dial, eine Schnellwahl-Seite inspiriert von Fast Dial.",
"description": "Description of the extension."
},
"menuAddToQuickDial": {
"message": "Zu Quick Dial hinzufügen",
"description": "Text of add bookmark menu item."
},
"menuNew": {
"message": "Neu",
"description": "Text of new menu item."
},
"menuNewBookmark": {
"message": "Lesezeichen",
"description": "Text of add bookmark menu item."
},
"AddBookmarkPrompt": {
"message": "Neue Lesezeichen URL eingeben:",
"description": "Text of the add bookmark prompt."
},
"menuNewFolder": {
"message": "Ordner",
"description": "Text of add folder menu item."
},
"AddFolderPrompt": {
"message": "Neuen Ordner Namen eingeben:",
"description": "Text of the add folder prompt."
},
"menuProperties": {
"message": "Bearbeiten",
"description": "Text of properties menu item."
},
"menuRefreshItem": {
"message": "Neu laden",
"description": "Text of refresh menu item."
},
"menuCaptureHere": {
"message": "Hier aufnehmen",
"description": "Text of capture here menu item."
},
"menuCapturePage": {
"message": "In einem neuen Tab aufnehmen",
"description": "Text of capture menu item."
},
"menuDeleteItem": {
"message": "Löschen",
"description": "Text of delete menu item."
},
"deleteItemConfimation": {
"message": "Löschen $1?",
"description": "Text of delete confirmation."
},
"menuSettings": {
"message": "Quick Dial Einstellungen",
"description": "Text of settings menu item."
}
}

View File

@@ -44,6 +44,11 @@
"description": "Text of refresh menu item."
},
"menuCaptureHere": {
"message": "Capture here",
"description": "Text of capture here menu item."
},
"menuCapturePage": {
"message": "Capture in a new tab",
"description": "Text of capture menu item."

View File

@@ -44,6 +44,11 @@
"description": "Text of refresh menu item."
},
"menuCaptureHere": {
"message": "Capturer ici",
"description": "Text of capture here menu item."
},
"menuCapturePage": {
"message": "Capturer dans un nouvel onglet",
"description": "Text of capture menu item."

View File

@@ -0,0 +1,72 @@
{
"extensionDescription": {
"message": "Quick Dial, вдохновление умершим расширением Fast Dial.",
"description": "Description of the extension."
},
"menuAddToQuickDial": {
"message": "Добавить в Quick Dial",
"description": "Text of add bookmark menu item."
},
"menuNew": {
"message": "Добавить",
"description": "Text of new menu item."
},
"menuNewBookmark": {
"message": "Закладку",
"description": "Text of add bookmark menu item."
},
"AddBookmarkPrompt": {
"message": "Введите URL-адрес новой закладки:",
"description": "Text of the add bookmark prompt."
},
"menuNewFolder": {
"message": "Папку",
"description": "Text of add folder menu item."
},
"AddFolderPrompt": {
"message": "Введите имя новой папки:",
"description": "Text of the add folder prompt."
},
"menuProperties": {
"message": "Свойства",
"description": "Text of properties menu item."
},
"menuRefreshItem": {
"message": "Обновить",
"description": "Text of refresh menu item."
},
"menuCaptureHere": {
"message": "Захватить здесь",
"description": "Text of capture here menu item."
},
"menuCapturePage": {
"message": "Захватить на новой вкладке",
"description": "Text of capture menu item."
},
"menuDeleteItem": {
"message": "Удалить",
"description": "Text of delete menu item."
},
"deleteItemConfimation": {
"message": "Удалить $1?",
"description": "Text of delete confirmation."
},
"menuSettings": {
"message": "Настройки Quick Dial",
"description": "Text of settings menu item."
}
}

View File

@@ -44,6 +44,13 @@
<tr>
<td><span>Image :</span></td>
<td colspan="2">
<select id="ImageMode">
<option value="-1">Default</option>
<option value="0">Stretch</option>
<option value="1">Cover</option>
<option value="2">Contain</option>
<option value="3">Center</option>
</select>
<button id="ImageReset">Reset</button>
<button id="ImageDefault">Default</button>
<button class="hidden" id="ImageRefresh">Refresh</button>

View File

@@ -12,6 +12,7 @@
input[type=color] { width: 60px; }
.hidden { display: none; }
.Tab>table { width: 100%; border-collapse: collapse; }
.Tab>div { overflow: auto; }
.Tab .TabSpace { width: 100%; border-bottom: solid 1px #505050; }
.Tab .TabButton { border: solid 1px #505050; padding: 2px 6px 2px 6px; cursor: default; }
.Tab .TabButtonActive { border: solid 1px #505050; border-bottom: none; padding: 2px 6px 2px 6px; cursor: default; }
@@ -35,6 +36,17 @@
<td><span>Background Color :</span></td>
<td><input id="BackgroundColor" type="color"></td>
</tr>
<tr>
<td><span>Background Mode :</span></td>
<td>
<select id="BackgroundMode">
<option value="0">Stretch</option>
<option value="1">Cover</option>
<option value="2">Contain</option>
<option value="3">Center</option>
</select>
</td>
</tr>
<tr>
<td><span>Background Image :</span></td>
<td>
@@ -53,13 +65,20 @@
<tr>
<td><span>Rows x Columns :</span></td>
<td>
<input id="GridRows" type="number">
<input id="GridColumns" type="number">
<input id="GridRows" type="number" min="1">
<input id="GridColumns" type="number" min="1">
</td>
</tr>
<tr>
<td><span>Ratio (X/Y) :</span></td>
<td>
<input id="GridRatioX" type="number" min="1">
<input id="GridRatioY" type="number" min="1">
</td>
</tr>
<tr>
<td><span>Margins :</span></td>
<td><input id="GridMargins" type="number"></td>
<td><input id="GridMargins" type="number" min="0"></td>
</tr>
<tr>
<td><span>Back Button :</span></td>
@@ -70,12 +89,28 @@
<tr>
<td>
<div>Back :</div>
<div>
<select id="GridBackMode">
<option value="0">Stretch</option>
<option value="1">Cover</option>
<option value="2">Contain</option>
<option value="3">Center</option>
</select>
</div>
<button id="GridBackImageReset">Reset</button>
<input id="GridBackImageFile" type="file" style="width:220px;">
<div id="GridBackPreview" style="width: 220px; height: 150px; border: 1px solid #000000"></div>
</td>
<td>
<div>Folder :</div>
<div>
<select id="GridFolderMode">
<option value="0">Stretch</option>
<option value="1">Cover</option>
<option value="2">Contain</option>
<option value="3">Center</option>
</select>
</div>
<button id="GridFolderImageReset">Reset</button>
<input id="GridFolderImageFile" type="file" style="width:220px;">
<div id="GridFolderPreview" style="width: 220px; height: 150px; border: 1px solid #000000"></div>
@@ -98,13 +133,23 @@
</tr>
<tr>
<td><span>Margins :</span></td>
<td><input id="GridCellsMargins" type="number"></td>
<td><input id="GridCellsMarginsHover" type="number" style="display: none;"></td>
<td><input id="GridCellsMargins" type="number" min="0"></td>
<td><input id="GridCellsMarginsHover" type="number" min="0"></td>
</tr>
<tr>
<td><span>Opacity :</span></td>
<td><input id="GridCellsOpacity" type="number" min="0" max="100"></td>
<td><input id="GridCellsOpacityHover" type="number" min="0" max="100"></td>
</tr>
<tr>
<td><span>Border Size :</span></td>
<td><input id="GridCellsBorderSize" type="number" min="0"></td>
<td><input id="GridCellsBorderSizeHover" type="number" min="0"></td>
</tr>
<tr>
<td><span>Border Radius :</span></td>
<td><input id="GridCellsBorderRadius" type="number"></td>
<td><input id="GridCellsBorderRadiusHover" type="number"></td>
<td><input id="GridCellsBorderRadius" type="number" min="0"></td>
<td><input id="GridCellsBorderRadiusHover" type="number" min="0"></td>
</tr>
<tr>
<td><span>Background Transparent :</span></td>
@@ -124,17 +169,22 @@
<tr>
<td><span>Title :</span></td>
<td><input id="GridCellsTitle" type="checkbox"></td>
<td></td>
<td><input id="GridCellsTitleHover" type="checkbox"></td>
</tr>
<tr>
<td><span>Title Height :</span></td>
<td><input id="GridCellsTitleHeight" type="number"></td>
<td></td>
<td><input id="GridCellsTitleHeight" type="number" min="0"></td>
<td><input id="GridCellsTitleHeightHover" type="number" min="0"></td>
</tr>
<tr>
<td><span>Title Font Size :</span></td>
<td><input id="GridCellsTitleFontSize" type="number"></td>
<td></td>
<td><input id="GridCellsTitleFontSize" type="number" min="0"></td>
<td><input id="GridCellsTitleFontSizeHover" type="number" min="0"></td>
</tr>
<tr>
<td><span>Title Border Size :</span></td>
<td><input id="GridCellsTitleBorderSize" type="number" min="0"></td>
<td><input id="GridCellsTitleBorderSizeHover" type="number" min="0"></td>
</tr>
<tr>
<td><span>Title Text Color :</span></td>
@@ -151,6 +201,10 @@
<td><input id="GridCellsTitleBackgroundColor" type="color"></td>
<td><input id="GridCellsTitleBackgroundColorHover" type="color"></td>
</tr>
<tr>
<td><span>Snapshot Delay :</span></td>
<td colspan="2"><input id="GridCellsSnapshotDelay" type="number" min="300" max="10000"></td>
</tr>
</table>
</div>
</div>

View File

@@ -106,33 +106,48 @@ app.Settings.init = function(callback){ // Load settings and nodes
settings: {
backgroundColor: '#3c4048',
backgroundImage: null,
backgroundMode: 0,
grid: {
margin: 10,
rows: 4,
columns: 5,
ratioX: 4,
ratioY: 3,
backNode: true,
backIcon: 'url(/img/back.png)',
backIconMode: 3,
folderIcon: 'url(/img/folder.png)',
folderIconMode: 0,
loadingIcon: 'url(/img/throbber.gif)',
cells: {
margin: 4,
marginHover: 4,
opacity: 1,
opacityHover: 1,
backgroundColor: null,
backgroundColorHover: null,
borderColor: '#333333',
borderColorHover: '#a9a9a9',
borderRadius: 4,
borderRadiusHover: 4,
borderSize: 1,
borderSizeHover: 1,
title: true,
titleHover: true,
titleHeight: 16,
titleHeightHover: 16,
titleFontSize: 10,
titleFontSizeHover: 10,
titleFont: 'Arial, Verdana, Sans-serif',
titleColor: '#ffffff',
titleColorHover: '#33ccff',
titleBackgroundColor: null,
titleBackgroundColorHover: null,
titleBorderSize: 1,
titleBorderSizeHover: 1,
previewWidth: 1200,
previewHeight: 710
previewHeight: 710,
snapshotDelay: 2000
},
root: 'Quick Dial',
}
@@ -169,6 +184,35 @@ app.Settings.init = function(callback){ // Load settings and nodes
app.Settings.save();
});
}
if(data.version == 3){ // Upgrade Data Version
data.version = 4;
data.settings.backgroundMode = 0;
data.settings.grid.backIconMode = 3;
data.settings.grid.folderIconMode = 0;
data.settings.grid.cells.opacity = 1;
data.settings.grid.cells.opacityHover = 1;
data.settings.grid.cells.borderSize = 1;
data.settings.grid.cells.borderSizeHover = data.settings.grid.cells.borderSize;
data.settings.grid.cells.titleHover = data.settings.grid.cells.title;
data.settings.grid.cells.titleHeightHover = data.settings.grid.cells.titleHeight;
data.settings.grid.cells.titleFontSizeHover = data.settings.grid.cells.titleFontSize;
data.settings.grid.cells.titleBorderSize = 1;
data.settings.grid.cells.titleBorderSizeHover = data.settings.grid.cells.titleBorderSize;
app.Settings.save();
}
if(data.version == 4){ // Upgrade Data Version
if(!data.settings.grid.cells.snapshotDelay) data.settings.grid.cells.snapshotDelay = 2000;
if(data.settings.grid.ratioAuto == true || data.settings.grid.ratioAuto == false){
delete data.settings.grid.ratioAuto;
data.settings.grid.ratioX = 4;
data.settings.grid.ratioY = 3;
}
if(!data.settings.grid.ratioX){
data.settings.grid.ratioX = 4;
data.settings.grid.ratioY = 3;
}
//app.Settings.save();
}
app.settings = data.settings;
app.node = data.node;
if(callback) callback();
@@ -179,7 +223,7 @@ app.Settings.update = function(settings, callback){ // Save new settings
app.Settings.save(callback);
};
app.Settings.save = function(callback){ // Save settings
var data = { version: 3 };
var data = { version: 4 };
data.settings = app.settings;
data.node = app.node;
browser.storage.local.set(data).then(function(){
@@ -210,9 +254,19 @@ app.Bookmarks._onCreated = function(){ app.GridNodes.sync(app.node, app.settings
app.Bookmarks._onChanged = function(){ app.GridNodes.sync(app.node, app.settings.grid.root, function(){ browser.runtime.sendMessage({ cmd: app.Messages.Commands.gridNodesLoaded }); }); }
app.Bookmarks._onMoved = function(){ app.GridNodes.sync(app.node, app.settings.grid.root, function(){ browser.runtime.sendMessage({ cmd: app.Messages.Commands.gridNodesLoaded }); }); }
app.Bookmarks._onRemoved = function(){ app.GridNodes.sync(app.node, app.settings.grid.root, function(){ browser.runtime.sendMessage({ cmd: app.Messages.Commands.gridNodesLoaded }); }); }
app.Bookmarks._onImportBegan = function(){
browser.bookmarks.onCreated.removeListener(app.Bookmarks._onCreated);
browser.bookmarks.onChanged.removeListener(app.Bookmarks._onChanged);
browser.bookmarks.onMoved.removeListener(app.Bookmarks._onMoved);
browser.bookmarks.onRemoved.removeListener(app.Bookmarks._onRemoved);
}
app.Bookmarks._onImportEnded = function(){
app.GridNodes.sync(app.node, app.settings.grid.root, function(){ browser.runtime.sendMessage({ cmd: app.Messages.Commands.gridNodesLoaded }); });
app.Bookmarks.initListener();
}
app.Bookmarks.initListener = function(){ // (Called from app.init) (/!\ Need filter to root tree only) Init listener of bookmarks
browser.bookmarks.onCreated.addListener(app.Bookmarks._onCreated);
//browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
browser.bookmarks.onMoved.addListener(app.Bookmarks._onMoved);
browser.bookmarks.onRemoved.addListener(app.Bookmarks._onRemoved);
}
@@ -258,7 +312,8 @@ app.SiteInfos.fromNewTab = function(url, callback){ // Retrieve infos from a ne
imgObj.src = img;
var previewWidth = 1200; // Need to be linked to settings
var previewHeight = 710; // Need to be linked to settings
var previewHeight = previewWidth / app.settings.grid.ratioX * app.settings.grid.ratioY;
if(app.settings.grid.title == true) previewHeight -= app.settings.grid.titleHeight;
var canvas = document.createElement('canvas');
canvas.style.width = previewWidth.toString() + 'px';
@@ -287,7 +342,7 @@ app.SiteInfos.fromNewTab = function(url, callback){ // Retrieve infos from a ne
browser.tabs.remove(tab.id);
if(callback) callback();
});
}, 500);
}, app.settings.grid.cells.snapshotDelay);
}, function(){ if(callback) callback(); });
}
}, function(){ if(callback) callback(); });
@@ -324,7 +379,8 @@ app.SiteInfos.fromFrame = function(url, callback){ // Retrieve infos from an ifr
}
var previewWidth = 1200; // Need to be linked to settings
var previewHeight = 710; // Need to be linked to settings
var previewHeight = previewWidth / app.settings.grid.ratioX * app.settings.grid.ratioY;
if(app.settings.grid.title == true) previewHeight -= app.settings.grid.titleHeight;
var iframe;
var xmlHttp = new XMLHttpRequest();
xmlHttp.timeout = 10000
@@ -334,7 +390,7 @@ app.SiteInfos.fromFrame = function(url, callback){ // Retrieve infos from an ifr
iframe.width = previewWidth
iframe.height = previewHeight
iframe.style.position = 'absolute';
//iframe.style.visibility = 'hidden';
iframe.scrolling = 'no';
var content = xmlHttp.responseText.replace('<head>', '<head><base href="' + url + '">');
iframe.onload = function(){ pageLoaded(); }
document.body.appendChild(iframe);
@@ -345,8 +401,8 @@ app.SiteInfos.fromFrame = function(url, callback){ // Retrieve infos from an ifr
xmlHttp.onerror = function(){ if(callback) callback(); }
xmlHttp.ontimeout = function(){ if(callback) callback(); }
xmlHttp.send();
}
app.SiteInfos.fromWS = function(url, callback){ // Retrieve infos from a Web Service. callback( { url, title, (/!\ Not handled now)icon, screenshot } || error: callback() )
}
app.SiteInfos.fromWS = function(url, callback){ // Retrieve infos from a Web Service. callback( { url, title, (/!\ Not handled now)icon, screenshot } || error: callback() )
console.log('Not implemented');
return app.SiteInfos.fromFrame(url, callback);
}
@@ -359,13 +415,21 @@ app.GridNodes.GridNodeType = { // GridNodeType
bookmark: 2
}
app.GridNodes.sync = function(gridNode, rootPath, callback){ // Sync GridNodes with Bookmarks
if(app.GridNodes._syncing) {
app.GridNodes._needSync = true;
return;
}
app.GridNodes._syncing = true;
app.Bookmarks.load(rootPath, function(bookmarkItem){
function syncNode(gridNode, bookmarkItem){
gridNode.id = bookmarkItem.id;
if(!gridNode.title) gridNode.title = bookmarkItem.title;
gridNode.title = bookmarkItem.title;
if(bookmarkItem.url){
gridNode.type = app.GridNodes.GridNodeType.bookmark;
if(!gridNode.url) gridNode.url = bookmarkItem.url;
if(gridNode.url != bookmarkItem.url){
gridNode.url = bookmarkItem.url;
delete gridNode.image;
}
} else if(bookmarkItem.children){
gridNode.type = app.GridNodes.GridNodeType.folder;
var EmptyNodes = [];
@@ -414,8 +478,14 @@ app.GridNodes.sync = function(gridNode, rootPath, callback){ // Sync GridNodes w
}
syncNode(gridNode, bookmarkItem);
app.GridNodes.save();
if(callback) callback();
delete app.GridNodes._syncing;
if(app.GridNodes._needSync == true) {
delete app.GridNodes._needSync;
app.GridNodes.sync(gridNode, rootPath, callback);
} else {
app.GridNodes.save();
if(callback) callback();
}
});
}
app.GridNodes.save = function(callback){ // Save GridNodes
@@ -464,13 +534,34 @@ app.GridNodes.updateNode = function(gridNode, value, callback){
if(value.titleLocked!=null) gridNode.titleLocked = value.titleLocked;
if(value.image) gridNode.image = value.image;
else delete gridNode.image;
if(value.imageMode || value.imageMode == 0) {
if(value.imageMode == -1) delete gridNode.imageMode;
else gridNode.imageMode = value.imageMode;
}
if(gridNode.type == app.GridNodes.GridNodeType.bookmark && value.url && gridNode.url != value.url){
gridNode.url = value.url;
app.GridNodes.refreshNode(gridNode, function(){
browser.runtime.sendMessage({ cmd: app.Messages.Commands.gridNodesLoaded });
app.GridNodes.saveNode(gridNode);
var data = { title: gridNode.title };
//if(gridNode.imageMode) data.imageMode = gridNode.imageMode;
//if(gridNode.type == app.GridNodes.GridNodeType.bookmark) data.url = gridNode.url;
data.url = gridNode.url;
browser.bookmarks.onChanged.removeListener(app.Bookmarks._onChanged);
browser.bookmarks.update(gridNode.id, data).then(function(){
browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
});
});
} else {
browser.runtime.sendMessage({ cmd: app.Messages.Commands.gridNodesLoaded });
app.GridNodes.saveNode(gridNode);
var data = { title: gridNode.title };
//if(gridNode.imageMode) data.imageMode = gridNode.imageMode;
browser.bookmarks.onChanged.removeListener(app.Bookmarks._onChanged);
browser.bookmarks.update(gridNode.id, data).then(function(){
browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
});
}
app.GridNodes.saveNode(gridNode);
}
if(callback) callback(gridNode);
}
@@ -576,6 +667,12 @@ app.GridNodes.refreshNode = function(gridNode, callback){ // Refresh content of
delete gridNode.__isLoading;
app.GridNodes.saveNode(gridNode);
if(callback) callback({ title: gridNode.title, screenshot: gridNode.image });
/*
browser.bookmarks.onChanged.removeListener(app.Bookmarks._onChanged);
browser.bookmarks.update(gridNode.id, { title: gridNode.title }).then(function(){
browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
});
*/
break;
case app.GridNodes.GridNodeType.bookmark:
app.SiteInfos.fromFrame(gridNode.url, function(infos){
@@ -588,6 +685,10 @@ app.GridNodes.refreshNode = function(gridNode, callback){ // Refresh content of
delete gridNode.__isLoading;
app.GridNodes.saveNode(gridNode);
if(callback) callback(infos);
browser.bookmarks.onChanged.removeListener(app.Bookmarks._onChanged);
browser.bookmarks.update(gridNode.id, { title: gridNode.title, url: gridNode.url }).then(function(){
browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
});
});
break;
}
@@ -624,6 +725,10 @@ app.GridNodes.capturePage = function(gridNode, callback){
delete gridNode.__isLoading;
app.GridNodes.saveNode(gridNode);
if(callback) callback(infos);
browser.bookmarks.onChanged.removeListener(app.Bookmarks._onChanged);
browser.bookmarks.update(gridNode.id, { title: gridNode.title, url: gridNode.url }).then(function(){
browser.bookmarks.onChanged.addListener(app.Bookmarks._onChanged);
});
});
break;
}

View File

@@ -2,7 +2,8 @@ var utils = {};
var app = {};
var dial = {
page: 1,
maxpage: 1
maxpage: 1,
capture: 0
};
document.addEventListener("DOMContentLoaded", function(event) {
@@ -11,24 +12,40 @@ document.addEventListener("DOMContentLoaded", function(event) {
dial.init();
});
window.onresize = function(){
window.addEventListener('resize', function(){
if(app && app.settings) dial.updateGridLayout();
}
window.onwheel = function(ev){
});
window.addEventListener('wheel', function(e){
if(app && app.settings){
if(ev.deltaY > 0){
if(e.deltaY > 0){
if(dial.page < dial.maxpage){
dial.page += 1;
dial.populateGrid();
}
} else if(ev.deltaY < 0){
} else if(e.deltaY < 0){
if(dial.page > 1){
dial.page -= 1;
dial.populateGrid();
}
}
}
}
});
window.addEventListener('keyup', function(e){
switch(e.key){
case 'PageDown':
if(dial.page < dial.maxpage){
dial.page += 1;
dial.populateGrid();
}
break;
case 'PageUp':
if(dial.page > 1){
dial.page -= 1;
dial.populateGrid();
}
break;
}
});
@@ -73,7 +90,7 @@ app.Messages.init = function(){
app.Messages.getSettings(app.Settings._changed);
break;
case app.Messages.Commands.gridNodesLoaded:
app.Messages.getNode(dial.path, app.GridNodes._changed);
if(dial.skipUpdate!=true) app.Messages.getNode(dial.path, app.GridNodes._changed);
break;
}
});
@@ -96,6 +113,9 @@ app.Messages.getNode = function(path, callback){
}
});
};
app.Messages.updateNode = function(id, value, callback){
browser.runtime.sendMessage({ cmd: app.Messages.Commands.updateNode, id: id, value: value }).then(callback);
};
app.Messages.setNodeIndex = function(index, newIndex, callback){
browser.runtime.sendMessage({ cmd: app.Messages.Commands.setNodeIndex, path: dial.path, index: index, newIndex: newIndex }).then(callback);
};
@@ -194,6 +214,12 @@ dial.initMenus = function(){
dial.refreshNode(dial._selectedItem);
};
dial.ItemMenuCaptureHere = document.createElement('menuitem');
dial.ItemMenuCaptureHere.label = browser.i18n.getMessage("menuCaptureHere");
dial.ItemMenuCaptureHere.onclick = function(){
dial.captureHere(dial._selectedItem);
};
dial.ItemMenuCapture = document.createElement('menuitem');
dial.ItemMenuCapture.label = browser.i18n.getMessage("menuCapturePage");
dial.ItemMenuCapture.onclick = function(){
@@ -214,6 +240,7 @@ dial.initMenus = function(){
dial.ItemMenu.appendChild(document.createElement('hr'));
dial.ItemMenu.appendChild(dial.ItemMenuProperties);
dial.ItemMenu.appendChild(dial.ItemMenuRefresh);
dial.ItemMenu.appendChild(dial.ItemMenuCaptureHere);
dial.ItemMenu.appendChild(dial.ItemMenuCapture);
dial.ItemMenu.appendChild(dial.ItemMenuDelete);
dial.ItemMenu.appendChild(document.createElement('hr'));
@@ -221,29 +248,58 @@ dial.initMenus = function(){
document.body.appendChild(dial.ItemMenu);
}
dial.initStyles = function(){
function applyImageMode(imageMode, target){
switch(imageMode){
case 0:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = '100% 100%';
break;
case 1:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = 'cover';
target.backgroundPosition = 'center';
break;
case 2:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = 'contain';
target.backgroundPosition = 'center';
break;
case 3:
target.backgroundRepeat = 'no-repeat';
target.backgroundPosition = 'center';
break;
}
}
var oldStyle = dial.Style;
dial.Style = document.createElement('style'), StyleSheet;
document.head.appendChild(dial.Style);
dial.styles = {};
dial.styles.html = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('html { height: 100%; }')].style;
dial.styles.body = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('body { user-select: none; -moz-user-select: none; display: flex; width: 100%; height: 100%; margin: 0px; padding: 0px; background-color: ' + app.settings.backgroundColor + '; background-image: ' + app.settings.backgroundImage + '; background-repeat: no-repeat; background-size: 100% 100%; }')].style;
dial.styles.body = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('body { user-select: none; -moz-user-select: none; display: flex; width: 100%; height: 100%; margin: 0px; padding: 0px; background-color: ' + app.settings.backgroundColor + '; background-image: ' + app.settings.backgroundImage + '; }')].style;
applyImageMode(app.settings.backgroundMode, dial.styles.body);
dial.styles.grid = {};
dial.styles.grid.grid = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid { border-collapse: collapse; margin: auto; }')].style;
dial.styles.grid.cell = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td { margin: 0px; padding: 0px; }')].style;
dial.styles.grid.link = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a { display: block; outline: none; overflow: hidden; text-decoration: none; margin: ' + app.settings.grid.cells.margin + 'px; border: 1px solid ' + app.settings.grid.cells.borderColor + '; border-radius: ' + app.settings.grid.cells.borderRadius + 'px; }')].style;
//dial.styles.grid.linkHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a:hover { border-color: ' + app.settings.grid.cells.borderColorHover + '; border-radius: ' + app.settings.grid.cells.borderRadiusHover + 'px; }')].style;
dial.styles.grid.linkHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a:hover { border-color: ' + app.settings.grid.cells.borderColorHover + '; margin: ' + app.settings.grid.cells.marginHover + 'px; border-radius: ' + app.settings.grid.cells.borderRadiusHover + 'px; }')].style;
dial.styles.grid.cellHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td:hover {}')].style;
dial.styles.grid.link = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a { display: block; outline: none; overflow: hidden; text-decoration: none; margin: ' + app.settings.grid.cells.margin + 'px; opacity: ' + app.settings.grid.cells.opacity + '; border: ' + app.settings.grid.cells.borderSize + 'px solid ' + app.settings.grid.cells.borderColor + '; border-radius: ' + app.settings.grid.cells.borderRadius + 'px; }')].style;
dial.styles.grid.linkHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a:hover { border-color: ' + app.settings.grid.cells.borderColorHover + '; border-width: ' + app.settings.grid.cells.borderSizeHover + 'px; margin: ' + app.settings.grid.cells.marginHover + 'px; opacity: ' + app.settings.grid.cells.opacityHover + '; border-radius: ' + app.settings.grid.cells.borderRadiusHover + 'px; }')].style;
dial.styles.grid.linkPanel = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a>div:first-child { background-repeat: no-repeat; }')].style;
if(app.settings.grid.cells.backgroundColor) dial.styles.grid.linkPanel.backgroundColor = app.settings.grid.cells.backgroundColor;
dial.styles.grid.linkPanelHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a:hover>div:first-child { }')].style;
if(app.settings.grid.cells.backgroundColorHover) dial.styles.grid.linkPanelHover.backgroundColor = app.settings.grid.cells.backgroundColorHover;
dial.styles.grid.linkTitle = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a>div:last-child { height: ' + app.settings.grid.cells.titleHeight + 'px; font-size: ' + app.settings.grid.cells.titleFontSize + 'pt; font-family: ' + app.settings.grid.cells.titleFont + 'pt; text-align: center; overflow: hidden; color: ' + app.settings.grid.cells.titleColor + '; border-top: 1px solid ' + app.settings.grid.cells.borderColor + '; }')].style;
else dial.styles.grid.linkPanelHover.backgroundColor = 'transparent';
dial.styles.grid.linkTitle = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a>div:last-child { height: ' + app.settings.grid.cells.titleHeight + 'px; font-size: ' + app.settings.grid.cells.titleFontSize + 'pt; font-family: ' + app.settings.grid.cells.titleFont + 'pt; text-align: center; overflow: hidden; color: ' + app.settings.grid.cells.titleColor + '; border-top: ' + app.settings.grid.cells.titleBorderSize + 'px solid ' + app.settings.grid.cells.borderColor + '; }')].style;
if(app.settings.grid.cells.titleBackgroundColor) dial.styles.grid.linkTitle.backgroundColor = app.settings.grid.cells.titleBackgroundColor;
dial.styles.grid.linkTitleHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a:hover>div:last-child { color: ' + app.settings.grid.cells.titleColorHover + '; border-top-color: ' + app.settings.grid.cells.borderColorHover + ' }')].style;
else dial.styles.grid.linkTitle.backgroundColor = 'transparent';
dial.styles.grid.linkTitleHover = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a:hover>div:last-child { font-size: ' + app.settings.grid.cells.titleFontSizeHover + 'pt; color: ' + app.settings.grid.cells.titleColorHover + '; border-top-width: ' + app.settings.grid.cells.titleBorderSizeHover + 'px; border-top-color: ' + app.settings.grid.cells.borderColorHover + ' }')].style;
if(app.settings.grid.cells.titleBackgroundColorHover) dial.styles.grid.linkTitleHover.backgroundColor = app.settings.grid.cells.titleBackgroundColorHover;
else dial.styles.grid.linkTitleHover.backgroundColor = 'transparent';
dial.styles.grid.linkEmpty = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a.Empty { display: none; }')].style;
dial.styles.grid.linkBack = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a.Back :first-child { background-image: ' + app.settings.grid.backIcon + '; background-repeat: no-repeat; background-position: center center; }')].style;
dial.styles.grid.linkBack = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a.Back :first-child { background-image: ' + app.settings.grid.backIcon + '; }')].style;
applyImageMode(app.settings.grid.backIconMode, dial.styles.grid.linkBack);
dial.styles.grid.linkFolder = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a.Folder :first-child { background-image: ' + app.settings.grid.folderIcon + '; background-repeat: no-repeat; background-size: 100% 100%; }')].style;
applyImageMode(app.settings.grid.folderIconMode, dial.styles.grid.linkFolder);
dial.styles.grid.linkBookmark = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a.Bookmark :first-child { background-repeat: no-repeat; background-size: 100% 100%; }')].style;
dial.styles.grid.linkBookmarkLoading = dial.Style.sheet.cssRules[dial.Style.sheet.insertRule('.Grid td>a.BookmarkLoading :first-child { background-image: url("' + app.settings.grid.cells.loadingIcon + '"); background-repeat: no-repeat; background-position: center center; }')].style;
if(oldStyle) document.head.removeChild(oldStyle);
@@ -267,7 +323,20 @@ dial.initGrid = function(){
link.className = 'Empty';
link.appendChild(document.createElement('div'));
link.appendChild(document.createElement('div'));
link.onmousedown = function(){ dial._selectedItem = this; };
link.onmousedown = function(){
dial._selectedItem = this;
if(dial._selectedItem.Node){
switch(dial._selectedItem.Node.type){
case app.GridNodes.GridNodeType.folder:
dial.ItemMenuCaptureHere.hidden = true;
break;
case app.GridNodes.GridNodeType.bookmark:
//dial.ItemMenuCaptureHere.hidden = false;
dial.ItemMenuCaptureHere.hidden = true;
break;
}
}
};
function dragstart_handler(ev) {
if(!ev.target.Node){
@@ -276,10 +345,23 @@ dial.initGrid = function(){
}
var index = (dial.page - 1) * (app.settings.grid.rows * app.settings.grid.columns) + +(ev.target.parentElement.getAttribute('gridindex'));
if(app.settings.grid.backNode && dial.path != '/') index -= dial.page;
ev.dataTransfer.setData("text/plain", index);
ev.dataTransfer.setData("text/plain", JSON.stringify({parentId: app.node.id, index: index}));
}
function dragover_handler(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text");
try {
data = JSON.parse(data);
} catch(e) {
data = null;
}
if(!data){
ev.dataTransfer.dropEffect = "none";
return;
} else if(data.parentId != app.node.id){
ev.dataTransfer.dropEffect = "none";
return;
}
if(app.settings.grid.backNode && dial.path != '/'){
var gridIndex = 0;
if(ev.target.tagName == 'DIV') gridIndex = +(ev.target.parentElement.parentElement.getAttribute('gridindex'));
@@ -293,7 +375,15 @@ dial.initGrid = function(){
function drop_handler(ev) {
ev.preventDefault();
if(ev.buttons == 1) return;
var StartIndex = ev.dataTransfer.getData("text");
var data = ev.dataTransfer.getData("text");
try {
data = JSON.parse(data);
} catch(e) {
data = null;
}
if(!data) return;
else if(data.parentId != app.node.id) return;
var StartIndex = data.index;
var EndIndex = 0;
if(ev.target.tagName == 'DIV'){
EndIndex = (dial.page - 1) * (app.settings.grid.rows * app.settings.grid.columns) + +(ev.target.parentElement.parentElement.getAttribute('gridindex'));
@@ -315,25 +405,74 @@ dial.initGrid = function(){
return dial.Grid;
};
dial.updateGridLayout = function(){
var fullWidth = dial.Grid.parentElement.offsetWidth - 2 * app.settings.grid.margin;
var fullHeight = dial.Grid.parentElement.offsetHeight - 2 * app.settings.grid.margin;
var linkWidth = fullWidth / app.settings.grid.columns;
var linkHeight = fullHeight / app.settings.grid.rows;
if(linkWidth <= linkHeight * 4 / 3) linkHeight = linkWidth / 4 * 3;
else linkWidth = linkHeight / 3 * 4;
var parentWidth = dial.Grid.parentElement.offsetWidth;
var parentHeight = dial.Grid.parentElement.offsetHeight;
dial.styles.grid.cell.width = linkWidth.toString() + 'px';
dial.styles.grid.cell.height = linkHeight.toString() + 'px';
function calc(gridMargin, cellsMargin, borderSize, titleBorderSize){
var fullWidth = parentWidth - 2 * gridMargin;
var fullHeight = parentHeight - 2 * gridMargin;
var cellWidth = fullWidth / app.settings.grid.columns;
var cellHeight = fullHeight / app.settings.grid.rows;
var linkWidth = 0;
var linkHeight = 0;
if(cellWidth <= cellHeight * app.settings.grid.ratioX / app.settings.grid.ratioY) cellHeight = cellWidth / app.settings.grid.ratioX * app.settings.grid.ratioY;
else cellWidth = cellHeight / app.settings.grid.ratioY * app.settings.grid.ratioX;
linkWidth = cellWidth - 2 * (cellsMargin + 1) - 2 * borderSize;
linkHeight = cellHeight - 2 * (cellsMargin + 1) - 2 * borderSize - titleBorderSize;
return {
cellWidth: cellWidth,
cellHeight: cellHeight,
linkWidth: linkWidth,
linkHeight: linkHeight
};
}
linkWidth = linkWidth - 2 * (app.settings.grid.cells.margin + 1);
linkHeight = linkHeight - 2 * (app.settings.grid.cells.margin + 1);
dial.styles.grid.link.width = linkWidth.toString() + 'px';
dial.styles.grid.link.height = linkHeight.toString() + 'px';
if(app.settings.grid.cells.title) dial.styles.grid.linkPanel.height = (linkHeight - app.settings.grid.cells.titleHeight - 1).toString() + 'px';
else dial.styles.grid.linkPanel.height = linkHeight.toString() + 'px';
var values = calc(app.settings.grid.margin, app.settings.grid.cells.margin, app.settings.grid.cells.borderSize, app.settings.grid.cells.titleBorderSize);
dial.styles.grid.cell.width = values.cellWidth.toString() + 'px';
dial.styles.grid.cell.height = values.cellHeight.toString() + 'px';
dial.styles.grid.link.width = values.linkWidth.toString() + 'px';
dial.styles.grid.link.height = values.linkHeight.toString() + 'px';
if(app.settings.grid.cells.title) dial.styles.grid.linkPanel.height = (values.linkHeight - app.settings.grid.cells.titleHeight - 1 - app.settings.grid.cells.titleBorderSize).toString() + 'px';
else dial.styles.grid.linkPanel.height = values.linkHeight.toString() + 'px';
values = calc(app.settings.grid.margin, app.settings.grid.cells.marginHover, app.settings.grid.cells.borderSizeHover, app.settings.grid.cells.titleBorderSizeHover);
dial.styles.grid.cellHover.width = values.cellWidth.toString() + 'px';
dial.styles.grid.cellHover.height = values.cellHeight.toString() + 'px';
dial.styles.grid.linkHover.width = values.linkWidth.toString() + 'px';
dial.styles.grid.linkHover.height = values.linkHeight.toString() + 'px';
if(app.settings.grid.cells.titleHover) dial.styles.grid.linkPanelHover.height = (values.linkHeight - app.settings.grid.cells.titleHeightHover - 1 - app.settings.grid.cells.titleBorderSizeHover).toString() + 'px';
else dial.styles.grid.linkPanelHover.height = values.linkHeight.toString() + 'px';
};
dial.populateGrid = function(){
function applyImageMode(imageMode, target){
switch(imageMode){
case -1:
target.backgroundRepeat = '';
target.backgroundSize = '';
target.backgroundPosition = '';
break;
case 0:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = '100% 100%';
target.backgroundPosition = '';
break;
case 1:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = 'cover';
target.backgroundPosition = 'center';
break;
case 2:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = 'contain';
target.backgroundPosition = 'center';
break;
case 3:
target.backgroundRepeat = 'no-repeat';
target.backgroundSize = 'auto auto';
target.backgroundPosition = 'center';
break;
}
}
populateEmpty = function(link){
link.Node = null;
link.className = 'Empty';
@@ -354,6 +493,8 @@ dial.populateGrid = function(){
populateFolder = function(link, node){
link.Node = node;
link.className = 'Folder';
if(node.imageMode || node.imageMode == 0) applyImageMode(node.imageMode, link.childNodes[0].style);
else applyImageMode(-1, link.childNodes[0].style);
if(node.image){
if(node.image.indexOf('url(')>=0) link.childNodes[0].style.backgroundImage = node.image;
else link.childNodes[0].style.backgroundImage = 'url(' + node.image + ')';
@@ -366,6 +507,8 @@ dial.populateGrid = function(){
}
populateBookmark = function(link, node){
link.Node = node;
if(node.imageMode || node.imageMode == 0) applyImageMode(node.imageMode, link.childNodes[0].style);
else applyImageMode(-1, link.childNodes[0].style);
if(node.image){
link.className = 'Bookmark';
if(node.image.indexOf('url(')>=0) link.childNodes[0].style.backgroundImage = node.image;
@@ -430,6 +573,88 @@ dial.refreshNode = function(selectedItem){
selectedItem.childNodes[0].style.backgroundImage = app.settings.grid.loadingIcon;
app.Messages.refreshNode(selectedItem.Node.id);
}
dial.captureHere = function(selectedItem){
function headersReceived(e){
for (let i = e.responseHeaders.length - 1; i >= 0; i--) {
switch(e.responseHeaders[i].name.toLowerCase()){
case 'x-frame-options':
case 'frame-options':
case 'content-security-policy':
e.responseHeaders.splice(i, 1);
break;
}
}
return { responseHeaders: e.responseHeaders };
};
function pageLoaded(){
if(!iframe) return;
function clean(){
if(!iframe) return;
selectedItem.children[0].removeChild(iframe);
dial.capture -= 1;
if(dial.capture == 0){
browser.webRequest.onHeadersReceived.removeListener(headersReceived);
browser.tabs.update(tab.id, {muted: false}).then();
}
iframe = null;
}
setTimeout(function(){
browser.tabs.captureVisibleTab().then(function(img){
var imgObj = new Image;
imgObj.src = img;
var canvas = document.createElement('canvas');
canvas.style.width = rect.width.toString() + 'px';
canvas.style.height = rect.height.toString() + 'px';
canvas.width = rect.width;
canvas.height = rect.height;
var ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, rect.width, rect.height);
ctx.save();
setTimeout(function(){
ctx.drawImage(imgObj, rect.left, rect.top, rect.width, rect.height, 0, 0, rect.width, rect.height);
ctx.restore();
img = canvas.toDataURL();
selectedItem.children[0].style.backgroundImage = 'url(' + img + ')';
clean();
app.Messages.updateNode(selectedItem.Node.id, { image: img }, function(){
setTimeout(function(){
if(dial.capture == 0) dial.skipUpdate = false;
}, 500);
});
}, 500);
}, clean);
}, 3000);
};
var tab = null;
var previewWidth = 1200; // Need to be linked to settings
var previewHeight = 710; // Need to be linked to settings
var iframe = document.createElement('iframe');
var rect = selectedItem.children[0].getBoundingClientRect();
browser.tabs.getCurrent().then(function(currentTab){
tab = currentTab;
var ratioX = previewWidth / selectedItem.children[0].offsetWidth;
var ratioY = previewHeight / selectedItem.children[0].offsetHeight;
iframe.style.width = ratioX * selectedItem.children[0].offsetWidth + 'px';
iframe.style.height = ratioY * selectedItem.children[0].offsetHeight + 'px';
iframe.style.position = 'absolute';
iframe.style.MozTransform = 'scale(' + (1/ratioX) + ', ' + (1/ratioY) + ')';
iframe.style.MozTransformOrigin = 'top left';
iframe.sandbox = 'allow-scripts allow-same-origin';
iframe.onload = function(){ pageLoaded(); }
dial.capture += 1;
if(dial.capture == 1){
dial.skipUpdate = true;
browser.webRequest.onHeadersReceived.addListener(headersReceived, { urls:['*://*/*'], types:['sub_frame'] }, ['blocking', 'responseHeaders']);
browser.tabs.update(tab.id, {muted: true}).then();
}
iframe.src = selectedItem.Node.url;
selectedItem.children[0].appendChild(iframe);
//setTimeout(function(){ pageLoaded(); }, 6000);
});
}
dial.capturePage = function(selectedItem){
selectedItem.className = 'BookmarkLoading';
selectedItem.childNodes[0].style.backgroundImage = app.settings.grid.loadingIcon;

View File

@@ -19,6 +19,8 @@ app.init = function(){
app.Messages.getNodeByID(new URL(window.location).searchParams.get('id'), function(node){
app.node = node;
Title.value = node.title;
if(node.imageMode == 0) ImageMode.value = 0;
else if(node.imageMode) ImageMode.value = node.imageMode;
ImagePreview.style.backgroundRepeat = 'no-repeat';
ImagePreview.style.backgroundSize = '100% 100%';
switch(node.type){
@@ -97,10 +99,10 @@ app.init = function(){
BtnApply.onclick = function(){
switch(app.node.type){
case app.GridNodes.GridNodeType.folder:
app.Messages.updateNode(app.node.id, { title: Title.value, image: Image })
app.Messages.updateNode(app.node.id, { title: Title.value, image: Image, imageMode: +(ImageMode.value) })
break;
case app.GridNodes.GridNodeType.bookmark:
app.Messages.updateNode(app.node.id, { title: Title.value, titleLocked: TitleLocked.checked, url: Url.value, image: Image })
app.Messages.updateNode(app.node.id, { title: Title.value, titleLocked: TitleLocked.checked, url: Url.value, image: Image, imageMode: +(ImageMode.value) })
break;
}
}

View File

@@ -21,25 +21,34 @@ app.init = function(){
app.settings = settings;
BackgroundColor.value = app.settings.backgroundColor;
BackgroundImage = app.settings.backgroundImage;
BackgroundMode.value = app.settings.backgroundMode;
BackgroundPreview.style.backgroundColor = app.settings.backgroundColor;
BackgroundPreview.style.backgroundImage = app.settings.backgroundImage;
BackgroundPreview.style.backgroundRepeat = 'no-repeat';
BackgroundPreview.style.backgroundSize = '100% 100%';
GridRoot.value = app.settings.grid.root;
GridRows.value = app.settings.grid.rows;
GridRatioX.value = app.settings.grid.ratioX;
GridRatioY.value = app.settings.grid.ratioY;
GridMargins.value = app.settings.grid.margin;
GridColumns.value = app.settings.grid.columns;
GridBackNode.checked = app.settings.grid.backNode;
GridBackMode.value = app.settings.grid.backIconMode;
GridBackImage = app.settings.grid.backIcon;
GridBackPreview.style.backgroundImage = app.settings.grid.backIcon;
GridBackPreview.style.backgroundRepeat = 'no-repeat';
GridBackPreview.style.backgroundPosition = '50% 50%';
GridFolderMode.value = app.settings.grid.folderIconMode;
GridFolderImage = app.settings.grid.folderIcon;
GridFolderPreview.style.backgroundImage = app.settings.grid.folderIcon;
GridFolderPreview.style.backgroundRepeat = 'no-repeat';
GridFolderPreview.style.backgroundSize = '100% 100%';
GridCellsMargins.value = app.settings.grid.cells.margin;
GridCellsMarginsHover.value = app.settings.grid.cells.marginHover;
GridCellsOpacity.value = app.settings.grid.cells.opacity * 100;
GridCellsOpacityHover.value = app.settings.grid.cells.opacityHover * 100;
GridCellsBorderSize.value = app.settings.grid.cells.borderSize;
GridCellsBorderSizeHover.value = app.settings.grid.cells.borderSizeHover;
GridCellsBackgroundTransparent.checked = (app.settings.grid.cells.backgroundColor == null);
GridCellsBackgroundColor.value = app.settings.grid.cells.backgroundColor;
GridCellsBackgroundTransparentHover.checked = (app.settings.grid.cells.backgroundColorHover == null);
@@ -49,14 +58,20 @@ app.init = function(){
GridCellsBorderColor.value = app.settings.grid.cells.borderColor;
GridCellsBorderColorHover.value = app.settings.grid.cells.borderColorHover;
GridCellsTitle.checked = app.settings.grid.cells.title;
GridCellsTitleHover.checked = app.settings.grid.cells.titleHover;
GridCellsTitleHeight.value = app.settings.grid.cells.titleHeight;
GridCellsTitleHeightHover.value = app.settings.grid.cells.titleHeightHover;
GridCellsTitleFontSize.value = app.settings.grid.cells.titleFontSize;
GridCellsTitleFontSizeHover.value = app.settings.grid.cells.titleFontSizeHover;
GridCellsTitleBorderSize.value = app.settings.grid.cells.titleBorderSize;
GridCellsTitleBorderSizeHover.value = app.settings.grid.cells.titleBorderSizeHover;
GridCellsTitleColor.value = app.settings.grid.cells.titleColor;
GridCellsTitleColorHover.value = app.settings.grid.cells.titleColorHover;
GridCellsTitleBackgroundTransparent.checked = (app.settings.grid.cells.titleBackgroundColor == null);
GridCellsTitleBackgroundColor.value = app.settings.grid.cells.titleBackgroundColor;
GridCellsTitleBackgroundColorHover.value = app.settings.grid.cells.titleBackgroundColorHover;
GridCellsTitleBackgroundTransparentHover.checked = (app.settings.grid.cells.titleBackgroundColorHover == null);
GridCellsSnapshotDelay.value = app.settings.grid.cells.snapshotDelay;
});
BtnOk.onclick = function(){
@@ -66,15 +81,23 @@ app.init = function(){
BtnApply.onclick = function(){
app.settings.backgroundColor = BackgroundColor.value;
app.settings.backgroundImage = BackgroundImage;
app.settings.backgroundMode = +(BackgroundMode.value);
app.settings.grid.rows = +(GridRows.value);
app.settings.grid.margin = +(GridMargins.value);
app.settings.grid.columns = +(GridColumns.value);
app.settings.grid.ratioX = GridRatioX.value;
app.settings.grid.ratioY = GridRatioY.value;
app.settings.grid.backNode = GridBackNode.checked;
app.settings.grid.backIconMode = +(GridBackMode.value);
app.settings.grid.backIcon = GridBackImage;
app.settings.grid.folderIconMode = +(GridFolderMode.value);
app.settings.grid.folderIcon = GridFolderImage;
app.settings.grid.cells.margin = +(GridCellsMargins.value);
//app.settings.grid.cells.marginHover = +(GridCellsMarginsHover.value);
app.settings.grid.cells.marginHover = +(GridCellsMargins.value);
app.settings.grid.cells.marginHover = +(GridCellsMarginsHover.value);
app.settings.grid.cells.opacity = +(GridCellsOpacity.value) / 100;
app.settings.grid.cells.opacityHover = +(GridCellsOpacityHover.value) / 100;
app.settings.grid.cells.borderSize = +(GridCellsBorderSize.value);
app.settings.grid.cells.borderSizeHover = +(GridCellsBorderSizeHover.value);
if(GridCellsBackgroundTransparent.checked == true) app.settings.grid.cells.backgroundColor = null;
else app.settings.grid.cells.backgroundColor = GridCellsBackgroundColor.value;
if(GridCellsBackgroundTransparentHover.checked == true) app.settings.grid.cells.backgroundColorHover = null;
@@ -84,14 +107,20 @@ app.init = function(){
app.settings.grid.cells.borderColor = GridCellsBorderColor.value;
app.settings.grid.cells.borderColorHover = GridCellsBorderColorHover.value;
app.settings.grid.cells.title = GridCellsTitle.checked;
app.settings.grid.cells.titleHover = GridCellsTitleHover.checked;
app.settings.grid.cells.titleHeight = GridCellsTitleHeight.value;
app.settings.grid.cells.titleHeightHover = GridCellsTitleHeightHover.value;
app.settings.grid.cells.titleFontSize = GridCellsTitleFontSize.value;
app.settings.grid.cells.titleFontSizeHover = GridCellsTitleFontSizeHover.value;
app.settings.grid.cells.titleBorderSize = GridCellsTitleBorderSize.value;
app.settings.grid.cells.titleBorderSizeHover = GridCellsTitleBorderSizeHover.value;
app.settings.grid.cells.titleColor = GridCellsTitleColor.value;
app.settings.grid.cells.titleColorHover = GridCellsTitleColorHover.value;
if(GridCellsTitleBackgroundTransparent.checked == true) app.settings.grid.cells.titleBackgroundColor = null;
else app.settings.grid.cells.titleBackgroundColor = GridCellsTitleBackgroundColor.value;
if(GridCellsTitleBackgroundTransparentHover.checked == true) app.settings.grid.cells.titleBackgroundColorHover = null;
else app.settings.grid.cells.titleBackgroundColorHover = GridCellsTitleBackgroundColorHover.value;
app.settings.grid.cells.snapshotDelay = GridCellsSnapshotDelay.value;
app.settings.grid.root = GridRoot.value;
browser.runtime.sendMessage( { cmd: app.Messages.Commands.setSettings, settings: app.settings } );
}
@@ -135,6 +164,19 @@ app.init = function(){
fileReader.readAsDataURL(BackgroundImageFile.files[0]);
}
GridRows.onchange = function(){
if(GridRatioAuto.checked){
GridRatioX.value = GridColumns.value;
GridRatioY.value = GridRows.value;
}
}
GridColumns.onchange = function(){
if(GridRatioAuto.checked){
GridRatioX.value = GridColumns.value;
GridRatioY.value = GridRows.value;
}
}
GridBackImageReset.onclick = function(){
GridBackImage = 'url(/img/back.png)';
GridBackPreview.style.backgroundImage = GridBackImage;

View File

@@ -2,7 +2,7 @@
"manifest_version": 2,
"name": "Quick Dial",
"version": "0.1.5",
"version": "0.1.10",
"author": "MatMoul",
"homepage_url": "https://github.com/MatMoul/quickdial-webext",
"developer": {
@@ -21,6 +21,8 @@
"bookmarks",
"contextMenus",
"tabs",
"webRequest",
"webRequestBlocking",
"<all_urls>"
],