| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- * 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 */
- import * as config from "./config.js";
- import * as tabs from "./tabs.js";
- const MAX_CONTENT_SIZE = 32 * (1024 * 1024);
- const EDITOR_PAGE_URL = "/extension/ui/pages/editor.html";
- const tabsData = new Map();
- const partialContents = new Map();
- const EDITOR_URL = browser.runtime.getURL(EDITOR_PAGE_URL);
- export {
- onMessage,
- onTabRemoved,
- isEditor,
- open,
- EDITOR_URL
- };
- async function open({ tabIndex, content, filename }) {
- const createTabProperties = { active: true, url: EDITOR_PAGE_URL };
- if (tabIndex != null) {
- createTabProperties.index = tabIndex;
- }
- const tab = await tabs.create(createTabProperties);
- tabsData.set(tab.id, { content, filename });
- }
- function onTabRemoved(tabId) {
- tabsData.delete(tabId);
- }
- function isEditor(tab) {
- return tab.url == EDITOR_URL;
- }
- async function onMessage(message, sender) {
- if (message.method.endsWith(".getTabData")) {
- const tab = sender.tab;
- const tabData = tabsData.get(tab.id);
- const options = await config.getOptions(tabData.url);
- if (tabData) {
- const content = JSON.stringify(tabData);
- for (let blockIndex = 0; blockIndex * MAX_CONTENT_SIZE < content.length; blockIndex++) {
- const message = {
- method: "editor.setTabData"
- };
- message.truncated = content.length > MAX_CONTENT_SIZE;
- if (message.truncated) {
- message.finished = (blockIndex + 1) * MAX_CONTENT_SIZE > content.length;
- message.content = content.substring(blockIndex * MAX_CONTENT_SIZE, (blockIndex + 1) * MAX_CONTENT_SIZE);
- } else {
- message.content = content;
- message.options = options;
- }
- await tabs.sendMessage(tab.id, message);
- }
- }
- }
- if (message.method.endsWith(".open")) {
- let contents;
- const tab = sender.tab;
- if (message.truncated) {
- contents = partialContents.get(tab.id);
- if (!contents) {
- contents = [];
- partialContents.set(tab.id, contents);
- }
- contents.push(message.content);
- if (message.finished) {
- partialContents.delete(tab.id);
- }
- } else if (message.content) {
- contents = [message.content];
- }
- if (!message.truncated || message.finished) {
- const updateTabProperties = { url: EDITOR_PAGE_URL };
- await tabs.update(tab.id, updateTabProperties);
- tabsData.set(tab.id, { url: tab.url, content: contents.join(""), filename: message.filename });
- }
- }
- }
|