|
@@ -26,15 +26,15 @@
|
|
|
|
|
|
|
|
/* global document, globalThis, getComputedStyle, FileReader, Image, OffscreenCanvas, createImageBitmap */
|
|
/* global document, globalThis, getComputedStyle, FileReader, Image, OffscreenCanvas, createImageBitmap */
|
|
|
|
|
|
|
|
- const singlefile = globalThis.singlefile;
|
|
|
|
|
|
|
+ const singlefile$1 = globalThis.singlefile;
|
|
|
|
|
|
|
|
const CLOSE_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=";
|
|
const CLOSE_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSlUqHewg4hChOogFURFHqWIRLJS2QqsOJpf+CE0akhQXR8G14ODPYtXBxVlXB1dBEPwBcXNzUnSREr9LCi1ivOO4h/e+9+XuO0Col5lqdowDqmYZqXhMzOZWxMAruhGiOYohiZl6Ir2Qgef4uoeP73dRnuVd9+foVfImA3wi8SzTDYt4nXh609I57xOHWUlSiM+Jxwy6IPEj12WX3zgXHRZ4ZtjIpOaIw8RisY3lNmYlQyWeIo4oqkb5QtZlhfMWZ7VcZc178hcG89pymuu0BhHHIhJIQoSMKjZQhoUo7RopJlJ0HvPwDzj+JLlkcm2AkWMeFaiQHD/4H/zurVmYnHCTgjGg88W2P4aBwC7QqNn297FtN04A/zNwpbX8lTow80l6raVFjoDQNnBx3dLkPeByB+h/0iVDciQ/LaFQAN7P6JtyQN8t0LPq9q15jtMHIEO9WroBDg6BkSJlr3m8u6u9b//WNPv3A6mTcr3f/E/sAAAABmJLR0QAigCKAIrj2uckAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QkPDysvCdPVuwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAELSURBVHja7ZpLFsIwDAPj3v/OsGHDe1BIa8tKO7Mnlkw+dpoxAAAAAGCfx4ur6Yx/B337UUS4mp/VuWUEcjSfOgO+BXCZCWe0hSqQo/npBLglIUNLdAV2MH84Ad1JyIwdLkK6YoabIHWscBWmihHuAqvHtv+XqmdXOK9TxdKy3axUm2vZkXXGgPJksTuz1bVFeeU2Y6ijsLIpXbtKa1kDs2ews69o7+A+ihJ2lvI+/lcS1G21zUVG18XKNm4OS4BNkGOQQohSmGaIdpgLESvzyiRwKepsXjE2H0ZWMF8Zi4+jK5mviM0DiRXNZ2rhkdTK5jO0xermz2o8dCnq+FS2XNNVH0sDAAAA3JYnre9cH8BZmhEAAAAASUVORK5CYII=";
|
|
|
|
|
|
|
|
- const SINGLE_FILE_UI_ELEMENT_CLASS = singlefile.helper.SINGLE_FILE_UI_ELEMENT_CLASS;
|
|
|
|
|
|
|
+ const SINGLE_FILE_UI_ELEMENT_CLASS$1 = singlefile$1.helper.SINGLE_FILE_UI_ELEMENT_CLASS;
|
|
|
const SHARE_PAGE_BAR_TAGNAME = "singlefile-share-page-bar";
|
|
const SHARE_PAGE_BAR_TAGNAME = "singlefile-share-page-bar";
|
|
|
let EMBEDDED_IMAGE_BUTTON_MESSAGE$1, SHARE_PAGE_BUTTON_MESSAGE$1, SHARE_SELECTION_BUTTON_MESSAGE$1, ERROR_TITLE_MESSAGE$1;
|
|
let EMBEDDED_IMAGE_BUTTON_MESSAGE$1, SHARE_PAGE_BUTTON_MESSAGE$1, SHARE_SELECTION_BUTTON_MESSAGE$1, ERROR_TITLE_MESSAGE$1;
|
|
|
|
|
|
|
|
- const CSS_PROPERTIES = new Set(Array.from(getComputedStyle(document.documentElement)));
|
|
|
|
|
|
|
+ const CSS_PROPERTIES$1 = new Set(Array.from(getComputedStyle(document.documentElement)));
|
|
|
|
|
|
|
|
function setLabels(labels) {
|
|
function setLabels(labels) {
|
|
|
({ EMBEDDED_IMAGE_BUTTON_MESSAGE: EMBEDDED_IMAGE_BUTTON_MESSAGE$1, SHARE_PAGE_BUTTON_MESSAGE: SHARE_PAGE_BUTTON_MESSAGE$1, SHARE_SELECTION_BUTTON_MESSAGE: SHARE_SELECTION_BUTTON_MESSAGE$1, ERROR_TITLE_MESSAGE: ERROR_TITLE_MESSAGE$1 } = labels);
|
|
({ EMBEDDED_IMAGE_BUTTON_MESSAGE: EMBEDDED_IMAGE_BUTTON_MESSAGE$1, SHARE_PAGE_BUTTON_MESSAGE: SHARE_PAGE_BUTTON_MESSAGE$1, SHARE_SELECTION_BUTTON_MESSAGE: SHARE_SELECTION_BUTTON_MESSAGE$1, ERROR_TITLE_MESSAGE: ERROR_TITLE_MESSAGE$1 } = labels);
|
|
@@ -71,7 +71,7 @@
|
|
|
try {
|
|
try {
|
|
|
const barElement = document.querySelector(tagName);
|
|
const barElement = document.querySelector(tagName);
|
|
|
if (!barElement) {
|
|
if (!barElement) {
|
|
|
- const barElement = createElement(tagName);
|
|
|
|
|
|
|
+ const barElement = createElement$1(tagName);
|
|
|
const shadowRoot = barElement.attachShadow({ mode: "open" });
|
|
const shadowRoot = barElement.attachShadow({ mode: "open" });
|
|
|
const styleElement = document.createElement("style");
|
|
const styleElement = document.createElement("style");
|
|
|
styleElement.textContent = `
|
|
styleElement.textContent = `
|
|
@@ -178,13 +178,13 @@
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- function createElement(tagName, parentElement) {
|
|
|
|
|
|
|
+ function createElement$1(tagName, parentElement) {
|
|
|
const element = document.createElement(tagName);
|
|
const element = document.createElement(tagName);
|
|
|
- element.className = SINGLE_FILE_UI_ELEMENT_CLASS;
|
|
|
|
|
|
|
+ element.className = SINGLE_FILE_UI_ELEMENT_CLASS$1;
|
|
|
if (parentElement) {
|
|
if (parentElement) {
|
|
|
parentElement.appendChild(element);
|
|
parentElement.appendChild(element);
|
|
|
}
|
|
}
|
|
|
- CSS_PROPERTIES.forEach(property => element.style.setProperty(property, "initial", "important"));
|
|
|
|
|
|
|
+ CSS_PROPERTIES$1.forEach(property => element.style.setProperty(property, "initial", "important"));
|
|
|
return element;
|
|
return element;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -816,6 +816,128 @@
|
|
|
return typeof value == "symbol";
|
|
return typeof value == "symbol";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
|
+ * Copyright 2010-2020 Gildas Lormeau
|
|
|
|
|
+ * contact : gildas.lormeau <at> gmail.com
|
|
|
|
|
+ *
|
|
|
|
|
+ * This file is part of SingleFile.
|
|
|
|
|
+ *
|
|
|
|
|
+ * The code in this file is free software: you can redistribute it and/or
|
|
|
|
|
+ * modify it under the terms of the GNU Affero General Public License
|
|
|
|
|
+ * (GNU AGPL) as published by the Free Software Foundation, either version 3
|
|
|
|
|
+ * of the License, or (at your option) any later version.
|
|
|
|
|
+ *
|
|
|
|
|
+ * The code in this file is distributed in the hope that it will be useful,
|
|
|
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
|
|
|
|
|
+ * General Public License for more details.
|
|
|
|
|
+ *
|
|
|
|
|
+ * As additional permission under GNU AGPL version 3 section 7, you may
|
|
|
|
|
+ * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
|
|
|
|
|
+ * AGPL normally required by section 4, provided you include this license
|
|
|
|
|
+ * notice and a URL through which recipients can access the Corresponding
|
|
|
|
|
+ * Source.
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+ /* global browser, document, globalThis, prompt, getComputedStyle, addEventListener, removeEventListener, requestAnimationFrame, setTimeout, getSelection, Node */
|
|
|
|
|
+
|
|
|
|
|
+ const singlefile = globalThis.singlefile;
|
|
|
|
|
+
|
|
|
|
|
+ singlefile.helper.SELECTED_CONTENT_ATTRIBUTE_NAME;
|
|
|
|
|
+ const LOGS_WINDOW_TAGNAME = "singlefile-logs-window";
|
|
|
|
|
+ const LOGS_CLASSNAME = "singlefile-logs";
|
|
|
|
|
+ const LOGS_LINE_CLASSNAME = "singlefile-logs-line";
|
|
|
|
|
+ const LOGS_LINE_TEXT_ELEMENT_CLASSNAME = "singlefile-logs-line-text";
|
|
|
|
|
+ const LOGS_LINE_STATUS_ELEMENT_CLASSNAME = "singlefile-logs-line-icon";
|
|
|
|
|
+ const SINGLE_FILE_UI_ELEMENT_CLASS = singlefile.helper.SINGLE_FILE_UI_ELEMENT_CLASS;
|
|
|
|
|
+ const CSS_PROPERTIES = new Set(Array.from(getComputedStyle(document.documentElement)));
|
|
|
|
|
+ let LOG_PANEL_WIDTH, LOG_PANEL_DEFERRED_IMAGES_MESSAGE, LOG_PANEL_FRAME_CONTENTS_MESSAGE, LOG_PANEL_EMBEDDED_IMAGE_MESSAGE, LOG_PANEL_STEP_MESSAGE;
|
|
|
|
|
+ try {
|
|
|
|
|
+ LOG_PANEL_WIDTH = browser.i18n.getMessage("logPanelWidth");
|
|
|
|
|
+ LOG_PANEL_DEFERRED_IMAGES_MESSAGE = browser.i18n.getMessage("logPanelDeferredImages");
|
|
|
|
|
+ LOG_PANEL_FRAME_CONTENTS_MESSAGE = browser.i18n.getMessage("logPanelFrameContents");
|
|
|
|
|
+ LOG_PANEL_EMBEDDED_IMAGE_MESSAGE = browser.i18n.getMessage("logPanelEmbeddedImage");
|
|
|
|
|
+ LOG_PANEL_STEP_MESSAGE = browser.i18n.getMessage("logPanelStep");
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ // ignored
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let logsWindowElement;
|
|
|
|
|
+ createLogsWindowElement();
|
|
|
|
|
+
|
|
|
|
|
+ function promptMessage(message, defaultValue) {
|
|
|
|
|
+ return prompt(message, defaultValue);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function createLogsWindowElement() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ logsWindowElement = document.querySelector(LOGS_WINDOW_TAGNAME);
|
|
|
|
|
+ if (!logsWindowElement) {
|
|
|
|
|
+ logsWindowElement = createElement(LOGS_WINDOW_TAGNAME);
|
|
|
|
|
+ const shadowRoot = logsWindowElement.attachShadow({ mode: "open" });
|
|
|
|
|
+ const styleElement = document.createElement("style");
|
|
|
|
|
+ styleElement.textContent = `
|
|
|
|
|
+ @keyframes single-file-pulse {
|
|
|
|
|
+ 0% {
|
|
|
|
|
+ opacity: .25;
|
|
|
|
|
+ }
|
|
|
|
|
+ 100% {
|
|
|
|
|
+ opacity: 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .${LOGS_CLASSNAME} {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ bottom: 24px;
|
|
|
|
|
+ left: 8px;
|
|
|
|
|
+ z-index: 2147483647;
|
|
|
|
|
+ opacity: 0.9;
|
|
|
|
|
+ padding: 4px;
|
|
|
|
|
+ background-color: white;
|
|
|
|
|
+ min-width: ${LOG_PANEL_WIDTH}px;
|
|
|
|
|
+ min-height: 16px;
|
|
|
|
|
+ transition: height 100ms;
|
|
|
|
|
+ }
|
|
|
|
|
+ .${LOGS_LINE_CLASSNAME} {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ padding: 2px;
|
|
|
|
|
+ font-family: arial, sans-serif;
|
|
|
|
|
+ color: black;
|
|
|
|
|
+ background-color: white;
|
|
|
|
|
+ }
|
|
|
|
|
+ .${LOGS_LINE_TEXT_ELEMENT_CLASSNAME} {
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ opacity: 1;
|
|
|
|
|
+ transition: opacity 200ms;
|
|
|
|
|
+ }
|
|
|
|
|
+ .${LOGS_LINE_STATUS_ELEMENT_CLASSNAME} {
|
|
|
|
|
+ font-size: 11px;
|
|
|
|
|
+ min-width: 15px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ top: 1px;
|
|
|
|
|
+ }
|
|
|
|
|
+ `;
|
|
|
|
|
+ shadowRoot.appendChild(styleElement);
|
|
|
|
|
+ const logsContentElement = document.createElement("div");
|
|
|
|
|
+ logsContentElement.classList.add(LOGS_CLASSNAME);
|
|
|
|
|
+ shadowRoot.appendChild(logsContentElement);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ // ignored
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function createElement(tagName, parentElement) {
|
|
|
|
|
+ const element = document.createElement(tagName);
|
|
|
|
|
+ element.className = SINGLE_FILE_UI_ELEMENT_CLASS;
|
|
|
|
|
+ if (parentElement) {
|
|
|
|
|
+ parentElement.appendChild(element);
|
|
|
|
|
+ }
|
|
|
|
|
+ CSS_PROPERTIES.forEach(property => element.style.setProperty(property, "initial", "important"));
|
|
|
|
|
+ return element;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/*
|
|
/*
|
|
|
* Copyright 2010-2020 Gildas Lormeau
|
|
* Copyright 2010-2020 Gildas Lormeau
|
|
|
* contact : gildas.lormeau <at> gmail.com
|
|
* contact : gildas.lormeau <at> gmail.com
|
|
@@ -865,7 +987,17 @@
|
|
|
if (options.sharePage && navigator.share) {
|
|
if (options.sharePage && navigator.share) {
|
|
|
await sharePage(pageData, options);
|
|
await sharePage(pageData, options);
|
|
|
} else {
|
|
} else {
|
|
|
- if (pageData.filename && pageData.filename.length) {
|
|
|
|
|
|
|
+ let filename = pageData.filename;
|
|
|
|
|
+ if (options.confirmFilename) {
|
|
|
|
|
+ filename = promptMessage("Save as", pageData.filename);
|
|
|
|
|
+ if (filename) {
|
|
|
|
|
+ pageData.filename = filename;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ browser.runtime.sendMessage({ method: "downloads.cancel" });
|
|
|
|
|
+ browser.runtime.sendMessage({ method: "ui.processCancelled" });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (filename) {
|
|
|
const link = document.createElement("a");
|
|
const link = document.createElement("a");
|
|
|
link.download = pageData.filename;
|
|
link.download = pageData.filename;
|
|
|
link.href = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));
|
|
link.href = URL.createObjectURL(new Blob([pageData.content], { type: pageData.mimeType }));
|