Started using vue for settings and popup, start of rewrite for settings page
This commit is contained in:
parent
7593e95726
commit
e2df78aa78
26
.babelrc
Normal file
26
.babelrc
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
],
|
||||||
|
"presets": [
|
||||||
|
["@babel/preset-env", {
|
||||||
|
"useBuiltIns": false,
|
||||||
|
"targets": {
|
||||||
|
"esmodules": true,
|
||||||
|
},
|
||||||
|
}]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
// {
|
||||||
|
// "plugins": [
|
||||||
|
// "@babel/plugin-proposal-optional-chaining"
|
||||||
|
// ],
|
||||||
|
// "presets": [
|
||||||
|
// ["@babel/preset-env", {
|
||||||
|
// "useBuiltIns": "usage",
|
||||||
|
// "targets": {
|
||||||
|
// // https://jamie.build/last-2-versions
|
||||||
|
// "browsers": ["> 0.25%", "not ie 11", "not op_mini all"]
|
||||||
|
// }
|
||||||
|
// }]
|
||||||
|
// ]
|
||||||
|
// }
|
7
.gitignore
vendored
7
.gitignore
vendored
@ -1,4 +1,7 @@
|
|||||||
ultrawidify.zip
|
|
||||||
ultrawidify-git.zip
|
|
||||||
old/
|
old/
|
||||||
build/
|
build/
|
||||||
|
/node_modules
|
||||||
|
/*.log
|
||||||
|
/dist
|
||||||
|
/dist-zip
|
||||||
|
|
||||||
|
23
CHANGELOG.md
23
CHANGELOG.md
@ -1,16 +1,29 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v4.x
|
||||||
|
|
||||||
|
### v4.0.0 (upcoming)
|
||||||
|
|
||||||
|
* Using vue for popup and settings page
|
||||||
|
* Editable shortcuts
|
||||||
|
* Per-site controls
|
||||||
|
* Basic mode added
|
||||||
|
* Per-site controls in popup (to control embedded videos)
|
||||||
|
* Rewrote keyboard shortcuts and changed how they're handled. Massively.
|
||||||
|
|
||||||
## v3.x
|
## v3.x
|
||||||
|
|
||||||
### v3.3.0
|
### v3.3.0
|
||||||
|
|
||||||
This will probably get promoted to 4.0, continuing the trend of version something.3 not happening. Eulul
|
~~This will probably get promoted to 4.0, continuing the trend of version something.3 not happening. Eulul~~
|
||||||
|
|
||||||
* Basic mode added
|
* ~~Basic mode added~~
|
||||||
* Per-site controls in popup (to control embedded videos)
|
* ~~Per-site controls in popup (to control embedded videos)~~
|
||||||
* Rewrote keyboard shortcuts and changed how they're handled. Massively.
|
* ~~Rewrote keyboard shortcuts and changed how they're handled. Massively.~~
|
||||||
|
|
||||||
### v3.2.2
|
Never happened, got bumped to 4.0.0.
|
||||||
|
|
||||||
|
### v3.2.2 (current)
|
||||||
|
|
||||||
* Pan event listener now gets properly unbound
|
* Pan event listener now gets properly unbound
|
||||||
* Fixed 'reset zoom' button in popup
|
* Fixed 'reset zoom' button in popup
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
var _bd_usebrowser = "firefox";
|
|
||||||
|
|
||||||
var _bd_isFirefox = true;
|
|
||||||
var _bd_isChrome = false;
|
|
||||||
var _bd_isEdge = false; // we'll see if FF
|
|
||||||
|
|
||||||
try{
|
|
||||||
// todo: find something that works in firefox but not in edge (or vice-versa)
|
|
||||||
// note that this function returns a promise! and is broken for some reason
|
|
||||||
var browserinfo = browser.runtime.getBrowserInfo();
|
|
||||||
|
|
||||||
// we don't need to actually check because only firefox supports that.
|
|
||||||
// if we're not on firefox, the above call will probably throw an exception anyway.
|
|
||||||
// if browsers other than firefox start supporting that, well ... we'll also need to actually await for promise
|
|
||||||
// that getBrowserInfo() returns to resolve.
|
|
||||||
|
|
||||||
// if (Browser.name.toLowerCase().indexOf(firefox) !== -1 || Browser.vendor.toLowerCase().indexOf(mozilla) !== -1) {
|
|
||||||
_bd_isFirefox = true;
|
|
||||||
_bd_isEdge = false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
if(Debug.debug) {
|
|
||||||
console.info("[BrowserDetect] browser.runtime.getBrowserInfo() probably failed. This means we're probably not using firefox.", e)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if(typeof browser === "undefined"){ // This is a good sign we're in chrome or chromium-based browsers
|
|
||||||
if(chrome){
|
|
||||||
browser = chrome;
|
|
||||||
_bd_usebrowser = "chrome";
|
|
||||||
_bd_isChrome = true;
|
|
||||||
_bd_isEdge = false;
|
|
||||||
_bd_isFirefox = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var BrowserDetect = {
|
|
||||||
usebrowser: _bd_usebrowser,
|
|
||||||
firefox: _bd_isFirefox,
|
|
||||||
chrome: _bd_isChrome,
|
|
||||||
edge: _bd_isEdge
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Debug.debug){
|
|
||||||
console.log("BrowserDetect loaded! Here's BrowserDetect object:", BrowserDetect)
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
class BaseElement {
|
|
||||||
constructor(id, label, onClick, additionalClasses, existingElement) {
|
|
||||||
if (existingElement) {
|
|
||||||
this.element = existingElement;
|
|
||||||
} else {
|
|
||||||
this.element = document.createElement('div');
|
|
||||||
this.element.setAttribute('id', id);
|
|
||||||
}
|
|
||||||
if (additionalClasses) {
|
|
||||||
this.element.classList.add(...additionalClasses);
|
|
||||||
}
|
|
||||||
if (onClick) {
|
|
||||||
this.element.addEventListener('click', onClick);
|
|
||||||
}
|
|
||||||
if (label && !existingElement) {
|
|
||||||
this.element.innerHTML = label;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static fromExisting(element, onClick){
|
|
||||||
return new BaseElement(undefined, undefined, onClick, undefined, element);
|
|
||||||
}
|
|
||||||
|
|
||||||
disable() {
|
|
||||||
this.element.classList.add('disabled');
|
|
||||||
}
|
|
||||||
enable() {
|
|
||||||
this.element.classList.remove('disabled');
|
|
||||||
}
|
|
||||||
hide() {
|
|
||||||
this.element.classList.add('hidden');
|
|
||||||
}
|
|
||||||
show() {
|
|
||||||
this.element.classList.remove('hidden');
|
|
||||||
}
|
|
||||||
select() {
|
|
||||||
this.element.classList.add('selected');
|
|
||||||
}
|
|
||||||
unselect() {
|
|
||||||
this.element.classList.remove('selected');
|
|
||||||
}
|
|
||||||
appendTo(element) {
|
|
||||||
if (element.element) {
|
|
||||||
element.element.appendChild(this.element);
|
|
||||||
} else {
|
|
||||||
element.appendChild(this.element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
removeChildren() {
|
|
||||||
while (this.element.lastChild) {
|
|
||||||
this.element.removeChild(this.element.lastChild);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
class Button extends BaseElement {
|
|
||||||
constructor(id, label, onClick, additionalClasses) {
|
|
||||||
super(
|
|
||||||
id,
|
|
||||||
label,
|
|
||||||
onClick,
|
|
||||||
additionalClasses
|
|
||||||
);
|
|
||||||
this.element.classList.add('button');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
class ShortcutButton extends Button {
|
|
||||||
constructor(id, label, shortcutLabel, onClick, additionalClasses) {
|
|
||||||
super(
|
|
||||||
id,
|
|
||||||
shortcutLabel ? `${label}<br/><span class="smallcaps small darker">(${shortcutLabel})</span>` : `${label}<br/><span class="smallcaps small darker"> </span>`,
|
|
||||||
onClick,
|
|
||||||
additionalClasses
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
class MenuItem extends BaseElement {
|
|
||||||
constructor(id, label, sublabel, onClick, additionalClasses) {
|
|
||||||
super(
|
|
||||||
id,
|
|
||||||
`${label}<span class="menu-item-inline-desc"><br/>${sublabel}</span>`,
|
|
||||||
onClick,
|
|
||||||
additionalClasses
|
|
||||||
);
|
|
||||||
this.element.classList.add('menu-item');
|
|
||||||
this.subitemListElement = document.createElement('div');
|
|
||||||
this.element.appendChild(this.subitemListElement);
|
|
||||||
this.subitemList = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
insertSubitem(subitem) {
|
|
||||||
this.subitemList.push(subitem);
|
|
||||||
this.subitemListElement.appendChild(subitem.element);
|
|
||||||
}
|
|
||||||
|
|
||||||
removeSubitems() {
|
|
||||||
while (this.subitemListElement.lastChild) {
|
|
||||||
this.subitemListElement.removeChild(this.subitemListElement.lastChild);
|
|
||||||
}
|
|
||||||
this.subitemList = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
selectSubitem(subitemName) {
|
|
||||||
for(let item of this.subitemList) {
|
|
||||||
if (item.name === subitemName) {
|
|
||||||
item.select();
|
|
||||||
} else {
|
|
||||||
item.unselect();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
existsSubitem(subitemName) {
|
|
||||||
for(let item of this.subitemList) {
|
|
||||||
if (item.name === subitemName) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
selectFirstSubitem() {
|
|
||||||
for(let item of this.subitemList) {
|
|
||||||
item.unselect();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.subitemList[0].select();
|
|
||||||
return this.subitemList[0].name;
|
|
||||||
}
|
|
||||||
|
|
||||||
showSubitems() {
|
|
||||||
this.subitemListElement.classList.remove('hidden');
|
|
||||||
}
|
|
||||||
|
|
||||||
hideSubitems() {
|
|
||||||
this.subitemListElement.classList.add('hidden');
|
|
||||||
}
|
|
||||||
|
|
||||||
select() {
|
|
||||||
super.select();
|
|
||||||
this.showSubitems();
|
|
||||||
}
|
|
||||||
|
|
||||||
unselect() {
|
|
||||||
super.unselect();
|
|
||||||
this.hideSubitems();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
class TabItem extends BaseElement {
|
|
||||||
|
|
||||||
constructor (id, name, label, isIframe, onClick, badge, additionalClasses) {
|
|
||||||
if (badge) {
|
|
||||||
label = `<div style='display: inline-block; color:#fff; background-color:${badge.color}; padding:3px 6px 1px 6px; margin-right: 5px; font-size: 0.66em; min-width: 16px; text-align: center'>${badge.name}</div> ${label}`;
|
|
||||||
}
|
|
||||||
super(id, label, onClick, additionalClasses);
|
|
||||||
this.element.classList.add('tabitem');
|
|
||||||
if (isIframe) {
|
|
||||||
this.element.classList.add('tabitem-iframe');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
select() {
|
|
||||||
super.select();
|
|
||||||
this.element.classList.add('tabitem-selected');
|
|
||||||
}
|
|
||||||
unselect() {
|
|
||||||
super.unselect();
|
|
||||||
this.element.classList.remove('tabitem-selected');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,46 +0,0 @@
|
|||||||
class ActionItem extends BaseElement {
|
|
||||||
constructor(id, action, onClick) {
|
|
||||||
super(id, undefined, onClick, undefined, document.createElement('tr'));
|
|
||||||
this.element.classList.add("action-list-item");
|
|
||||||
|
|
||||||
let cmd = "";
|
|
||||||
for (var c in action.cmd) {
|
|
||||||
cmd += `${c > 0 ? '; ' : ''}${action.cmd[0].action} ${action.cmd[0].arg}`
|
|
||||||
}
|
|
||||||
|
|
||||||
this.element.innerHTML = `
|
|
||||||
<td class="cmd monospace">${cmd}</td>
|
|
||||||
<td class="label">${action.label ? action.label : ""}</td>
|
|
||||||
<td class="shortcut center-text">${action.parsedShortcut ? action.parsedShortcut : ""}</td>
|
|
||||||
<td class="center-text">
|
|
||||||
<div class="checkbox-container">
|
|
||||||
<span class="checkbox ${
|
|
||||||
action.shortcut && action.shortcut.length && (action.shortcut[0].onMouseMove || action.shortcut[0].onClick || action.shortcut[0].onScroll) ?
|
|
||||||
"checkbox-checked" : ""
|
|
||||||
}"></span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="center-text">
|
|
||||||
<div class="checkbox-container">
|
|
||||||
<span class="checkbox ${action.popup_global ? "checkbox-checked" : ""}"></span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="center-text">
|
|
||||||
<div class="checkbox-container">
|
|
||||||
<span class="checkbox ${action.popup_site ? "checkbox-checked" : ""}"></span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="center-text">
|
|
||||||
<div class="checkbox-container">
|
|
||||||
<span class="checkbox ${action.popup ? "checkbox-checked" : ""}"></span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td class="center-text">
|
|
||||||
<div class="checkbox-container">
|
|
||||||
<span class="checkbox ${action.ui ? "checkbox-checked" : ""}"></span>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>${action.ui_path ? action.ui_path : ""}</td>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
class ActionItemCategoryHeaderProcessor extends BaseElement {
|
|
||||||
static addCategoryName(table, categoryName) {
|
|
||||||
var row = document.createElement('tr');
|
|
||||||
row.innerHTML = `<td class="action-item-category-label">${categoryName}</td>`;
|
|
||||||
table.appendChild(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
static addTableHeader(table) {
|
|
||||||
var topRow = document.createElement('tr');
|
|
||||||
var bottomRow = document.createElement('tr');
|
|
||||||
|
|
||||||
topRow.innerHTML = `
|
|
||||||
<th class="cmd" rowspan="2">Command</th>
|
|
||||||
<th class="" rowspan="2">Displayed name</th>
|
|
||||||
<th class="" rowspan="2">Shortcut</th>
|
|
||||||
<th class="" rowspan="2">Mouse action?</th>
|
|
||||||
<th colspan="3">Show in popup</th>
|
|
||||||
<th colspan="2">[reserved for future use]</th>
|
|
||||||
`;
|
|
||||||
|
|
||||||
bottomRow.innerHTML = `
|
|
||||||
<th class="action-item-table-header-small">Global</th>
|
|
||||||
<th class="action-item-table-header-small">Site</th>
|
|
||||||
<th class="action-item-table-header-small">Video</th>
|
|
||||||
<th class="action-item-table-header-small">Show</th>
|
|
||||||
<th class="action-item-table-header-small">Menu path</th>
|
|
||||||
`;
|
|
||||||
|
|
||||||
topRow.classList.add("action-item-table-header");
|
|
||||||
bottomRow.classList.add(["action-item-table-header", "action-item-table-header-small"])
|
|
||||||
|
|
||||||
table.appendChild(topRow);
|
|
||||||
table.appendChild(bottomRow);
|
|
||||||
}
|
|
||||||
}
|
|
101
manifest.json
101
manifest.json
@ -1,101 +0,0 @@
|
|||||||
{
|
|
||||||
"manifest_version": 2,
|
|
||||||
"name": "Ultrawidify",
|
|
||||||
"version": "3.3.0-a3",
|
|
||||||
"applications": {
|
|
||||||
"gecko": {
|
|
||||||
"id": "{cf02b1a7-a01a-4e37-a609-516a283f1ed3}"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"icons": {
|
|
||||||
"32":"res/icons/uw-32.png",
|
|
||||||
"64":"res/icons/uw-64.png"
|
|
||||||
},
|
|
||||||
|
|
||||||
"description": "Aspect ratio fixer for youtube that works around some people's disability to properly encode 21:9 (and sometimes, 16:9) videos.",
|
|
||||||
|
|
||||||
"content_scripts": [{
|
|
||||||
"matches": ["*://*/*"],
|
|
||||||
"js": [
|
|
||||||
"js/conf/Debug.js",
|
|
||||||
"js/lib/enums.js",
|
|
||||||
|
|
||||||
"js/lib/BrowserDetect.js",
|
|
||||||
"js/conf/ExtensionConf.js",
|
|
||||||
|
|
||||||
"js/lib/ObjectCopy.js",
|
|
||||||
"js/lib/Settings.js",
|
|
||||||
|
|
||||||
"js/lib/Comms.js",
|
|
||||||
|
|
||||||
"js/lib/EdgeDetect.js",
|
|
||||||
"js/lib/GuardLine.js",
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"js/modules/PageInfo.js",
|
|
||||||
"js/modules/DebugCanvas.js",
|
|
||||||
"js/modules/ArDetect.js",
|
|
||||||
"js/modules/Zoom.js",
|
|
||||||
"js/modules/Scaler.js",
|
|
||||||
"js/modules/Stretcher.js",
|
|
||||||
|
|
||||||
"js/modules/Resizer.js",
|
|
||||||
"js/lib/PlayerData.js",
|
|
||||||
"js/lib/VideoData.js",
|
|
||||||
|
|
||||||
"js/modules/ActionHandler.js",
|
|
||||||
|
|
||||||
"js/uw.js" ],
|
|
||||||
"all_frames": true
|
|
||||||
}],
|
|
||||||
|
|
||||||
"background": {
|
|
||||||
"scripts": [
|
|
||||||
"js/conf/Debug.js",
|
|
||||||
"js/lib/BrowserDetect.js",
|
|
||||||
|
|
||||||
"js/conf/ExtensionConf.js",
|
|
||||||
|
|
||||||
"js/lib/Comms.js",
|
|
||||||
|
|
||||||
"js/lib/ObjectCopy.js",
|
|
||||||
"js/lib/Settings.js",
|
|
||||||
|
|
||||||
"js/modules/ActionHandler.js",
|
|
||||||
|
|
||||||
"js/uw-bg.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
|
|
||||||
"permissions": [
|
|
||||||
"tabs", "storage", "activeTab", "<all_urls>", "webNavigation"
|
|
||||||
],
|
|
||||||
|
|
||||||
"browser_action": {
|
|
||||||
"default_icon": "res/icons/uw-32.png",
|
|
||||||
"default_popup": "res/popup/popup.html",
|
|
||||||
"default_title": "Ultrawidify"
|
|
||||||
},
|
|
||||||
"options_ui": {
|
|
||||||
"page": "res/settings/settings.html",
|
|
||||||
"browser_style": false,
|
|
||||||
"open_in_tab": true
|
|
||||||
},
|
|
||||||
|
|
||||||
"web_accessible_resources": [
|
|
||||||
"js/*",
|
|
||||||
"res/fonts/*",
|
|
||||||
"res/css/*",
|
|
||||||
|
|
||||||
"res/img/ytplayer-icons/zoom.png",
|
|
||||||
"res/img/ytplayer-icons/unzoom.png",
|
|
||||||
"res/img/ytplayer-icons/fitw.png",
|
|
||||||
"res/img/ytplayer-icons/fith.png",
|
|
||||||
"res/img/ytplayer-icons/reset.png",
|
|
||||||
"res/img/ytplayer-icons/settings.png",
|
|
||||||
|
|
||||||
"res/img/settings/about-bg.png"
|
|
||||||
]
|
|
||||||
}
|
|
43
package.json
Normal file
43
package.json
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"name": "ultravidify-vue",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Ultrawidify but with vue settings and popup",
|
||||||
|
"author": "Tamius Han <tamius.han@gmail.com>",
|
||||||
|
"scripts": {
|
||||||
|
"build": "cross-env NODE_ENV=production webpack --hide-modules",
|
||||||
|
"build:dev": "cross-env NODE_ENV=development webpack --hide-modules",
|
||||||
|
"build-zip": "node scripts/build-zip.js",
|
||||||
|
"watch": "npm run build -- --watch",
|
||||||
|
"watch:dev": "cross-env HMR=true npm run build:dev -- --watch"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@types/core-js": "^2.5.0",
|
||||||
|
"@types/es6-promise": "^3.3.0",
|
||||||
|
"vue": "^2.5.17",
|
||||||
|
"vuex": "^3.0.1",
|
||||||
|
"vuex-webextensions": "^1.2.6",
|
||||||
|
"webextension-polyfill": "^0.3.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.1.2",
|
||||||
|
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
|
||||||
|
"@babel/preset-env": "^7.1.0",
|
||||||
|
"archiver": "^3.0.0",
|
||||||
|
"babel-loader": "^8.0.2",
|
||||||
|
"copy-webpack-plugin": "^4.5.3",
|
||||||
|
"cross-env": "^5.2.0",
|
||||||
|
"css-loader": "^0.28.11",
|
||||||
|
"ejs": "^2.6.1",
|
||||||
|
"file-loader": "^1.1.11",
|
||||||
|
"mini-css-extract-plugin": "^0.4.4",
|
||||||
|
"node-sass": "^4.9.3",
|
||||||
|
"sass-loader": "^7.1.0",
|
||||||
|
"vue-loader": "^15.4.2",
|
||||||
|
"vue-template-compiler": "^2.5.17",
|
||||||
|
"web-ext-types": "^2.1.0",
|
||||||
|
"webpack": "^4.20.2",
|
||||||
|
"webpack-chrome-extension-reloader": "^0.8.3",
|
||||||
|
"webpack-cli": "^3.1.2",
|
||||||
|
"webpack-shell-plugin": "^0.5.0"
|
||||||
|
}
|
||||||
|
}
|
53
scripts/build-zip.js
Normal file
53
scripts/build-zip.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const archiver = require('archiver');
|
||||||
|
|
||||||
|
const DEST_DIR = path.join(__dirname, '../dist');
|
||||||
|
const DEST_ZIP_DIR = path.join(__dirname, '../dist-zip');
|
||||||
|
|
||||||
|
const extractExtensionData = () => {
|
||||||
|
const extPackageJson = require('../package.json');
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: extPackageJson.name,
|
||||||
|
version: extPackageJson.version
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const makeDestZipDirIfNotExists = () => {
|
||||||
|
if(!fs.existsSync(DEST_ZIP_DIR)) {
|
||||||
|
fs.mkdirSync(DEST_ZIP_DIR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildZip = (src, dist, zipFilename) => {
|
||||||
|
console.info(`Building ${zipFilename}...`);
|
||||||
|
|
||||||
|
const archive = archiver('zip', { zlib: { level: 9 }});
|
||||||
|
const stream = fs.createWriteStream(path.join(dist, zipFilename));
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
archive
|
||||||
|
.directory(src, false)
|
||||||
|
.on('error', err => reject(err))
|
||||||
|
.pipe(stream);
|
||||||
|
|
||||||
|
stream.on('close', () => resolve());
|
||||||
|
archive.finalize();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const main = () => {
|
||||||
|
const {name, version} = extractExtensionData();
|
||||||
|
const zipFilename = `${name}-v${version}.zip`;
|
||||||
|
|
||||||
|
makeDestZipDirIfNotExists();
|
||||||
|
|
||||||
|
buildZip(DEST_DIR, DEST_ZIP_DIR, zipFilename)
|
||||||
|
.then(() => console.info('OK'))
|
||||||
|
.catch(console.err);
|
||||||
|
};
|
||||||
|
|
||||||
|
main();
|
55
scripts/remove-evals.js
Normal file
55
scripts/remove-evals.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const BUNDLE_DIR = path.join(__dirname, '../dist');
|
||||||
|
const bundles = [
|
||||||
|
'background.js',
|
||||||
|
'popup/popup.js',
|
||||||
|
'options/options.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
const evalRegexForProduction = /;([a-z])=function\(\){return this}\(\);try{\1=\1\|\|Function\("return this"\)\(\)\|\|\(0,eval\)\("this"\)}catch\(t\){"object"==typeof window&&\(\1=window\)}/g;
|
||||||
|
const evalRegexForDevelopment = /;\\r\\n\\r\\n\/\/ This works in non-strict mode(?:.){1,304}/g;
|
||||||
|
|
||||||
|
const removeEvals = (file) => {
|
||||||
|
console.info(`Removing eval() from ${file}`);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fs.readFile(file, 'utf8', (err, data) => {
|
||||||
|
if(err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const regex = process.env.NODE_ENV === 'production' ? evalRegexForProduction : evalRegexForDevelopment;
|
||||||
|
|
||||||
|
if(!regex.test(data)) {
|
||||||
|
reject(`No CSP specific code found in ${file}.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = data.replace(regex, '=window;');
|
||||||
|
|
||||||
|
fs.writeFile(file, data, (err) => {
|
||||||
|
if(err) {
|
||||||
|
reject(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const main = () => {
|
||||||
|
bundles.forEach(bundle => {
|
||||||
|
removeEvals(path.join(BUNDLE_DIR, bundle))
|
||||||
|
.then(() => console.info(`Bundle ${bundle}: OK`))
|
||||||
|
.catch(console.error);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
main();
|
202
src/common/components/action-alt.vue
Normal file
202
src/common/components/action-alt.vue
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
<template>
|
||||||
|
<div class="action flex flex-column">
|
||||||
|
|
||||||
|
<div class="flex flex-row action-name-cmd-container">
|
||||||
|
<div class="">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="flex action-name">
|
||||||
|
<span class="icon" @click="deleteAction()">🗙</span>
|
||||||
|
<span class="icon" @click="editAction()">🖉</span> {{action.name}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex flex-column cmd-container">
|
||||||
|
<div class="flex bold">
|
||||||
|
Command:
|
||||||
|
</div>
|
||||||
|
<div class="flex cmdlist">
|
||||||
|
{{parseCommand(action.cmd)}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- SCOPES -->
|
||||||
|
<div class="flex flex-column scopes-container">
|
||||||
|
<div class="flex bold">Popup scopes:</div>
|
||||||
|
|
||||||
|
<!-- global scope -->
|
||||||
|
<div v-if="action.scopes.global"
|
||||||
|
class="flex flex-row scope-row"
|
||||||
|
>
|
||||||
|
<div class="flex scope-scope">
|
||||||
|
Global:
|
||||||
|
</div>
|
||||||
|
<div class="flex scope-row-label scope-visible">
|
||||||
|
Visible? <span class="scope-row-highlight">{{action.scopes.global.show ? 'Yes' : 'No'}}</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="action.scopes.global.show"
|
||||||
|
class="flex scope-row-label scope-button-label"
|
||||||
|
>
|
||||||
|
Button label?
|
||||||
|
<span class="scope-row-highlight">
|
||||||
|
{{action.scopes.global.label ? action.scopes.global.label : (action.label ? action.label : '')}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex scope-row-label">
|
||||||
|
Keyboard shortcut:
|
||||||
|
<span class="scope-row-highlight">
|
||||||
|
{{action.scopes.global.shortcut ? parseActionShortcut(action.scopes.global.shortcut[0]) : 'None'}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- site scope -->
|
||||||
|
<div v-if="action.scopes.site"
|
||||||
|
class="flex flex-row scope-row"
|
||||||
|
>
|
||||||
|
<div class="flex scope-scope">
|
||||||
|
Site:
|
||||||
|
</div>
|
||||||
|
<div class="flex scope-row-label scope-visible">
|
||||||
|
Visible? <span class="scope-row-highlight">{{action.scopes.site.show ? 'Yes' : 'No'}}</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="action.scopes.site.show"
|
||||||
|
class="flex scope-row-label scope-button-label"
|
||||||
|
>
|
||||||
|
Button label?
|
||||||
|
<span class="scope-row-highlight">
|
||||||
|
{{action.scopes.site.label ? action.scopes.site.label : (action.label ? action.label : '')}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex scope-row-label">
|
||||||
|
Keyboard shortcut:
|
||||||
|
<span class="scope-row-highlight">
|
||||||
|
{{action.scopes.site.shortcut ? parseActionShortcut(action.scopes.site.shortcut[0]) : 'None'}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- page scope -->
|
||||||
|
<div v-if="action.scopes.page"
|
||||||
|
class="flex flex-row scope-row"
|
||||||
|
>
|
||||||
|
<div class="flex scope-scope">
|
||||||
|
Page:
|
||||||
|
</div>
|
||||||
|
<div class="flex scope-row-label scope-visible">
|
||||||
|
Visible? <span class="scope-row-highlight">{{action.scopes.page.show ? 'Yes' : 'No'}}</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="action.scopes.page.show"
|
||||||
|
class="flex scope-row-label scope-button-label"
|
||||||
|
>
|
||||||
|
Button label?
|
||||||
|
<span class="scope-row-highlight">
|
||||||
|
{{action.scopes.page.label ? action.scopes.page.label : (action.label ? action.label : '')}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex scope-row-label">
|
||||||
|
Keyboard shortcut:
|
||||||
|
<span class="scope-row-highlight">
|
||||||
|
{{action.scopes.page.shortcut ? parseActionShortcut(action.scopes.page.shortcut[0]) : 'None'}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import StretchMode from '../enums/stretch-mode';
|
||||||
|
import KeyboardShortcutParser from '../js/KeyboardShortcutParser';
|
||||||
|
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
StretchMode: StretchMode
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
action: Object,
|
||||||
|
index: Number,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
parseActionShortcut(shortcut) {
|
||||||
|
return KeyboardShortcutParser.parseShortcut(shortcut);
|
||||||
|
},
|
||||||
|
parseCommand(cmd) {
|
||||||
|
let cmdstring = '';
|
||||||
|
for (const c of cmd) {
|
||||||
|
cmdstring += `${c.action} ${c.arg}${c.persistent ? ' persistent' : ''}; `;
|
||||||
|
}
|
||||||
|
return cmdstring;
|
||||||
|
},
|
||||||
|
editAction() {
|
||||||
|
this.$emit('edit');
|
||||||
|
},
|
||||||
|
removeAction() {
|
||||||
|
this.$emit('remove');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import '../../res/css/colors.scss';
|
||||||
|
|
||||||
|
.action {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-name-cmd-container {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-name {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: 300;
|
||||||
|
color: $primary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cmd-container {
|
||||||
|
width: 13.37rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cmdlist {
|
||||||
|
font-family: 'Overpass Mono';
|
||||||
|
font-size: 0.9rem;
|
||||||
|
color: $text-dim;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bold {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scope-scope {
|
||||||
|
width: 5rem;
|
||||||
|
text-align: right !important;
|
||||||
|
color: $secondary-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scope-visible {
|
||||||
|
width: 7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scope-button-label {
|
||||||
|
width: 16rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scope-row-label {
|
||||||
|
color: $text-dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scope-row-highlight {
|
||||||
|
color: $text-normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
76
src/common/components/action-row.vue
Normal file
76
src/common/components/action-row.vue
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<template>
|
||||||
|
<tr>
|
||||||
|
<td class="cmd monospace">{{parseCommand(action.cmd)}}</td>
|
||||||
|
<td class="">{{action.label ? action.label : ""}}</td>
|
||||||
|
<td class="shortcut center-text">{{parseActionShortcut(action)}}</td>
|
||||||
|
<td class="center-text">
|
||||||
|
<div class="checkbox-container">
|
||||||
|
<span class="checkbox"
|
||||||
|
:class="{'checkbox-checked': (action.shortcut && action.shortcut.length &&
|
||||||
|
(action.shortcut[0].onMouseMove || action.shortcut[0].onClick ||
|
||||||
|
action.shortcut[0].onScroll))}"
|
||||||
|
></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="center-text">
|
||||||
|
<div class="checkbox-container">
|
||||||
|
<span class="checkbox"
|
||||||
|
:class="{'checkbox-checked': action.popup_global}"
|
||||||
|
>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="center-text">
|
||||||
|
<div class="checkbox-container">
|
||||||
|
<span class="checkbox"
|
||||||
|
:class="{'checkbox-checked': action.popup_site}"
|
||||||
|
></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="center-text">
|
||||||
|
<div class="checkbox-container">
|
||||||
|
<span class="checkbox"
|
||||||
|
:class="{'checkbox-checked': action.popup}"
|
||||||
|
></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="center-text">
|
||||||
|
<div class="checkbox-container">
|
||||||
|
<span class="checkbox"
|
||||||
|
:class="{'checkbox-checked': action.ui}"
|
||||||
|
></span>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td>{{action.ui_path ? action.ui_path : ""}}</td>
|
||||||
|
</tr>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import StretchMode from '../enums/stretch-mode';
|
||||||
|
import KeyboardShortcutParser from '../js/KeyboardShortcutParser'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
StretchMode: StretchMode
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
action: Object
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
parseActionShortcut(action) {
|
||||||
|
return KeyboardShortcutParser.parseShortcut(action.shortcut[0]);
|
||||||
|
},
|
||||||
|
parseCommand(cmd) {
|
||||||
|
let cmdstring = '';
|
||||||
|
for(const c of cmd) {
|
||||||
|
cmdstring += `${c.action} ${c.arg}${c.persistent ? ' persistent' : ''}; `;
|
||||||
|
}
|
||||||
|
return cmdstring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
17
src/common/components/button.vue
Normal file
17
src/common/components/button.vue
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<template>
|
||||||
|
<div class="button center-text flex"
|
||||||
|
:class="{'selected': selected, 'w24': fixedWidth, 'flex-auto': !fixedWidth }"
|
||||||
|
>
|
||||||
|
{{label}}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
fixedWidth: Boolean,
|
||||||
|
selected: Boolean,
|
||||||
|
label: String,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
8
src/common/enums/stretch-mode.js
Normal file
8
src/common/enums/stretch-mode.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
var StretchMode = Object.freeze({
|
||||||
|
NO_STRETCH: 0,
|
||||||
|
BASIC: 1,
|
||||||
|
HYBRID: 2,
|
||||||
|
CONDITIONAL: 3
|
||||||
|
});
|
||||||
|
|
||||||
|
export default StretchMode;
|
26
src/common/js/KeyboardShortcutParser.js
Normal file
26
src/common/js/KeyboardShortcutParser.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
class KeyboardShortcutParser {
|
||||||
|
static parseShortcut(keypress) {
|
||||||
|
var shortcutCombo = '';
|
||||||
|
|
||||||
|
if (keypress.ctrlKey) {
|
||||||
|
shortcutCombo += 'Ctrl + ';
|
||||||
|
}
|
||||||
|
if (keypress.shiftKey) {
|
||||||
|
shortcutCombo += 'Shift + ';
|
||||||
|
}
|
||||||
|
if (keypress.metaKey) {
|
||||||
|
shortcutCombo += 'Meta + ';
|
||||||
|
}
|
||||||
|
if (keypress.altKey) {
|
||||||
|
shortcutCombo += 'Alt + ';
|
||||||
|
}
|
||||||
|
if (keypress.key) {
|
||||||
|
shortcutCombo += keypress.key.toUpperCase();
|
||||||
|
} else {
|
||||||
|
shortcutCombo += '<mouse action>'
|
||||||
|
}
|
||||||
|
return shortcutCombo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default KeyboardShortcutParser;
|
75
src/ext/conf/ActionList.js
Normal file
75
src/ext/conf/ActionList.js
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
var ActionList = {
|
||||||
|
'set-ar': {
|
||||||
|
name: 'Set aspect ratio',
|
||||||
|
args: [{
|
||||||
|
name: 'Automatic',
|
||||||
|
arg: 'auto',
|
||||||
|
},{
|
||||||
|
name: 'Fit width',
|
||||||
|
arg: 'fitw'
|
||||||
|
},{
|
||||||
|
name: 'Fit height',
|
||||||
|
arg: 'fith',
|
||||||
|
},{
|
||||||
|
name: 'Reset',
|
||||||
|
arg: 'reset',
|
||||||
|
},{
|
||||||
|
name: 'Ratio',
|
||||||
|
customArg: true,
|
||||||
|
hintHTML: '',
|
||||||
|
}],
|
||||||
|
scopes: {
|
||||||
|
global: false,
|
||||||
|
site: false,
|
||||||
|
page: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'stretch': {
|
||||||
|
name: 'Set stretch',
|
||||||
|
args: [{
|
||||||
|
name: 'Normal',
|
||||||
|
arg: 0
|
||||||
|
},{
|
||||||
|
name: 'Basic',
|
||||||
|
arg: 1,
|
||||||
|
},{
|
||||||
|
name: 'Hybrid',
|
||||||
|
arg: 2,
|
||||||
|
},{
|
||||||
|
name: 'Thin borders',
|
||||||
|
arg: 3,
|
||||||
|
},{
|
||||||
|
name: 'Default',
|
||||||
|
arg: -1,
|
||||||
|
scopes: {
|
||||||
|
site: true
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
scopes: {
|
||||||
|
global: true,
|
||||||
|
site: true,
|
||||||
|
page: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'align': {
|
||||||
|
name: 'Set video alignment',
|
||||||
|
args: [{
|
||||||
|
name: 'Left',
|
||||||
|
arg: 'left',
|
||||||
|
},{
|
||||||
|
name: 'Center',
|
||||||
|
arg: 'center',
|
||||||
|
},{
|
||||||
|
name: 'Right',
|
||||||
|
arg: 'right'
|
||||||
|
},{
|
||||||
|
name: 'Default',
|
||||||
|
arg: 'default',
|
||||||
|
scopes: {
|
||||||
|
site: true,
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ActionList;
|
71
src/ext/conf/BrowserDetect.js
Normal file
71
src/ext/conf/BrowserDetect.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
import Debug from '../conf/Debug';
|
||||||
|
|
||||||
|
var _bd_usebrowser = "firefox";
|
||||||
|
var _bd_isFirefox = true;
|
||||||
|
var _bd_isChrome = false;
|
||||||
|
var _bd_isEdge = false; // we'll see if FF
|
||||||
|
|
||||||
|
// try{
|
||||||
|
// // todo: find something that works in firefox but not in edge (or vice-versa)
|
||||||
|
// // note that this function returns a promise! and is broken for some reason
|
||||||
|
// var browserinfo = browser.runtime.getBrowserInfo();
|
||||||
|
|
||||||
|
// // we don't need to actually check because only firefox supports that.
|
||||||
|
// // if we're not on firefox, the above call will probably throw an exception anyway.
|
||||||
|
// // if browsers other than firefox start supporting that, well ... we'll also need to actually await for promise
|
||||||
|
// // that getBrowserInfo() returns to resolve.
|
||||||
|
|
||||||
|
// // if (Browser.name.toLowerCase().indexOf(firefox) !== -1 || Browser.vendor.toLowerCase().indexOf(mozilla) !== -1) {
|
||||||
|
// _bd_isFirefox = true;
|
||||||
|
// _bd_isEdge = false;
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// }
|
||||||
|
// catch (e) {
|
||||||
|
// if(Debug.debug) {
|
||||||
|
// console.info("[BrowserDetect] browser.runtime.getBrowserInfo() probably failed. This means we're probably not using firefox.", e)
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
|
try {
|
||||||
|
if(browser === undefined){ // This is a good sign we're in chrome or chromium-based browsers
|
||||||
|
if(chrome){
|
||||||
|
browser = chrome;
|
||||||
|
_bd_usebrowser = "chrome";
|
||||||
|
_bd_isChrome = true;
|
||||||
|
_bd_isEdge = false;
|
||||||
|
_bd_isFirefox = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log("e=",e);
|
||||||
|
if(chrome){
|
||||||
|
// browser = chrome;
|
||||||
|
_bd_usebrowser = "chrome";
|
||||||
|
_bd_isChrome = true;
|
||||||
|
_bd_isEdge = false;
|
||||||
|
_bd_isFirefox = false;
|
||||||
|
} else {
|
||||||
|
console.log("No chrome either.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("extension didn't crash after browser === undefined failed");
|
||||||
|
|
||||||
|
var BrowserDetect = {
|
||||||
|
usebrowser: _bd_usebrowser,
|
||||||
|
firefox: _bd_isFirefox,
|
||||||
|
chrome: _bd_isChrome,
|
||||||
|
edge: _bd_isEdge
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Debug.debug){
|
||||||
|
console.log("BrowserDetect loaded! Here's BrowserDetect object:", BrowserDetect)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (BrowserDetect.firefox) {
|
||||||
|
// browser = window.browser;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default BrowserDetect;
|
@ -1,8 +1,8 @@
|
|||||||
// Set prod to true when releasing
|
// Set prod to true when releasing
|
||||||
//_prod = true;
|
//_prod = true;
|
||||||
_prod = false;
|
const _prod = false;
|
||||||
|
|
||||||
Debug = {
|
var Debug = {
|
||||||
init: true,
|
init: true,
|
||||||
debug: true,
|
debug: true,
|
||||||
keyboard: true,
|
keyboard: true,
|
||||||
@ -48,5 +48,11 @@ function __disableAllDebug(obj) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug = Debug;
|
||||||
|
|
||||||
if(Debug.debug)
|
if(Debug.debug)
|
||||||
console.log("Guess we're debugging ultrawidify then. Debug.js must always load first, and others must follow.\nLoading: Debug.js");
|
console.log("Guess we're debugging ultrawidify then. Debug.js must always load first, and others must follow.\nLoading: Debug.js");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export default Debug;
|
@ -1,3 +1,6 @@
|
|||||||
|
import Debug from './Debug';
|
||||||
|
import currentBrowser from './BrowserDetect';
|
||||||
|
|
||||||
if(Debug.debug)
|
if(Debug.debug)
|
||||||
console.log("Loading: ExtensionConf.js");
|
console.log("Loading: ExtensionConf.js");
|
||||||
|
|
||||||
@ -132,57 +135,6 @@ var ExtensionConf = {
|
|||||||
},
|
},
|
||||||
keyboard: {
|
keyboard: {
|
||||||
},
|
},
|
||||||
// List of all possible actions, for use in settings
|
|
||||||
// TODO: move to separate file as this shouldn't be user-settable
|
|
||||||
actionsList: [{
|
|
||||||
action: 'set-ar',
|
|
||||||
args: [{
|
|
||||||
name: 'Automatic',
|
|
||||||
arg: 'auto',
|
|
||||||
},{
|
|
||||||
name: 'Fit width',
|
|
||||||
arg: 'fitw'
|
|
||||||
},{
|
|
||||||
name: 'Fit height',
|
|
||||||
arg: 'fith',
|
|
||||||
},{
|
|
||||||
name: 'Reset',
|
|
||||||
arg: 'reset',
|
|
||||||
},{
|
|
||||||
name: 'Ratio',
|
|
||||||
customArg: true,
|
|
||||||
customLabel: true,
|
|
||||||
}]
|
|
||||||
},{
|
|
||||||
action: 'stretch',
|
|
||||||
args: [{
|
|
||||||
name: 'Normal',
|
|
||||||
arg: 0
|
|
||||||
},{
|
|
||||||
name: 'Basic',
|
|
||||||
arg: 1,
|
|
||||||
},{
|
|
||||||
name: 'Hybrid',
|
|
||||||
arg: 2,
|
|
||||||
},{
|
|
||||||
name: 'Thin borders',
|
|
||||||
arg: 3,
|
|
||||||
}],
|
|
||||||
sitewide: true, // if true, you can see this in site settings
|
|
||||||
global: true, // if true, it can appear in extension settings
|
|
||||||
},{
|
|
||||||
action: 'align',
|
|
||||||
args: [{
|
|
||||||
name: 'Left',
|
|
||||||
arg: 'left',
|
|
||||||
},{
|
|
||||||
name: 'Center',
|
|
||||||
arg: 'center',
|
|
||||||
},{
|
|
||||||
name: 'Right',
|
|
||||||
arg: 'right'
|
|
||||||
}]
|
|
||||||
}],
|
|
||||||
// -----------------------------------------
|
// -----------------------------------------
|
||||||
// ::: ACTIONS :::
|
// ::: ACTIONS :::
|
||||||
// -----------------------------------------
|
// -----------------------------------------
|
||||||
@ -190,482 +142,601 @@ var ExtensionConf = {
|
|||||||
//
|
//
|
||||||
// Polje 'shortcut' je tabela, če se slučajno lotimo kdaj delati choordov.
|
// Polje 'shortcut' je tabela, če se slučajno lotimo kdaj delati choordov.
|
||||||
actions: [{
|
actions: [{
|
||||||
|
name: 'Trigger automatic detection', // name displayed in settings
|
||||||
|
label: 'Automatic', // name displayed in ui (can be overriden in scope/playerUi)
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 'auto',
|
arg: 'auto',
|
||||||
persistent: false, // optional, false by default. If true, change doesn't take effect immediately.
|
persistent: false, // optional, false by default. If true, change doesn't take effect immediately.
|
||||||
// Instead, this action saves stuff to settings
|
// Instead, this action saves stuff to settings
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'a',
|
global: { // if 'global' is undefined, 'show' is presumed to be 'false'
|
||||||
ctrlKey: false,
|
show: false,
|
||||||
metaKey: false,
|
},
|
||||||
altKey: false,
|
site: {
|
||||||
shiftKey: false,
|
show: false,
|
||||||
onKeyUp: true,
|
},
|
||||||
onKeyDown: false,
|
page: {
|
||||||
}],
|
show: true,
|
||||||
popup: true,
|
label: 'Automatic', // example override, takes precedence over default label
|
||||||
popup_site: false, // optional, false by default
|
shortcut: [{
|
||||||
popup_global: false,// optional, false by default
|
key: 'a',
|
||||||
ui: true,
|
ctrlKey: false,
|
||||||
ui_path: 'crop',
|
metaKey: false,
|
||||||
label: 'Automatic'
|
altKey: false,
|
||||||
|
shiftKey: false,
|
||||||
|
onKeyUp: true,
|
||||||
|
onKeyDown: false,
|
||||||
|
}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'crop',
|
||||||
|
},
|
||||||
},{
|
},{
|
||||||
|
name: 'Reset to default',
|
||||||
|
label: 'Reset',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 'reset',
|
arg: 'reset',
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'r',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'r',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: true,
|
||||||
ui: true,
|
onKeyDown: false,
|
||||||
ui_path: 'crop',
|
}],
|
||||||
label: 'Reset',
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'crop'
|
||||||
|
},
|
||||||
},{
|
},{
|
||||||
|
name: 'Fit to width',
|
||||||
|
label: 'Fit width',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 'fitw',
|
arg: 'fitw',
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'w',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'w',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: true,
|
||||||
ui: true,
|
onKeyDown: false,
|
||||||
ui_path: 'crop',
|
}],
|
||||||
label: 'Fit width',
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'crop'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Fit to height',
|
||||||
|
label: 'Fit height',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 'fith',
|
arg: 'fith',
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'e',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'e',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: true,
|
||||||
ui: true,
|
onKeyDown: false,
|
||||||
ui_path: 'crop',
|
}]
|
||||||
label: 'Fit height',
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'crop'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Set aspect ratio to 16:9',
|
||||||
|
label: '16:9',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 1.78,
|
arg: 1.78,
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 's',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 's',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: false,
|
metaKey: false,
|
||||||
onKeyDown: true,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: false,
|
||||||
ui: true,
|
onKeyDown: true,
|
||||||
ui_path: 'crop',
|
}],
|
||||||
label: '16:9',
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'crop'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Set aspect ratio to 21:9 (2.39:1)',
|
||||||
|
label: '21:9',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 2.39,
|
arg: 2.39,
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'd',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'd',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: false,
|
metaKey: false,
|
||||||
onKeyDown: true,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: false,
|
||||||
ui: true,
|
onKeyDown: true,
|
||||||
ui_path: 'crop',
|
}]
|
||||||
label: '21:9'
|
}
|
||||||
},{
|
},
|
||||||
cmd: [{
|
playerUi: {
|
||||||
action: 'set-ar',
|
show: true,
|
||||||
arg: 2.35,
|
path: 'crop'
|
||||||
}],
|
}
|
||||||
shortcut: [{
|
|
||||||
key: 'q',
|
|
||||||
ctrlKey: false,
|
|
||||||
metaKey: false,
|
|
||||||
altKey: false,
|
|
||||||
shiftKey: false,
|
|
||||||
onKeyUp: false,
|
|
||||||
onKeyDown: true,
|
|
||||||
}],
|
|
||||||
popup: true,
|
|
||||||
ui: true,
|
|
||||||
ui_path: 'crop',
|
|
||||||
label: '2.35',
|
|
||||||
},{
|
},{
|
||||||
|
name: 'Set aspect ratio to 18:9',
|
||||||
|
label: '18:9',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-ar',
|
action: 'set-ar',
|
||||||
arg: 2.0,
|
arg: 2.0,
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'x',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'x',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: true,
|
||||||
ui: true,
|
onKeyDown: false,
|
||||||
ui_path: 'crop',
|
}]
|
||||||
label: '18:9'
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'crop',
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Zoom in',
|
||||||
|
label: 'Zoom',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-zoom',
|
action: 'set-zoom',
|
||||||
arg: 0.1
|
arg: 0.1
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'z',
|
page: {
|
||||||
ctrlKey: false,
|
show: false,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'z',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: false,
|
onKeyUp: true,
|
||||||
ui: false,
|
onKeyDown: false,
|
||||||
ui_path: 'crop',
|
}],
|
||||||
label: 'Zoom',
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: false,
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Zoom out',
|
||||||
|
label: 'Unzoom',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-zoom',
|
action: 'set-zoom',
|
||||||
arg: -0.1
|
arg: -0.1
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'u',
|
page: {
|
||||||
ctrlKey: false,
|
show: false,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'u',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: false,
|
onKeyUp: true,
|
||||||
ui: false,
|
onKeyDown: false,
|
||||||
label: 'Unzoom',
|
}],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: false
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Toggle panning mode',
|
||||||
|
label: 'Toggle pan',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'toggle-pan',
|
action: 'toggle-pan',
|
||||||
arg: 'toggle'
|
arg: 'toggle'
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
key: 'p',
|
page: {
|
||||||
ctrlKey: false,
|
show: true,
|
||||||
metaKey: false,
|
shortcut: [{
|
||||||
altKey: false,
|
key: 'p',
|
||||||
shiftKey: false,
|
ctrlKey: false,
|
||||||
onKeyUp: true,
|
metaKey: false,
|
||||||
onKeyDown: false,
|
altKey: false,
|
||||||
}],
|
shiftKey: false,
|
||||||
popup: true,
|
onKeyUp: true,
|
||||||
ui: true,
|
onKeyDown: false,
|
||||||
ui_path: 'crop',
|
}]
|
||||||
label: 'Toggle panning mode',
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'zoom'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Hold to pan',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'pan',
|
action: 'pan',
|
||||||
arg: 'toggle',
|
arg: 'toggle',
|
||||||
}],
|
}],
|
||||||
shortcut: [{
|
scopes: {
|
||||||
ctrlKey: false,
|
page: {
|
||||||
metaKey: false,
|
show: false,
|
||||||
altKey: false,
|
shortcut: [{
|
||||||
shiftKey: true,
|
ctrlKey: false,
|
||||||
onKeyDown: false,
|
metaKey: false,
|
||||||
onKeyUp: false,
|
altKey: false,
|
||||||
onMouseMove: true,
|
shiftKey: true,
|
||||||
}],
|
onKeyDown: false,
|
||||||
popup: false,
|
onKeyUp: false,
|
||||||
ui: false,
|
onMouseMove: true,
|
||||||
ui_path: 'crop',
|
}],
|
||||||
label: 'Pan (hold)'
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
//
|
//
|
||||||
// S T R E T C H I N G
|
// S T R E T C H I N G
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
|
name: 'Set stretch to "none"',
|
||||||
|
label: 'Don\'t stretch',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-stretch',
|
action: 'set-stretch',
|
||||||
arg: 0,
|
arg: 0,
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
label: 'Normal'
|
||||||
label: 'Normal',
|
},
|
||||||
|
site: {
|
||||||
|
show: true,
|
||||||
|
label: 'Normal'
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
label: 'Normal'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'stretch'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Set stretch to "basic"',
|
||||||
|
label: 'Basic stretch',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-stretch',
|
action: 'set-stretch',
|
||||||
arg: 1,
|
arg: 1,
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
label: 'Basic'
|
||||||
ui_path: 'stretch',
|
},
|
||||||
label: 'Basic'
|
site: {
|
||||||
|
show: true,
|
||||||
|
label: 'Basic'
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
label: 'Basic'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'stretch'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Set stretch to "hybrid"',
|
||||||
|
label: 'Hybrid stretch',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-stretch',
|
action: 'set-stretch',
|
||||||
arg: 2,
|
arg: 2,
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
label: 'Hybrid'
|
||||||
ui_path: 'stretch',
|
},
|
||||||
label: 'Hybrid'
|
site: {
|
||||||
|
show: true,
|
||||||
|
label: 'Hybrid'
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
label: 'Hybrid'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'stretch'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Stretch only to hide thin borders',
|
||||||
|
label: 'Thin borders only',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-stretch',
|
action: 'set-stretch',
|
||||||
arg: 3,
|
arg: 3,
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
label: 'Thin borders'
|
||||||
ui_path: 'stretch',
|
},
|
||||||
label: 'Thin borders'
|
site: {
|
||||||
|
show: true,
|
||||||
|
label: 'Thin borders'
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
label: 'Thin borders'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'stretch'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Set stretch to default value',
|
||||||
|
label: 'Default',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-stretch',
|
action: 'set-stretch',
|
||||||
arg: -1,
|
arg: -1,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_site: true,
|
site: {
|
||||||
popup_global: false,
|
show: true,
|
||||||
ui: false,
|
}
|
||||||
label: 'Default'
|
}
|
||||||
},
|
},
|
||||||
//
|
//
|
||||||
// A L I G N M E N T
|
// A L I G N M E N T
|
||||||
//
|
//
|
||||||
{
|
{
|
||||||
|
name: 'Align video to the left',
|
||||||
|
label: 'Left',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-alignment',
|
action: 'set-alignment',
|
||||||
arg: 'left'
|
arg: 'left'
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'align',
|
site: {
|
||||||
label: 'Left',
|
show: true,
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'align'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Align video to center',
|
||||||
|
label: 'Center',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-alignment',
|
action: 'set-alignment',
|
||||||
arg: 'center'
|
arg: 'center'
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'align',
|
site: {
|
||||||
label: 'Center',
|
show: true,
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'align'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Align video to the right',
|
||||||
|
label: 'Right',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-alignment',
|
action: 'set-alignment',
|
||||||
arg: 'right'
|
arg: 'right'
|
||||||
}],
|
}],
|
||||||
popup: true,
|
scopes: {
|
||||||
popup_site: true,
|
global: {
|
||||||
popup_global: true,
|
show: true,
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'align',
|
site: {
|
||||||
label: 'Right',
|
show: true,
|
||||||
|
},
|
||||||
|
page: {
|
||||||
|
show: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
playerUi: {
|
||||||
|
show: true,
|
||||||
|
path: 'align'
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Use default alignment',
|
||||||
|
label: 'Default',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-alignment',
|
action: 'set-alignment',
|
||||||
arg: 'default'
|
arg: 'default'
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_site: true,
|
site: {
|
||||||
popup_global: false,
|
show: true,
|
||||||
ui: false,
|
}
|
||||||
label: 'Default',
|
}
|
||||||
},
|
},
|
||||||
//
|
//
|
||||||
// E N A B L E E X T E N S I O N / A U T O A R
|
// E N A B L E E X T E N S I O N / A U T O A R
|
||||||
// (for sites/extension tab in the popup)
|
// (for sites/extension tab in the popup)
|
||||||
//
|
//
|
||||||
{ // extension options:
|
{
|
||||||
// global
|
name: 'Enable extension',
|
||||||
|
label: 'Enable',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-extension-mode',
|
action: 'set-extension-mode',
|
||||||
arg: 'blacklist',
|
arg: 'blacklist',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: true,
|
global: {
|
||||||
popup_site: false,
|
show: true,
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'settings/global',
|
site: {
|
||||||
label: 'Enable'
|
show: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Enable extension on whitelisted sites only',
|
||||||
|
label: 'On whitelist only',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-extension-mode',
|
action: 'set-extension-mode',
|
||||||
arg: 'whitelist',
|
arg: 'whitelist',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: true,
|
global: {
|
||||||
popup_site: false,
|
show: true
|
||||||
ui: true,
|
}
|
||||||
ui_path: 'settings/global',
|
}
|
||||||
label: 'On whitelisted only'
|
|
||||||
},{
|
|
||||||
cmd: [{
|
|
||||||
action: 'set-extension-mode',
|
|
||||||
arg: 'disabled',
|
|
||||||
persistent: true,
|
|
||||||
}],
|
|
||||||
popup: false,
|
|
||||||
popup_global: true,
|
|
||||||
popup_site: false,
|
|
||||||
ui: true,
|
|
||||||
ui_path: 'settings/global',
|
|
||||||
label: 'Disabled'
|
|
||||||
},{
|
|
||||||
// site-only
|
|
||||||
cmd: [{
|
|
||||||
action: 'set-extension-mode',
|
|
||||||
arg: 'whitelist',
|
|
||||||
persistent: true,
|
|
||||||
}],
|
|
||||||
popup: false,
|
|
||||||
popup_global: false,
|
|
||||||
popup_site: true,
|
|
||||||
ui: true,
|
|
||||||
ui_path: 'settings/site',
|
|
||||||
label: 'Enable'
|
|
||||||
},{
|
},{
|
||||||
|
name: 'Extension mode: use default settings',
|
||||||
|
label: 'Default',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-extension-mode',
|
action: 'set-extension-mode',
|
||||||
arg: 'default',
|
arg: 'default',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: false,
|
site: {
|
||||||
popup_site: true,
|
show: true
|
||||||
ui: true,
|
}
|
||||||
ui_path: 'settings/site',
|
}
|
||||||
label: 'Use default option'
|
|
||||||
},{
|
},{
|
||||||
|
name: 'Disable extension',
|
||||||
|
label: 'Disable',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-extension-mode',
|
action: 'set-extension-mode',
|
||||||
arg: 'disabled',
|
arg: 'disabled',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: false,
|
global: {
|
||||||
popup_site: true,
|
show: true,
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'settings/site',
|
site: {
|
||||||
label: 'Disable'
|
show: true,
|
||||||
},{ // extension options:
|
}
|
||||||
// global
|
}
|
||||||
|
},{
|
||||||
|
name: 'Enable automatic aspect ratio detection',
|
||||||
|
label: 'Enabled',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-autoar-mode',
|
action: 'set-autoar-mode',
|
||||||
arg: 'blacklist',
|
arg: 'blacklist',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: true,
|
global: {
|
||||||
popup_site: false,
|
show: true
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'settings/global',
|
site: {
|
||||||
label: 'Enable'
|
show: true
|
||||||
|
}
|
||||||
|
}
|
||||||
},{
|
},{
|
||||||
|
name: 'Enable automatic aspect ratio detection on whitelisted sites only',
|
||||||
|
label: 'On whitelist only',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-autoar-mode',
|
action: 'set-autoar-mode',
|
||||||
arg: 'whitelist',
|
arg: 'whitelist',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: true,
|
global: {
|
||||||
popup_site: false,
|
show: true,
|
||||||
ui: true,
|
}
|
||||||
ui_path: 'settings/global',
|
}
|
||||||
label: 'On whitelisted only'
|
|
||||||
},{
|
},{
|
||||||
cmd: [{
|
name: 'Use default settings for automatic aspect ratio detection',
|
||||||
action: 'set-autoar-mode',
|
label: 'Default',
|
||||||
arg: 'disabled',
|
|
||||||
persistent: true,
|
|
||||||
}],
|
|
||||||
popup: false,
|
|
||||||
popup_global: true,
|
|
||||||
popup_site: false,
|
|
||||||
ui: true,
|
|
||||||
ui_path: 'settings/global',
|
|
||||||
label: 'Disabled'
|
|
||||||
},{
|
|
||||||
// site-only
|
|
||||||
cmd: [{
|
|
||||||
action: 'set-autoar-mode',
|
|
||||||
arg: 'whitelist',
|
|
||||||
persistent: true,
|
|
||||||
}],
|
|
||||||
popup: false,
|
|
||||||
popup_global: false,
|
|
||||||
popup_site: true,
|
|
||||||
ui: true,
|
|
||||||
ui_path: 'settings/global',
|
|
||||||
label: 'Enable'
|
|
||||||
},{
|
|
||||||
|
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-autoar-mode',
|
action: 'set-autoar-mode',
|
||||||
arg: 'default',
|
arg: 'default',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: false,
|
site: {
|
||||||
popup_site: true,
|
show: true,
|
||||||
ui: true,
|
}
|
||||||
ui_path: 'settings/global',
|
}
|
||||||
label: 'Use default option'
|
|
||||||
},{
|
},{
|
||||||
|
name: 'Disable automatic aspect ratio detection',
|
||||||
|
label: 'Disable',
|
||||||
cmd: [{
|
cmd: [{
|
||||||
action: 'set-autoar-mode',
|
action: 'set-autoar-mode',
|
||||||
arg: 'disabled',
|
arg: 'disabled',
|
||||||
persistent: true,
|
persistent: true,
|
||||||
}],
|
}],
|
||||||
popup: false,
|
scopes: {
|
||||||
popup_global: false,
|
global: {
|
||||||
popup_site: true,
|
show: true,
|
||||||
ui: true,
|
},
|
||||||
ui_path: 'settings/site',
|
site: {
|
||||||
label: 'Disable'
|
show: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
},],
|
},],
|
||||||
// -----------------------------------------
|
// -----------------------------------------
|
||||||
// ::: SITE CONFIGURATION :::
|
// ::: SITE CONFIGURATION :::
|
||||||
@ -709,10 +780,12 @@ var ExtensionConf = {
|
|||||||
},
|
},
|
||||||
"www.netflix.com" : {
|
"www.netflix.com" : {
|
||||||
status: "enabled",
|
status: "enabled",
|
||||||
arStatus: BrowserDetect.firefox ? "default" : "disabled",
|
arStatus: currentBrowser.firefox ? "default" : "disabled",
|
||||||
statusEmbedded: "enabled",
|
statusEmbedded: "enabled",
|
||||||
override: false,
|
override: false,
|
||||||
type: 'official'
|
type: 'official'
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default ExtensionConf;
|
@ -4,11 +4,11 @@ if(Debug.debug){
|
|||||||
|
|
||||||
class CommsClient {
|
class CommsClient {
|
||||||
constructor(name, settings) {
|
constructor(name, settings) {
|
||||||
if (BrowserDetect.firefox) {
|
if (window.currentBrowser.firefox) {
|
||||||
this.port = browser.runtime.connect({name: name});
|
this.port = browser.runtime.connect({name: name});
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (window.currentBrowser.chrome) {
|
||||||
this.port = chrome.runtime.connect({name: name});
|
this.port = chrome.runtime.connect({name: name});
|
||||||
} else if (BrowserDetect.edge) {
|
} else if (window.currentBrowser.edge) {
|
||||||
this.port = browser.runtime.connect({name: name})
|
this.port = browser.runtime.connect({name: name})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,7 +24,7 @@ class CommsClient {
|
|||||||
destroy() {
|
destroy() {
|
||||||
this.pageInfo = null;
|
this.pageInfo = null;
|
||||||
this.settings = null;
|
this.settings = null;
|
||||||
if (!BrowserDetect.edge) { // edge is a very special browser made by outright morons.
|
if (!window.currentBrowser.edge) { // edge is a very special browser made by outright morons.
|
||||||
this.port.onMessage.removeListener(this._listener);
|
this.port.onMessage.removeListener(this._listener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -39,7 +39,7 @@ class CommsClient {
|
|||||||
|
|
||||||
var ths = this;
|
var ths = this;
|
||||||
this._listener = m => ths.processReceivedMessage(m);
|
this._listener = m => ths.processReceivedMessage(m);
|
||||||
if (!BrowserDetect.edge) {
|
if (!window.currentBrowser.edge) {
|
||||||
this.port.onMessage.removeListener(this._listener);
|
this.port.onMessage.removeListener(this._listener);
|
||||||
}
|
}
|
||||||
this.port.onMessage.addListener(this._listener);
|
this.port.onMessage.addListener(this._listener);
|
||||||
@ -98,12 +98,12 @@ class CommsClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async sendMessage_nonpersistent(message){
|
async sendMessage_nonpersistent(message){
|
||||||
if(BrowserDetect.firefox){
|
if(window.currentBrowser.firefox){
|
||||||
return browser.runtime.sendMessage(message)
|
return browser.runtime.sendMessage(message)
|
||||||
} else {
|
} else {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
try{
|
try{
|
||||||
if(BrowserDetect.edge){
|
if(window.currentBrowser.edge){
|
||||||
browser.runtime.sendMessage(message, function(response){
|
browser.runtime.sendMessage(message, function(response){
|
||||||
var r = response;
|
var r = response;
|
||||||
resolve(r);
|
resolve(r);
|
||||||
@ -171,7 +171,7 @@ class CommsServer {
|
|||||||
|
|
||||||
var ths = this;
|
var ths = this;
|
||||||
|
|
||||||
if (BrowserDetect.firefox) {
|
if (window.currentBrowser.firefox) {
|
||||||
browser.runtime.onConnect.addListener(p => ths.onConnect(p));
|
browser.runtime.onConnect.addListener(p => ths.onConnect(p));
|
||||||
browser.runtime.onMessage.addListener(m => ths.processReceivedMessage_nonpersistent_ff(m));
|
browser.runtime.onMessage.addListener(m => ths.processReceivedMessage_nonpersistent_ff(m));
|
||||||
} else {
|
} else {
|
||||||
@ -209,7 +209,7 @@ class CommsServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _getActiveTab() {
|
async _getActiveTab() {
|
||||||
if (BrowserDetect.firefox) {
|
if (window.currentBrowser.firefox) {
|
||||||
return await browser.tabs.query({currentWindow: true, active: true});
|
return await browser.tabs.query({currentWindow: true, active: true});
|
||||||
} else {
|
} else {
|
||||||
return await new Promise( (resolve, reject) => {
|
return await new Promise( (resolve, reject) => {
|
||||||
@ -440,12 +440,12 @@ class CommsServer {
|
|||||||
|
|
||||||
class Comms {
|
class Comms {
|
||||||
static async sendMessage(message){
|
static async sendMessage(message){
|
||||||
if(BrowserDetect.firefox){
|
if(window.currentBrowser.firefox){
|
||||||
return browser.runtime.sendMessage(message)
|
return browser.runtime.sendMessage(message)
|
||||||
} else {
|
} else {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
try{
|
try{
|
||||||
if(BrowserDetect.edge){
|
if(window.currentBrowser.edge){
|
||||||
browser.runtime.sendMessage(message, function(response){
|
browser.runtime.sendMessage(message, function(response){
|
||||||
var r = response;
|
var r = response;
|
||||||
resolve(r);
|
resolve(r);
|
@ -50,4 +50,6 @@ class ObjectCopy {
|
|||||||
// target: object that we want
|
// target: object that we want
|
||||||
// ignoreKeys: if key is an object, we don't recursively call this function on that key
|
// ignoreKeys: if key is an object, we don't recursively call this function on that key
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default ObjectCopy;
|
@ -1,3 +1,8 @@
|
|||||||
|
import Debug from '../conf/Debug';
|
||||||
|
import currentBrowser from '../conf/BrowserDetect';
|
||||||
|
import ExtensionConf from '../conf/ExtensionConf';
|
||||||
|
|
||||||
|
|
||||||
class Settings {
|
class Settings {
|
||||||
|
|
||||||
constructor(activeSettings, updateCallback) {
|
constructor(activeSettings, updateCallback) {
|
||||||
@ -7,9 +12,17 @@ class Settings {
|
|||||||
this.version = undefined;
|
this.version = undefined;
|
||||||
this.updateCallback = updateCallback;
|
this.updateCallback = updateCallback;
|
||||||
|
|
||||||
|
|
||||||
|
console.log("chrome object:", chrome)
|
||||||
|
console.log("browser.storage", browser.storage)
|
||||||
|
console.log("browser object:", browser)
|
||||||
|
console.log("window.browser", window.browser)
|
||||||
|
console.log("ExtensionConf", ExtensionConf)
|
||||||
|
|
||||||
|
|
||||||
const ths = this;
|
const ths = this;
|
||||||
|
|
||||||
if(BrowserDetect.firefox) {
|
if(currentBrowser.firefox) {
|
||||||
browser.storage.onChanged.addListener( (changes, area) => {
|
browser.storage.onChanged.addListener( (changes, area) => {
|
||||||
if (Debug.debug && Debug.debugStorage) {
|
if (Debug.debug && Debug.debugStorage) {
|
||||||
console.log("[Settings::<storage/on change>] Settings have been changed outside of here. Updating active settings. Changes:", changes, "storage area:", area);
|
console.log("[Settings::<storage/on change>] Settings have been changed outside of here. Updating active settings. Changes:", changes, "storage area:", area);
|
||||||
@ -23,13 +36,13 @@ class Settings {
|
|||||||
|
|
||||||
if(this.updateCallback) {
|
if(this.updateCallback) {
|
||||||
try {
|
try {
|
||||||
updateCallback();
|
updateCallback(ths);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("[Settings] CALLING UPDATE CALLBACK FAILED.")
|
console.log("[Settings] CALLING UPDATE CALLBACK FAILED.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (currentBrowser.chrome) {
|
||||||
chrome.storage.onChanged.addListener( (changes, area) => {
|
chrome.storage.onChanged.addListener( (changes, area) => {
|
||||||
if (Debug.debug && Debug.debugStorage) {
|
if (Debug.debug && Debug.debugStorage) {
|
||||||
console.log("[Settings::<storage/on change>] Settings have been changed outside of here. Updating active settings. Changes:", changes, "storage area:", area);
|
console.log("[Settings::<storage/on change>] Settings have been changed outside of here. Updating active settings. Changes:", changes, "storage area:", area);
|
||||||
@ -43,7 +56,7 @@ class Settings {
|
|||||||
|
|
||||||
if(this.updateCallback) {
|
if(this.updateCallback) {
|
||||||
try {
|
try {
|
||||||
updateCallback();
|
updateCallback(ths);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("[Settings] CALLING UPDATE CALLBACK FAILED.")
|
console.log("[Settings] CALLING UPDATE CALLBACK FAILED.")
|
||||||
}
|
}
|
||||||
@ -61,6 +74,7 @@ class Settings {
|
|||||||
if (Debug.flushStoredSettings) {
|
if (Debug.flushStoredSettings) {
|
||||||
console.log("%c[Settings::init] Debug.flushStoredSettings is true. Using default settings", "background: #d00; color: #ffd");
|
console.log("%c[Settings::init] Debug.flushStoredSettings is true. Using default settings", "background: #d00; color: #ffd");
|
||||||
Debug.flushStoredSettings = false; // don't do it again this session
|
Debug.flushStoredSettings = false; // don't do it again this session
|
||||||
|
this.setDefaultSettings();
|
||||||
this.active = this.getDefaultSettings();
|
this.active = this.getDefaultSettings();
|
||||||
return this.active;
|
return this.active;
|
||||||
}
|
}
|
||||||
@ -77,11 +91,11 @@ class Settings {
|
|||||||
this.active = settings;
|
this.active = settings;
|
||||||
|
|
||||||
// check if extension has been updated. If not, return settings as they were retreived
|
// check if extension has been updated. If not, return settings as they were retreived
|
||||||
if (BrowserDetect.firefox) {
|
if (currentBrowser.firefox) {
|
||||||
this.version = browser.runtime.getManifest().version;
|
this.version = browser.runtime.getManifest().version;
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (currentBrowser.chrome) {
|
||||||
this.version = chrome.runtime.getManifest().version;
|
this.version = chrome.runtime.getManifest().version;
|
||||||
} else if (BrowserDetect.edge) {
|
} else if (currentBrowser.edge) {
|
||||||
this.version = browser.runtime.getManifest().version;
|
this.version = browser.runtime.getManifest().version;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,19 +124,19 @@ class Settings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async get() {
|
async get() {
|
||||||
if (BrowserDetect.firefox) {
|
if (currentBrowser.firefox) {
|
||||||
const ret = await browser.storage.local.get('uwSettings');
|
const ret = await browser.storage.local.get('uwSettings');
|
||||||
try {
|
try {
|
||||||
return JSON.parse(ret.uwSettings);
|
return JSON.parse(ret.uwSettings);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (currentBrowser.chrome) {
|
||||||
const ret = new Promise( (resolve, reject) => {
|
const ret = new Promise( (resolve, reject) => {
|
||||||
chrome.storage.sync.get('uwSettings', (res) => resolve(res));
|
chrome.storage.sync.get('uwSettings', (res) => resolve(res));
|
||||||
});
|
});
|
||||||
return ret['uwSettings'];
|
return ret['uwSettings'];
|
||||||
} else if (BrowserDetect.edge) {
|
} else if (currentBrowser.edge) {
|
||||||
const ret = new Promise( (resolve, reject) => {
|
const ret = new Promise( (resolve, reject) => {
|
||||||
browser.storage.sync.get('uwSettings', (res) => resolve(res));
|
browser.storage.sync.get('uwSettings', (res) => resolve(res));
|
||||||
});
|
});
|
||||||
@ -135,10 +149,10 @@ class Settings {
|
|||||||
console.log("[Settings::set] setting new settings:", extensionConf)
|
console.log("[Settings::set] setting new settings:", extensionConf)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BrowserDetect.firefox || BrowserDetect.edge) {
|
if (currentBrowser.firefox || currentBrowser.edge) {
|
||||||
extensionConf.version = this.version;
|
extensionConf.version = this.version;
|
||||||
return this.useSync ? browser.storage.sync.set( {'uwSettings': JSON.stringify(extensionConf)}): browser.storage.local.set( {'uwSettings': JSON.stringify(extensionConf)});
|
return this.useSync ? browser.storage.sync.set( {'uwSettings': JSON.stringify(extensionConf)}): browser.storage.local.set( {'uwSettings': JSON.stringify(extensionConf)});
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (currentBrowser.chrome) {
|
||||||
return chrome.storage.sync.set( {'uwSettings': JSON.stringify(extensionConf)});
|
return chrome.storage.sync.set( {'uwSettings': JSON.stringify(extensionConf)});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -365,3 +379,5 @@ class Settings {
|
|||||||
return this.active.miscSettings.videoFloat;
|
return this.active.miscSettings.videoFloat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default Settings;
|
@ -30,9 +30,9 @@ class UWServer {
|
|||||||
this.comms = new CommsServer(this);
|
this.comms = new CommsServer(this);
|
||||||
|
|
||||||
var ths = this;
|
var ths = this;
|
||||||
if(BrowserDetect.firefox) {
|
if(window.currentBrowser.firefox) {
|
||||||
browser.tabs.onActivated.addListener(function(m) {ths.onTabSwitched(m)});
|
browser.tabs.onActivated.addListener(function(m) {ths.onTabSwitched(m)});
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (window.currentBrowser.chrome) {
|
||||||
chrome.tabs.onActivated.addListener(function(m) {ths.onTabSwitched(m)});
|
chrome.tabs.onActivated.addListener(function(m) {ths.onTabSwitched(m)});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,9 +92,9 @@ class UWServer {
|
|||||||
this.currentTabId = activeInfo.tabId; // just for readability
|
this.currentTabId = activeInfo.tabId; // just for readability
|
||||||
|
|
||||||
var tab;
|
var tab;
|
||||||
if (BrowserDetect.firefox) {
|
if (window.currentBrowser.firefox) {
|
||||||
var tab = await browser.tabs.get(this.currentTabId);
|
var tab = await browser.tabs.get(this.currentTabId);
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (window.currentBrowser.chrome) {
|
||||||
var tab = await this._promisifyTabsGet(chrome, this.currentTabId);
|
var tab = await this._promisifyTabsGet(chrome, this.currentTabId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,9 +118,9 @@ class UWServer {
|
|||||||
// does "garbage collection" on frames
|
// does "garbage collection" on frames
|
||||||
let frames;
|
let frames;
|
||||||
|
|
||||||
if (BrowserDetect.firefox) {
|
if (window.currentBrowser.firefox) {
|
||||||
frames = await browser.webNavigation.getAllFrames({tabId: this.currentTabId});
|
frames = await browser.webNavigation.getAllFrames({tabId: this.currentTabId});
|
||||||
} else if (BrowserDetect.chrome) {
|
} else if (window.currentBrowser.chrome) {
|
||||||
frames = await new Promise( (resolve, reject) => {
|
frames = await new Promise( (resolve, reject) => {
|
||||||
chrome.webNavigation.getAllFrames({tabId: this.currentTabId}, (data) => resolve(data) );
|
chrome.webNavigation.getAllFrames({tabId: this.currentTabId}, (data) => resolve(data) );
|
||||||
});
|
});
|
@ -90,5 +90,5 @@ class UW {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var uw = new UW();
|
var main = new UW();
|
||||||
uw.init();
|
main.init();
|
BIN
src/icons/icon.xcf
Normal file
BIN
src/icons/icon.xcf
Normal file
Binary file not shown.
BIN
src/icons/icon_128.png
Normal file
BIN
src/icons/icon_128.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
BIN
src/icons/icon_48.png
Normal file
BIN
src/icons/icon_48.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
97
src/manifest.json
Normal file
97
src/manifest.json
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
{
|
||||||
|
"manifest_version": 2,
|
||||||
|
"name": "Ultrawidify",
|
||||||
|
"description": "Aspect ratio fixer for youtube that works around some people's disability to properly encode 21:9 (and sometimes, 16:9) videos.",
|
||||||
|
"version": "4.0.0-a1",
|
||||||
|
"applications": {
|
||||||
|
"gecko": {
|
||||||
|
"id": "{cf02b1a7-a01a-4e37-a609-516a283f1ed3}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"icons": {
|
||||||
|
"32":"res/icons/uw-32.png",
|
||||||
|
"64":"res/icons/uw-64.png"
|
||||||
|
},
|
||||||
|
"browser_action": {
|
||||||
|
"default_title": "Ultrawidify",
|
||||||
|
"default_popup": "popup/popup.html"
|
||||||
|
},
|
||||||
|
|
||||||
|
"content_scripts": [{
|
||||||
|
"matches": ["*://*/*"],
|
||||||
|
"js": [
|
||||||
|
"js/conf/Debug.js",
|
||||||
|
"js/lib/enums.js",
|
||||||
|
|
||||||
|
"js/lib/BrowserDetect.js",
|
||||||
|
"js/conf/ExtensionConf.js",
|
||||||
|
|
||||||
|
"js/lib/ObjectCopy.js",
|
||||||
|
"js/lib/Settings.js",
|
||||||
|
|
||||||
|
"js/lib/Comms.js",
|
||||||
|
|
||||||
|
"js/lib/EdgeDetect.js",
|
||||||
|
"js/lib/GuardLine.js",
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"js/modules/PageInfo.js",
|
||||||
|
"js/modules/DebugCanvas.js",
|
||||||
|
"js/modules/ArDetect.js",
|
||||||
|
"js/modules/Zoom.js",
|
||||||
|
"js/modules/Scaler.js",
|
||||||
|
"js/modules/Stretcher.js",
|
||||||
|
|
||||||
|
"js/modules/Resizer.js",
|
||||||
|
"js/lib/PlayerData.js",
|
||||||
|
"js/lib/VideoData.js",
|
||||||
|
|
||||||
|
"js/modules/ActionHandler.js",
|
||||||
|
|
||||||
|
"js/uw.js"
|
||||||
|
],
|
||||||
|
"all_frames": true
|
||||||
|
}],
|
||||||
|
|
||||||
|
"background": {
|
||||||
|
"scripts": [
|
||||||
|
"ext/conf/Debug.js",
|
||||||
|
"ext/conf/BrowserDetect.js",
|
||||||
|
"ext/conf/ExtensionConf.js",
|
||||||
|
"ext/lib/Comms.js",
|
||||||
|
"ext/lib/ObjectCopy.js",
|
||||||
|
|
||||||
|
"ext/lib/Settings.js",
|
||||||
|
"ext/modules/ActionHandler.js",
|
||||||
|
|
||||||
|
"ext/uw-bg.js"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"options_ui": {
|
||||||
|
"page": "options/options.html",
|
||||||
|
"browser_style": false,
|
||||||
|
"open_in_tab": true
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"web_accessible_resources": [
|
||||||
|
"./*",
|
||||||
|
"ext/*",
|
||||||
|
"res/fonts/*",
|
||||||
|
"res/css/*",
|
||||||
|
|
||||||
|
"res/img/ytplayer-icons/zoom.png",
|
||||||
|
"res/img/ytplayer-icons/unzoom.png",
|
||||||
|
"res/img/ytplayer-icons/fitw.png",
|
||||||
|
"res/img/ytplayer-icons/fith.png",
|
||||||
|
"res/img/ytplayer-icons/reset.png",
|
||||||
|
"res/img/ytplayer-icons/settings.png",
|
||||||
|
|
||||||
|
"res/img/settings/about-bg.png"
|
||||||
|
],
|
||||||
|
"permissions": [
|
||||||
|
"tabs", "storage", "activeTab", "<all_urls>", "webNavigation"
|
||||||
|
]
|
||||||
|
}
|
176
src/options/App.vue
Normal file
176
src/options/App.vue
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<!-- POPUPS -->
|
||||||
|
<div v-if="anyOpenedPopups"
|
||||||
|
class="popup-container"
|
||||||
|
>
|
||||||
|
<AddEditActionPopup v-if="editActionPopupVisible"
|
||||||
|
:settings="settings"
|
||||||
|
:actionIndex="editActionIndex"
|
||||||
|
@close="closePopups()"
|
||||||
|
>
|
||||||
|
</AddEditActionPopup>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ACTUAL PAGE -->
|
||||||
|
<div class="flex flex-row"
|
||||||
|
:class="{'blur': anyOpenedPopups}"
|
||||||
|
>
|
||||||
|
|
||||||
|
<div class="header flex flex-column">
|
||||||
|
<div class="flex extension-name text-sink-anchor">
|
||||||
|
<div class="text-sink title-sink-pad w100 text-center">
|
||||||
|
Ultrawidify Vue
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-column menu">
|
||||||
|
<div class="menu-item"
|
||||||
|
:class="{'selected-tab': selectedTab === 'general'}"
|
||||||
|
@click="setSelectedTab('general')"
|
||||||
|
>
|
||||||
|
General settings
|
||||||
|
</div>
|
||||||
|
<div class="menu-item"
|
||||||
|
:class="{'selected-tab': selectedTab === 'autoar'}"
|
||||||
|
@click="setSelectedTab('autoar')"
|
||||||
|
>
|
||||||
|
Autodetection
|
||||||
|
</div>
|
||||||
|
<div class="menu-item"
|
||||||
|
:class="{'selected-tab': selectedTab === 'controls'}"
|
||||||
|
@click="setSelectedTab('controls')"
|
||||||
|
>
|
||||||
|
Controls
|
||||||
|
</div>
|
||||||
|
<div class="menu-item"
|
||||||
|
:class="{'selected-tab': selectedTab === 'about'}"
|
||||||
|
@click="setSelectedTab('about')"
|
||||||
|
>
|
||||||
|
About
|
||||||
|
</div>
|
||||||
|
<div class="menu-item"
|
||||||
|
:class="{'selected-tab': selectedTab === 'donate'}"
|
||||||
|
@click="setSelectedTab('donate')"
|
||||||
|
>
|
||||||
|
Donate
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex content-area flex-column">
|
||||||
|
<div class="flex content-title text-sink-anchor">
|
||||||
|
<div class="text-sink title-sink-pad">
|
||||||
|
{{selectedTabTitle}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="content-content">
|
||||||
|
<GeneralSettings v-if="settingsInitialized && selectedTab === 'general'"
|
||||||
|
:settings="settings"
|
||||||
|
>
|
||||||
|
</GeneralSettings>
|
||||||
|
<AutodetectionSettings v-if="settingsInitialized && selectedTab === 'autoar'"
|
||||||
|
:settings="settings"
|
||||||
|
>
|
||||||
|
</AutodetectionSettings>
|
||||||
|
<ControlsSettings v-if="selectedTab === 'controls'"
|
||||||
|
:settings="settings"
|
||||||
|
@edit-event="showEditActionPopup($event)"
|
||||||
|
>
|
||||||
|
</ControlsSettings>
|
||||||
|
|
||||||
|
<!-- Vice City/beggathon reference: https://youtu.be/Mn3YEJTSYs8?t=770 -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Debug from '../ext/conf/Debug.js';
|
||||||
|
import BrowserDetect from '../ext/conf/BrowserDetect.js';
|
||||||
|
|
||||||
|
import ExtensionConf from '../ext/conf/ExtensionConf.js';
|
||||||
|
|
||||||
|
import ObjectCopy from '../ext/lib/ObjectCopy.js';
|
||||||
|
|
||||||
|
import Settings from '../ext/lib/Settings.js';
|
||||||
|
|
||||||
|
import GeneralSettings from './general-settings';
|
||||||
|
import ControlsSettings from './controls-settings/controls-settings';
|
||||||
|
import AddEditActionPopup from './controls-settings/add-edit-action-popup';
|
||||||
|
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "Ultrawidify",
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
selectedTab: "general",
|
||||||
|
selectedTabTitle: "General settings",
|
||||||
|
settings: {},
|
||||||
|
settingsInitialized: false,
|
||||||
|
editActionPopupVisible: false,
|
||||||
|
editActionIndex: -1,
|
||||||
|
anyOpenedPopups: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
this.settings = new Settings(undefined, this.updateSettings);
|
||||||
|
this.settings.init();
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
GeneralSettings,
|
||||||
|
ControlsSettings,
|
||||||
|
AddEditActionPopup,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setSelectedTab(newTab) {
|
||||||
|
this.selectedTab = newTab;
|
||||||
|
if (newTab === 'general') {
|
||||||
|
this.selectedTabTitle = 'General settings';
|
||||||
|
} else if (newTab === 'autoar') {
|
||||||
|
this.selectedTabTitle = 'Advanced autodetection settings';
|
||||||
|
} else if (newTab === 'controls') {
|
||||||
|
this.selectedTabTitle = 'Controls';
|
||||||
|
} else if (newTab === 'about') {
|
||||||
|
this.selectedTabTitle = 'About';
|
||||||
|
} else if (newTab === 'donate') {
|
||||||
|
this.selectedTabTitle = 'Beggathon';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
updateSettings(newSettings) {
|
||||||
|
this.settings = newSettings;
|
||||||
|
this.settingsInitialized = true;
|
||||||
|
},
|
||||||
|
showEditActionPopup(event) {
|
||||||
|
console.log("SHOW EDIT ACTION/APP:", event)
|
||||||
|
this.editActionPopupVisible = true;
|
||||||
|
this.anyOpenedPopups = true;
|
||||||
|
},
|
||||||
|
closePopups(){
|
||||||
|
this.anyOpenedPopups = false;
|
||||||
|
this.editActionPopupVisible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style src="../res/css/font/overpass.css"></style>
|
||||||
|
<style src="../res/css/font/overpass-mono.css"></style>
|
||||||
|
<style src="../res/css/flex.css"></style>
|
||||||
|
<style src="../res/css/common.scss"></style>
|
||||||
|
<style src="./options.scss"></style>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.popup-container {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.blur {
|
||||||
|
filter: blur(2px);
|
||||||
|
}
|
||||||
|
</style>
|
20
src/options/about.vue
Normal file
20
src/options/about.vue
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<h2>Ultrawidify - an aspect ratio fixer for youtube <small>(and netflix)</small></h2>
|
||||||
|
<p>Created by Tamius Han (me). If something is broken, you can shout at me on <a href="https://github.com/xternal7/ultrawidify">github</a> (shout nicely, though. Open an issue or bug report or something).
|
||||||
|
If you're curious to see the source code, <a href="https://github.com/xternal7/ultrawidify">github's here</a>.
|
||||||
|
If you're looking at this page because you're bored and want to be bored some more, <a href="http://tamius.net">my website's here</a>.</p>
|
||||||
|
<p>If you want to buy me a beer, <a href="https://paypal.me/tamius">my paypal's here</p>.
|
||||||
|
<h2>Plans for the future</h2>
|
||||||
|
<p>Improving automatic detection, trying to re-implement in-player user interface, fixing bugs.</p>
|
||||||
|
<h2>Acknowledgements</h2>
|
||||||
|
<p>This extension uses font <a href="http://overpassfont.org/">Overpass</a> and everything<a href="https://github.com/Kocal/vue-web-extension">this Vue template brings along.</p>
|
||||||
|
<p>Special thanks to me for making this extension. You're welcome.</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
}
|
||||||
|
</script>
|
204
src/options/controls-settings/add-edit-action-popup.vue
Normal file
204
src/options/controls-settings/add-edit-action-popup.vue
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
<template>
|
||||||
|
<div class="full-screen"
|
||||||
|
@click="$emit('close')"
|
||||||
|
>
|
||||||
|
<div class="dialog-box flex flex-column" @click="$event.stopPropagation()">
|
||||||
|
<div class="window-title">
|
||||||
|
{{actionIndex < 0 ? 'Add new action' : 'Edit action'}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<CommandChain class="w100"
|
||||||
|
:command="action.command"
|
||||||
|
@new-command="addNewCommand()"
|
||||||
|
>
|
||||||
|
</CommandChain>
|
||||||
|
<CommandAddEdit class="w100"
|
||||||
|
v-if="addEditCommand"
|
||||||
|
:command="currentCmd"
|
||||||
|
>
|
||||||
|
</CommandAddEdit>
|
||||||
|
|
||||||
|
<div class="flex flex-column">
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Action name:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-input flex-grow">
|
||||||
|
<input type="text"
|
||||||
|
class="w100"
|
||||||
|
:value="actionIndex < 0 ? action.name : settings.active.actions[actionIndex].name"
|
||||||
|
@input="updateActionName($event.target.value)"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Default label:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-input flex-grow">
|
||||||
|
<input type="text"
|
||||||
|
class="w100"
|
||||||
|
:value="actionIndex < 0 ? action.label : settings.active.actions[actionIndex].label"
|
||||||
|
@input="updateActionLabel($event.target.value)"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<b>Scopes:</b>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-row">
|
||||||
|
Global:
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Show in popup
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-input">
|
||||||
|
<input type="checkbox"
|
||||||
|
:value="actionIndex < 0 ? true : settings.active.actions[actionIndex].scopes.global && settings.active.actions[actionIndex].scopes.global.show"
|
||||||
|
@input="updateScopes('global', 'show', $event.target.value)"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Label <span class="hint"><small>(leave empty for default)</small></span>:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-input flex-grow">
|
||||||
|
<input type="text"
|
||||||
|
class="w100"
|
||||||
|
@input="updateScopes('global', 'label', $event.target.value)"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Shortcut:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-input flex-grow">
|
||||||
|
TODO: insert shortcut changing component
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import StretchMode from '../../common/enums/stretch-mode';
|
||||||
|
import KeyboardShortcutParser from '../../common/js/KeyboardShortcutParser';
|
||||||
|
import CommandChain from './command-builder/command-chain';
|
||||||
|
import CommandAddEdit from './command-builder/command-add-edit';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
CommandChain: CommandChain,
|
||||||
|
CommandAddEdit: CommandAddEdit,
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
StretchMode: StretchMode,
|
||||||
|
action: {
|
||||||
|
name: 'New action',
|
||||||
|
label: 'New action',
|
||||||
|
cmd: [],
|
||||||
|
},
|
||||||
|
addEditCommand: false,
|
||||||
|
currentCmd: {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
settings: Object,
|
||||||
|
actionIndex: Number,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
parseActionShortcut(action) {
|
||||||
|
return KeyboardShortcutParser.parseShortcut(action.shortcut[0]);
|
||||||
|
},
|
||||||
|
parseCommand(cmd) {
|
||||||
|
let cmdstring = '';
|
||||||
|
for(const c of cmd) {
|
||||||
|
cmdstring += `${c.action} ${c.arg}${c.persistent ? ' persistent' : ''}; `;
|
||||||
|
}
|
||||||
|
return cmdstring;
|
||||||
|
},
|
||||||
|
updateActionName(newName) {
|
||||||
|
this.action.name = newName;
|
||||||
|
},
|
||||||
|
updateActionLabel(newLabel) {
|
||||||
|
this.action.label = newLabel;
|
||||||
|
},
|
||||||
|
updateScopes(scope, prop, value) {
|
||||||
|
|
||||||
|
},
|
||||||
|
addNewCommand() {
|
||||||
|
this.currentCmd = {};
|
||||||
|
this.addEditCommand = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
.full-screen {
|
||||||
|
background-color: rgba(0,0,0,0.5);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-items: center;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-box {
|
||||||
|
background-color: rgba(0,0,0,0.9);
|
||||||
|
// width: 100%;
|
||||||
|
// height: 100%;
|
||||||
|
max-width: 130rem;
|
||||||
|
max-height: 42rem;
|
||||||
|
padding-top: 2rem;
|
||||||
|
padding-left: 3rem;
|
||||||
|
padding-right: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-title {
|
||||||
|
font-size: 2.4rem;
|
||||||
|
font-variant: small-caps;
|
||||||
|
margin-bottom: 1.69rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-label {
|
||||||
|
width: 16rem;
|
||||||
|
text-align: right;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.hint {
|
||||||
|
opacity: 50% !important;
|
||||||
|
font-weight: 300;
|
||||||
|
}
|
||||||
|
|
||||||
|
.w100 {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
@ -0,0 +1,127 @@
|
|||||||
|
<template>
|
||||||
|
<div class="">
|
||||||
|
<div class="window-content">
|
||||||
|
|
||||||
|
<!-- ACTION SELECT -->
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Select action:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-grow flex-input">
|
||||||
|
<select class=""
|
||||||
|
@change="setAction($event.target.value)"
|
||||||
|
>
|
||||||
|
<option v-for="(action, key) in ActionList"
|
||||||
|
:value="key"
|
||||||
|
>
|
||||||
|
{{action.name}}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ARGUMENT SELECT -->
|
||||||
|
<div v-if="selectedAction && ActionList[selectedAction]"
|
||||||
|
class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
Select action parameter:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-grow flex-input">
|
||||||
|
<select @change="setArgument($event.target.value)">
|
||||||
|
<option v-for="arg of ActionList[selectedAction].args"
|
||||||
|
:value="arg"
|
||||||
|
>
|
||||||
|
{{arg.name}}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- CUSTOM ARGUMENT INPUT -->
|
||||||
|
<div v-if="selectedArgument && selectedArgument.customArg"
|
||||||
|
class="flex flex-row">
|
||||||
|
<div class="flex label-secondary form-label">
|
||||||
|
<span class="w100">
|
||||||
|
{{selectedArgument.name}}:
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-grow flex-input">
|
||||||
|
<input type="text"
|
||||||
|
class="w100"
|
||||||
|
v-model="customArgumentValue"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="window-footer">
|
||||||
|
<div class="button"
|
||||||
|
@click="$emit('close-popup')"
|
||||||
|
>
|
||||||
|
Cancel
|
||||||
|
</div>
|
||||||
|
<div class="button"
|
||||||
|
@click="emitCommand()"
|
||||||
|
>
|
||||||
|
Save
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ActionList from '../../../ext/conf/ActionList';
|
||||||
|
import StretchMode from '../../../common/enums/stretch-mode';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
StretchMode: StretchMode,
|
||||||
|
ActionList: ActionList,
|
||||||
|
selectedAction: this.action ? action.action : undefined,
|
||||||
|
selectedArgument: this.action ? {
|
||||||
|
name: ActionList[action.action].args.find(x => x.arg === action.arg) || ActionList[action.action].args.find(x => x.customArg),
|
||||||
|
arg: action.arg
|
||||||
|
} : undefined,
|
||||||
|
customArgumentValue: this.action ? action.arg : undefined
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
console.log("this.actionList", ActionList, this.ActionList)
|
||||||
|
for(const a in ActionList) {
|
||||||
|
console.log(a);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
action: Object,
|
||||||
|
scope: String,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setAction(cmd) {
|
||||||
|
console.log("SETTING ACTION", cmd);
|
||||||
|
this.selectedAction = cmd;
|
||||||
|
this.selectedArgument = undefined;
|
||||||
|
this.customArgumentValue = undefined;
|
||||||
|
},
|
||||||
|
setArgument(arg) {
|
||||||
|
console.log("SETTING ARGUMENT", cmd);
|
||||||
|
this.selectedArgument = arg;
|
||||||
|
this.customArgumentValue = undefined;
|
||||||
|
},
|
||||||
|
emitCommand() {
|
||||||
|
this.$emit(
|
||||||
|
'set-command',
|
||||||
|
this.selectedAction,
|
||||||
|
this.customArgumentValue ? this.customArgumentValue : this.selectedArgument.arg
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -0,0 +1,82 @@
|
|||||||
|
<template>
|
||||||
|
<div class="block-main">
|
||||||
|
|
||||||
|
<div v-if="!first"
|
||||||
|
class="prev"
|
||||||
|
@click="emit('move-left')"
|
||||||
|
>
|
||||||
|
<
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="button-main">
|
||||||
|
<div class="button-action-display">
|
||||||
|
{{ActionList[action.action].name}}: {{
|
||||||
|
ActionList[action.action].args.find(x => x.arg === action.arg) || action.arg
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
<div class="actions flex flex-row">
|
||||||
|
<div class="flex flex-grow"
|
||||||
|
@click="$emit('delete')"
|
||||||
|
>
|
||||||
|
🗙
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-grow"
|
||||||
|
@click="$emit('edit')"
|
||||||
|
>
|
||||||
|
🖉
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="!last"
|
||||||
|
class="next"
|
||||||
|
@click="$emit('move-right')"
|
||||||
|
>
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ActionList from '../../../ext/conf/ActionList';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
ActionList: ActionList,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
action: Object,
|
||||||
|
first: Boolean,
|
||||||
|
last: Boolean
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
parseActionShortcut(action) {
|
||||||
|
return KeyboardShortcutParser.parseShortcut(action.shortcut[0]);
|
||||||
|
},
|
||||||
|
setAction(cmd) {
|
||||||
|
console.log("SETTING ACTION", cmd);
|
||||||
|
this.selectedAction = cmd;
|
||||||
|
this.selectedArgument = undefined;
|
||||||
|
this.customArgumentValue = undefined;
|
||||||
|
},
|
||||||
|
setArgument(arg) {
|
||||||
|
console.log("SETTING ARGUMENT", cmd);
|
||||||
|
this.selectedArgument = arg;
|
||||||
|
this.customArgumentValue = undefined;
|
||||||
|
},
|
||||||
|
emitCommand() {
|
||||||
|
this.$emit(
|
||||||
|
'set-command',
|
||||||
|
this.selectedAction,
|
||||||
|
this.customArgumentValue ? this.customArgumentValue : this.selectedArgument.arg
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
@ -0,0 +1,41 @@
|
|||||||
|
<template>
|
||||||
|
<div class="">
|
||||||
|
<div class="flex flex-row">
|
||||||
|
<CommandBlock v-for="(cmd, index) of command"
|
||||||
|
:command="cmd"
|
||||||
|
first
|
||||||
|
last
|
||||||
|
@edit="$emit('edit', index)"
|
||||||
|
@delete="$emit('delete', index)"
|
||||||
|
@move-left="$emit('move-left', index)"
|
||||||
|
@move-right="$emit('move-left', (index + 1))"
|
||||||
|
>
|
||||||
|
</CommandBlock>
|
||||||
|
<div class="new-command"
|
||||||
|
@click="$emit('new-command')"
|
||||||
|
>
|
||||||
|
+
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import CommandBlock from './command-block';
|
||||||
|
import CommandAddEdit from './command-add-edit';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
CommandBlock,
|
||||||
|
CommandAddEdit,
|
||||||
|
},
|
||||||
|
props: [
|
||||||
|
'command'
|
||||||
|
],
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
127
src/options/controls-settings/controls-settings.vue
Normal file
127
src/options/controls-settings/controls-settings.vue
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<p>Here, you can change keyboard shortcuts or even create your own.</p>
|
||||||
|
|
||||||
|
<div class="flex flex-column">
|
||||||
|
<div class="action-item-category-header">
|
||||||
|
Crop actions
|
||||||
|
</div>
|
||||||
|
<template v-for="(action, index) of settings.active.actions">
|
||||||
|
<ActionAlt v-if="action.cmd.length === 1 && action.cmd[0].action === 'set-ar'"
|
||||||
|
:action="action"
|
||||||
|
@edit="changeShortcut(index)"
|
||||||
|
>
|
||||||
|
</ActionAlt>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="action-item-category-header">
|
||||||
|
Stretch actions
|
||||||
|
</div>
|
||||||
|
<template v-for="(action, index) of settings.active.actions">
|
||||||
|
<ActionAlt v-if="action.cmd.length === 1 && action.cmd[0].action === 'set-stretch'"
|
||||||
|
:action="action"
|
||||||
|
@edit="changeShortcut(index)"
|
||||||
|
>
|
||||||
|
</ActionAlt>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="action-item-category-header">
|
||||||
|
Alignment actions
|
||||||
|
</div>
|
||||||
|
<template v-for="(action, index) of settings.active.actions">
|
||||||
|
<ActionAlt v-if="action.cmd.length === 1 && action.cmd[0].action === 'set-alignment'"
|
||||||
|
:action="action"
|
||||||
|
@edit="changeShortcut(index)"
|
||||||
|
>
|
||||||
|
</ActionAlt>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="action-item-category-header">
|
||||||
|
Zoom / panning actions
|
||||||
|
</div>
|
||||||
|
<template v-for="(action, index) of settings.active.actions">
|
||||||
|
<ActionAlt v-if="action.cmd.length === 1 && (
|
||||||
|
action.cmd[0].action === 'set-zoom' ||
|
||||||
|
action.cmd[0].action === 'set-pan' ||
|
||||||
|
action.cmd[0].action === 'pan' ||
|
||||||
|
action.cmd[0].action === 'set-pan'
|
||||||
|
)"
|
||||||
|
:action="action"
|
||||||
|
@edit="changeShortcut(index)"
|
||||||
|
>
|
||||||
|
</ActionAlt>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="action-item-category-header">
|
||||||
|
Other actions
|
||||||
|
</div>
|
||||||
|
<template v-for="(action, index) of settings.active.actions">
|
||||||
|
<ActionAlt v-if="action.cmd.length > 1 || (
|
||||||
|
action.cmd[0].action !== 'set-zoom' &&
|
||||||
|
action.cmd[0].action !== 'set-pan' &&
|
||||||
|
action.cmd[0].action !== 'pan' &&
|
||||||
|
action.cmd[0].action !== 'set-pan' &&
|
||||||
|
action.cmd[0].action !== 'set-alignment' &&
|
||||||
|
action.cmd[0].action !== 'set-stretch' &&
|
||||||
|
action.cmd[0].action !== 'set-ar'
|
||||||
|
)"
|
||||||
|
:action="action"
|
||||||
|
@edit="changeShortcut(index)"
|
||||||
|
>
|
||||||
|
</ActionAlt>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Button from '../../common/components/button';
|
||||||
|
import StretchMode from '../../common/enums/stretch-mode';
|
||||||
|
import ActionAlt from '../../common/components/action-alt';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Button,
|
||||||
|
ActionAlt,
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
StretchMode: StretchMode,
|
||||||
|
tableVisibility: {
|
||||||
|
crop: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
settings: Object
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
settings: (newVal, oldVal) => {
|
||||||
|
console.log("this.settings", this.settings, newVal, oldVal)
|
||||||
|
this.settings = newVal;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
changeShortcut(index) {
|
||||||
|
this.$emit('edit-event', index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@import '../../res/css/colors.scss';
|
||||||
|
|
||||||
|
.action-item-category-header {
|
||||||
|
margin-top: 3rem;
|
||||||
|
color: $primary-color;
|
||||||
|
font-size: 2.4rem;
|
||||||
|
font-variant: small-caps;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
</style>
|
167
src/options/general-settings.vue
Normal file
167
src/options/general-settings.vue
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="label">
|
||||||
|
Enable this extension:
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row button-box">
|
||||||
|
<Button label="Always"
|
||||||
|
:selected="settings.active.extensionMode === 'blacklist'"
|
||||||
|
@click.native="setDefaultExtensionMode('blacklist')"
|
||||||
|
>
|
||||||
|
</Button>
|
||||||
|
<Button label="On whitelisted sites"
|
||||||
|
:selected="settings.active.extensionMode === 'whitelist'"
|
||||||
|
@click.native="setDefaultExtensionMode('whitelist')"
|
||||||
|
>
|
||||||
|
</Button>
|
||||||
|
<Button label="Never"
|
||||||
|
:selected="settings.active.extensionMode === 'disabled'"
|
||||||
|
@click.native="setDefaultExtensionMode('disabled')"
|
||||||
|
>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
<b>Always</b> enables this extension on every site you visit that you didn't blacklist.<br/>
|
||||||
|
<b>On whitelisted sites</b> enables this extension only on sites you explicitly whitelisted.<br/>
|
||||||
|
<b>Never</b> disables extension on all sites, even on those you whitelisted.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="label">
|
||||||
|
Enable autodetection:
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row button-box">
|
||||||
|
<Button label="Always"
|
||||||
|
:selected="settings.active.arDetect.mode === 'blacklist'"
|
||||||
|
@click.native="setDefaultAutodetectionMode('blacklist')">
|
||||||
|
</Button>
|
||||||
|
<Button label="On whitelisted sites"
|
||||||
|
:selected="settings.active.arDetect.mode === 'whitelist'"
|
||||||
|
@click.native="setDefaultAutodetectionMode('whitelist')">
|
||||||
|
</Button>
|
||||||
|
<Button label="Never"
|
||||||
|
:selected="settings.active.arDetect.mode === 'disabled'"
|
||||||
|
@click.native="setDefaultAutodetectionMode('never')">
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
<b>Always</b> enables autodetection on every site this extension is enabled for, unless blacklisted.<br/>
|
||||||
|
<b>On whitelisted sites</b> enables autodetection only for sites that you explicitly enabled.<br/>
|
||||||
|
<b>Never</b> disables autodetection on all sites, even on those you whitelisted.<br/>
|
||||||
|
<!-- <br/> -->
|
||||||
|
<!-- For more settings related to autodetection, please check the 'Autodetection' tab. -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="label">
|
||||||
|
Default video alignment:
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row button-box">
|
||||||
|
<Button label="Left"
|
||||||
|
:selected="settings.active.miscSettings.videoFloat === 'left'"
|
||||||
|
@click.native="setDefaultVideoFloat('left')">
|
||||||
|
</Button>
|
||||||
|
<Button label="Center"
|
||||||
|
:selected="settings.active.miscSettings.videoFloat === 'center'"
|
||||||
|
@click.native="setDefaultVideoFloat('center')">
|
||||||
|
</Button>
|
||||||
|
<Button label="Right"
|
||||||
|
:selected="settings.active.miscSettings.videoFloat === 'right'"
|
||||||
|
@click.native="setDefaultVideoFloat('right')">
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="label">
|
||||||
|
Default stretch mode:
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-row button-box">
|
||||||
|
<Button label="Don't stretch"
|
||||||
|
:selected="settings.active.stretch.initialMode === StretchMode.NO_STRETCH"
|
||||||
|
@click.native="setDefaultStretchingMode(StretchMode.NO_STRETCH)">
|
||||||
|
</Button>
|
||||||
|
<Button label="Basic stretch"
|
||||||
|
:selected="settings.active.stretch.initialMode === StretchMode.BASIC"
|
||||||
|
@click.native="setDefaultStretchingMode(StretchMode.BASIC)">
|
||||||
|
</Button>
|
||||||
|
<Button label="Hybrid stretch"
|
||||||
|
:selected="settings.active.stretch.initialMode === StretchMode.HYBRID"
|
||||||
|
@click.native="setDefaultStretchingMode(StretchMode.HYBRID)">
|
||||||
|
</Button>
|
||||||
|
<Button label="Thin borders only"
|
||||||
|
:selected="settings.active.stretch.initialMode === StretchMode.CONDITIONAL"
|
||||||
|
@click.native="setDefaultStretchingMode(StretchMode.CONDITIONAL)"
|
||||||
|
>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
<div class="description">
|
||||||
|
<b>None:</b> do not stretch the video at all. This is the default option, for men of culture.<br/>
|
||||||
|
<b>Basic:</b> stretches video to fit the player or screen unconditionally. If video has letterbox encoded, this option <i>will not</i> try to remove letterbox before stretching. You probably shouldn't be using this option.<br/>
|
||||||
|
<b>Hybrid:</b> stretches the video to fit the player, but only if cropping didn't completely remove the black bars.<br/>
|
||||||
|
<b>Thin borders:</b> stretches only if the width of black borders after cropping is thin.
|
||||||
|
<br/>
|
||||||
|
Treshold for thin borders can be defined below.
|
||||||
|
</div>
|
||||||
|
<div class="indent">
|
||||||
|
<div class="flex flex-row row-padding">
|
||||||
|
<div class="flex label-secondary">
|
||||||
|
Thin border treshold:
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-input">
|
||||||
|
<input type="number"
|
||||||
|
step="any"
|
||||||
|
:value="settings.active.stretch.conditionalDifferencePercent"
|
||||||
|
@input="updateStretchTreshold($event.target.value)"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Button from '../common/components/button';
|
||||||
|
import StretchMode from '../common/enums/stretch-mode';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
Button,
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
StretchMode: StretchMode,
|
||||||
|
stretchThreshold: 0,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
settings: Object
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setDefaultAutodetectionMode(mode) {
|
||||||
|
this.settings.active.arDetect.mode = mode;
|
||||||
|
this.settings.save();
|
||||||
|
},
|
||||||
|
setDefaultExtensionMode(mode) {
|
||||||
|
this.settings.active.extensionMode = mode;
|
||||||
|
this.settings.save();
|
||||||
|
},
|
||||||
|
setDefaultVideoFloat(mode) {
|
||||||
|
this.settings.active.videoFloat = mode;
|
||||||
|
this.settings.save();
|
||||||
|
},
|
||||||
|
setDefaultStretchingMode(mode) {
|
||||||
|
this.settings.active.stretch.initialMode = mode;
|
||||||
|
this.settings.save();
|
||||||
|
},
|
||||||
|
updateStretchTreshold(newTreshold) {
|
||||||
|
if (!newTreshold || isNaN(newTreshold)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.settings.active.stretch.conditionalDifferencePercent = newTreshold;
|
||||||
|
this.settings.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
15
src/options/options.html
Normal file
15
src/options/options.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>ultravidify-vue - Options</title>
|
||||||
|
<link rel="stylesheet" href="options.css">
|
||||||
|
<% if (NODE_ENV === 'development') { %>
|
||||||
|
<!-- Load some resources only in development environment -->
|
||||||
|
<% } %>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script src="options.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
13
src/options/options.js
Normal file
13
src/options/options.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// console.log("global browser", browser, global.browser)
|
||||||
|
// global.browser = require('webextension-polyfill')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import Vue from 'vue'
|
||||||
|
import App from './App'
|
||||||
|
|
||||||
|
/* eslint-disable no-new */
|
||||||
|
new Vue({
|
||||||
|
el: '#app',
|
||||||
|
render: h => h(App)
|
||||||
|
})
|
256
src/options/options.scss
Normal file
256
src/options/options.scss
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
@import "../res/css/font/overpass.css";
|
||||||
|
@import "../res/css/font/overpass-mono.css";
|
||||||
|
@import "../res/css/colors.scss";
|
||||||
|
@import "../res/css/common.scss";
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-image: url('/res/img/settings/bg_random2.png');
|
||||||
|
background-size: 25em;
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
z-index: -1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
+
|
||||||
|
+ BASIC LAYOUT
|
||||||
|
+
|
||||||
|
*/
|
||||||
|
|
||||||
|
.header {
|
||||||
|
width: 42rem;
|
||||||
|
height: 100vh;
|
||||||
|
position: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-area {
|
||||||
|
width: 100%;
|
||||||
|
padding-left: 42rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.text-sink-anchor {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-sink {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0px;
|
||||||
|
}
|
||||||
|
.title-sink-pad {
|
||||||
|
padding-bottom: 1.69rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
+
|
||||||
|
+ SIDE MENU
|
||||||
|
+
|
||||||
|
*/
|
||||||
|
|
||||||
|
.extension-name {
|
||||||
|
font-size: 4.20rem;
|
||||||
|
height: 7.7rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu {
|
||||||
|
font-size: 1.9rem;
|
||||||
|
font-variant: small-caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
+
|
||||||
|
+ TAB PANEL
|
||||||
|
+
|
||||||
|
*/
|
||||||
|
|
||||||
|
.content-title {
|
||||||
|
font-size: 3.3rem;
|
||||||
|
height: 7.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-content {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 96rem;
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 auto;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.block {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-right: 1em;
|
||||||
|
}
|
||||||
|
.tabline {
|
||||||
|
background-color: #000;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 1.5em;
|
||||||
|
padding-top: 0.3em;
|
||||||
|
padding-bottom: 0.4em;
|
||||||
|
z-index: -200;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dup_keybinds{
|
||||||
|
background-color: #720 !important;
|
||||||
|
}
|
||||||
|
input[type=text]{
|
||||||
|
font-size: 1em;
|
||||||
|
padding-left: 0.6em;
|
||||||
|
margin-left: 1em;
|
||||||
|
width: 2em;
|
||||||
|
background-color: #000;
|
||||||
|
border: 1px #442 solid;
|
||||||
|
}
|
||||||
|
.uw_shortcuts_line{
|
||||||
|
padding-top: 0.25em;
|
||||||
|
padding-left: 5em;
|
||||||
|
}
|
||||||
|
.uw_shortcuts_label{
|
||||||
|
display: inline-block;
|
||||||
|
color: #fff;
|
||||||
|
width: 17.5em;
|
||||||
|
}
|
||||||
|
.uw_options_line{
|
||||||
|
margin-top: 0.75em;
|
||||||
|
font-size: 1.1em;
|
||||||
|
width: 80%;
|
||||||
|
margin-left: 5%;
|
||||||
|
}
|
||||||
|
.uw_options_option{
|
||||||
|
margin-left: 5%;
|
||||||
|
}
|
||||||
|
.uw_suboption{
|
||||||
|
margin-left: 5em;
|
||||||
|
margin-top: 0.75em;
|
||||||
|
font-size: 0.85em;
|
||||||
|
}
|
||||||
|
.uw_options_desc, .uw_suboption_desc{
|
||||||
|
margin-top: 0.33em;
|
||||||
|
font-size: 0.69em;
|
||||||
|
color: #aaa;
|
||||||
|
}
|
||||||
|
.uw_suboption_desc{
|
||||||
|
margin-left: 5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttonbar{
|
||||||
|
/* width: 100%; */
|
||||||
|
padding-left: 20em;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
.button {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 1em;
|
||||||
|
margin-right: 1em;
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-right: 1em;
|
||||||
|
padding-top: 0.4em;
|
||||||
|
width: 4em;
|
||||||
|
text-align: center;
|
||||||
|
background-color: rgba(0,0,0,0.66);
|
||||||
|
color: #ffc;
|
||||||
|
height: 1.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.monospace {
|
||||||
|
font-family: 'Overpass Mono', monospace
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-text {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** site options css **/
|
||||||
|
.site_name {
|
||||||
|
padding-left: 1em;
|
||||||
|
padding-bottom: 0.3em;
|
||||||
|
color: #fff;
|
||||||
|
font-size: 1.1em;
|
||||||
|
height: 13em !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
.site_details {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
.site_title_ebox {
|
||||||
|
width: 10em !important;
|
||||||
|
font-size: 1.5em !important;
|
||||||
|
background-color: rgba(0,0,0,0) !important;
|
||||||
|
margin-left: 0px !important;
|
||||||
|
border: 0px !important;
|
||||||
|
color: #ffc !important;
|
||||||
|
}
|
||||||
|
.details_ebox {
|
||||||
|
width: 12em !important;
|
||||||
|
background-color: rgba(0,0,0,0) !important;
|
||||||
|
border: 0px !important;
|
||||||
|
color: #ffc !important;
|
||||||
|
margin-left: 0em !important;
|
||||||
|
}
|
||||||
|
.details_ebox:disabled {
|
||||||
|
color: #aaa !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-container {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
padding-left: 35px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
/* cursor: pointer; */
|
||||||
|
font-size: 22px;
|
||||||
|
/* -webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; */
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
height: 25px;
|
||||||
|
width: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-checked {
|
||||||
|
position: absolute;
|
||||||
|
left: 9px;
|
||||||
|
top: 5px;
|
||||||
|
width: 5px;
|
||||||
|
height: 10px;
|
||||||
|
border: solid rgb(245, 145, 63);
|
||||||
|
border-width: 0 3px 3px 0;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ACTION TABLE STYLES */
|
||||||
|
|
||||||
|
.action-item-category-label {
|
||||||
|
color: rgb(245, 145, 63);
|
||||||
|
font-size: 2em;
|
||||||
|
font-weight: 200;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
padding-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-item-table-header {
|
||||||
|
color: rgb(245, 145, 63);
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-item-table-header-small {
|
||||||
|
color: rgb(245, 145, 63);
|
||||||
|
font-size: 0.85em !important;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-list-item:hover {
|
||||||
|
background-color: rgba(254, 146, 63, 0.15);
|
||||||
|
}
|
19
src/popup/App.vue
Normal file
19
src/popup/App.vue
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<p>Hello world!</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data () {
|
||||||
|
return {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
p {
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
17
src/popup/popup.html
Normal file
17
src/popup/popup.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Title</title>
|
||||||
|
<link rel="stylesheet" href="popup.css">
|
||||||
|
<% if (NODE_ENV === 'development') { %>
|
||||||
|
<!-- Load some resources only in development environment -->
|
||||||
|
<% } %>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<script src="popup.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
15
src/popup/popup.js
Normal file
15
src/popup/popup.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import Vue from 'vue'
|
||||||
|
import App from './App'
|
||||||
|
import store from '../store'
|
||||||
|
|
||||||
|
|
||||||
|
// global.browser = require('webextension-polyfill')
|
||||||
|
// Vue.prototype.$browser = global.browser
|
||||||
|
|
||||||
|
/* eslint-disable no-new */
|
||||||
|
new Vue({
|
||||||
|
el: '#app',
|
||||||
|
store,
|
||||||
|
|
||||||
|
render: h => h(App)
|
||||||
|
})
|
8
src/res/css/colors.scss
Normal file
8
src/res/css/colors.scss
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
$text-normal: #ddd;
|
||||||
|
$text-dim: #999;
|
||||||
|
$text-dark: #666;
|
||||||
|
$primary-color: #fb772a;
|
||||||
|
$secondary-color: #e70c0c;
|
||||||
|
|
||||||
|
$background-primary: #101010;
|
||||||
|
$background-selected: #944918;
|
@ -1,22 +1,30 @@
|
|||||||
html, body {
|
@import "colors.scss";
|
||||||
color: #f8f8f8;
|
@import "/res/css/font/overpass.css";
|
||||||
background-color: #1f1f1f;
|
@import "/res/css/font/overpass-mono.css";
|
||||||
font-family: "overpass";
|
|
||||||
font-size: 1em;
|
body {
|
||||||
user-select: none;
|
background-color: $background-primary;
|
||||||
-moz-user-select: none;
|
color: $text-normal;
|
||||||
-webkit-user-select: none;
|
font-family: 'Overpass', sans-serif;
|
||||||
-ms-user-select: none;
|
font-size: 1.2em;
|
||||||
|
width: 100%;
|
||||||
|
min-height: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
border: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* STANDARD WIDTHS AND HEIGHTS */
|
/* STANDARD WIDTHS AND HEIGHTS */
|
||||||
|
|
||||||
.w100 {
|
.w100 {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.h100 {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.w24 {
|
.w24 {
|
||||||
width: 100px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
@ -30,6 +38,63 @@ html, body {
|
|||||||
padding-right: 1em;
|
padding-right: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* .SELECTED CLASSES */
|
||||||
|
|
||||||
|
.selected-tab {
|
||||||
|
background-color: initial;
|
||||||
|
border-left: $primary-color 5px solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected-tab-secondary {
|
||||||
|
background-color: initial;
|
||||||
|
border-left: $secondary-color 3px solid !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* BASIC STYLING */
|
||||||
|
|
||||||
|
.description {
|
||||||
|
color: $text-dim;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label {
|
||||||
|
padding-top: 1.5rem;
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-variant: small-caps;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label-secondary {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-box {
|
||||||
|
padding-top: 0.69rem;
|
||||||
|
padding-bottom: 0.69rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.indent {
|
||||||
|
padding-left: 4.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row-padding {
|
||||||
|
padding-top: 0.69rem;
|
||||||
|
padding-bottom: 0.69rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* INPUT FORMATTING */
|
||||||
|
|
||||||
|
input[type="number"] {
|
||||||
|
// border: 1px solid #322;
|
||||||
|
background-color: transparent;
|
||||||
|
padding: 0.1rem;
|
||||||
|
padding-top: 0.1rem;
|
||||||
|
padding-bottom: 0.1rem;
|
||||||
|
margin-left: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ELEMENT POSITIONING */
|
/* ELEMENT POSITIONING */
|
||||||
|
|
||||||
.row {
|
.row {
|
||||||
@ -100,34 +165,10 @@ small {
|
|||||||
|
|
||||||
/* COLORS */
|
/* COLORS */
|
||||||
|
|
||||||
a {
|
|
||||||
color: #af7f37;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
color: #c0924e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.color_warn {
|
|
||||||
color: #d6ba4a;
|
|
||||||
}
|
|
||||||
|
|
||||||
strike {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.darker {
|
|
||||||
color: #666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.label{
|
|
||||||
font-size: 1.1em;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #ffe;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected{
|
.selected{
|
||||||
color: #ffddaa;
|
color: #ffddaa !important;
|
||||||
background-color: #433221;
|
background-color: #433221 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.disabled {
|
.disabled {
|
||||||
@ -166,20 +207,13 @@ strike {
|
|||||||
|
|
||||||
/* BUTTONS AND INPUTS */
|
/* BUTTONS AND INPUTS */
|
||||||
|
|
||||||
input {
|
|
||||||
border: 1px solid #322;
|
|
||||||
padding: 0.5em;
|
|
||||||
padding-top: 0.5em;
|
|
||||||
padding-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.invalid-input {
|
.invalid-input {
|
||||||
border: 1px solid #720 !important;
|
border: 1px solid #720 !important;
|
||||||
background-color: #410 !important;
|
background-color: #410 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
display: inline-block;
|
/* display: inline-block; */
|
||||||
padding-top: 8px;
|
padding-top: 8px;
|
||||||
padding-bottom: 3px;
|
padding-bottom: 3px;
|
||||||
padding-left: 20px;
|
padding-left: 20px;
|
@ -12,4 +12,8 @@
|
|||||||
|
|
||||||
.flex-auto {
|
.flex-auto {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-grow {
|
||||||
|
flex-grow: 1;
|
||||||
}
|
}
|
0
src/res/css/form.scss
Normal file
0
src/res/css/form.scss
Normal file
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user