Actualizacion maquina principal
[dotfiles/.git] / .config / BraveSoftware / Brave-Browser / Default / Extensions / cimiefiiaegbelhefglklhhakcgmhkai / 1.7.6_0 / extension-purpose.js
diff --git a/.config/BraveSoftware/Brave-Browser/Default/Extensions/cimiefiiaegbelhefglklhhakcgmhkai/1.7.6_0/extension-purpose.js b/.config/BraveSoftware/Brave-Browser/Default/Extensions/cimiefiiaegbelhefglklhhakcgmhkai/1.7.6_0/extension-purpose.js
new file mode 100644 (file)
index 0000000..6f9b369
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+    Copyright (C) 2019 Kai Uwe Broulik <kde@privat.broulik.de>
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 3 of
+    the License, or (at your option) any later version.
+
+    This program 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+const purposeShareMenuId = "purpose_share";
+let hasPurposeMenu = false;
+
+// Stores <notification id, share url> so that when you click the finished
+// notification it will open the URL
+let purposeNotificationUrls = {};
+
+function purposeShare(data) {
+    return new Promise((resolve, reject) => {
+        sendPortMessageWithReply("purpose", "share", {data}).then((reply) => {
+            if (!reply.success) {
+                if (!["BUSY", "CANCELED", "INVALID_ARGUMENT"].includes(reply.errorCode)
+                    && reply.errorCode !== 1 /*ERR_USER_CANCELED*/) {
+                    chrome.notifications.create(null, {
+                        type: "basic",
+                        title: chrome.i18n.getMessage("purpose_share_failed_title"),
+                        message: chrome.i18n.getMessage("purpose_share_failed_text",
+                                                        reply.errorMessage || chrome.i18n.getMessage("general_error_unknown")),
+                        iconUrl: "icons/document-share-failed.png"
+                    });
+                }
+
+                reject();
+                return;
+            }
+
+            let url = reply.response.url;
+            if (url) {
+                chrome.notifications.create(null, {
+                    type: "basic",
+                    title: chrome.i18n.getMessage("purpose_share_finished_title"),
+                    message: chrome.i18n.getMessage("purpose_share_finished_text", url),
+                    iconUrl: "icons/document-share.png"
+                }, (notificationId) => {
+                    if (chrome.runtime.lastError) {
+                        return;
+                    }
+
+                    purposeNotificationUrls[notificationId] = url;
+                });
+            }
+
+            resolve();
+        });
+    });
+}
+
+function checkPurposeEnabled() {
+    return Promise.all([
+        sendPortMessageWithReply("settings", "getSubsystemStatus"),
+        SettingsUtils.get()
+    ]).then((result) => {
+
+        const subsystemStatus = result[0];
+        const settings = result[1];
+
+        // HACK Unfortunately I removed the loaded/unloaded signals for plugins
+        // so we can't reliably know on settings change whether a module is enabled
+        // sending settings is also legacy done without a reply we could wait for.
+        // Instead, check whether the module is known and enabled in settings,
+        // which should be close enough, since purpose plugin also has no additional
+        // dependencies that could make it fail to load.
+        return subsystemStatus.hasOwnProperty("purpose")
+            && settings.purpose && settings.purpose.enabled;
+    });
+}
+
+function updatePurposeMenu() {
+    checkPurposeEnabled().then((enabled) => {
+        if (enabled && !hasPurposeMenu) {
+            let props = {
+                id: purposeShareMenuId,
+                contexts: ["link", "page", "image", "audio", "video", "selection"],
+                title: chrome.i18n.getMessage("purpose_share")
+            };
+
+            if (IS_FIREFOX) {
+                props.icons = {
+                    "16": "icons/document-share-symbolic.svg"
+                }
+            }
+
+            chrome.contextMenus.create(props, () => {
+                const error = chrome.runtime.lastError;
+                if (error) {
+                    console.warn("Error creating purpose context menu", error.message);
+                    return;
+                }
+                hasPurposeMenu = true;
+            });
+        } else if (!enabled && hasPurposeMenu) {
+            chrome.contextMenus.remove(purposeShareMenuId, () => {
+                const error = chrome.runtime.lastError;
+                if (error) {
+                    console.warn("Error removing purpose context menu", error.message);
+                    return;
+                }
+                hasPurposeMenu = false;
+            });
+        }
+    });
+}
+
+chrome.contextMenus.onClicked.addListener((info) => {
+    if (info.menuItemId !== purposeShareMenuId) {
+        return;
+    }
+
+    let url = info.linkUrl || info.srcUrl || info.pageUrl;
+    let selection = info.selectionText;
+    if (!url && !selection) {
+        return;
+    }
+
+    let shareData = {};
+    if (selection) {
+        shareData.text = selection;
+    } else if (url) {
+        shareData.url = url;
+        if (info.linkText && info.linkText != url) {
+            shareData.title = info.linkText;
+        }
+    }
+
+    // We probably shared the current page, add its title to shareData
+    new Promise((resolve, reject) => {
+        if (!info.linkUrl && !info.srcUrl && info.pageUrl) {
+            chrome.tabs.query({
+                // more correct would probably be currentWindow + activeTab
+                url: info.pageUrl
+            }, (tabs) => {
+                if (tabs[0]) {
+                    return resolve(tabs[0].title);
+                }
+                resolve("");
+            });
+            return;
+        }
+
+        resolve("");
+    }).then((title) => {
+        if (title) {
+            shareData.title = title;
+        }
+
+        purposeShare(shareData);
+    });
+});
+
+SettingsUtils.onChanged().addListener((delta) => {
+    if (delta.purpose) {
+        updatePurposeMenu();
+    }
+});
+
+addRuntimeCallback("purpose", "share", (message, sender, action) => {
+    return purposeShare(message);
+});
+
+chrome.notifications.onClicked.addListener((notificationId) => {
+    const url = purposeNotificationUrls[notificationId];
+    if (url) {
+        chrome.tabs.create({url});
+    }
+});
+
+chrome.notifications.onClosed.addListener((notificationId) => {
+    delete purposeNotificationUrls[notificationId];
+});