diff --git a/background.js b/background.js index 73ccbf7..0ff560f 100644 --- a/background.js +++ b/background.js @@ -1,15 +1,37 @@ chrome.runtime.onInstalled.addListener(function() { - chrome.contextMenus.create({ "id": "copy_form", "title": "Copy Form", "contexts": ["editable"] }); - chrome.contextMenus.create({ "id": "paste_form", "title": "Paste Form", "contexts": ["editable"], enabled: false }); + chrome.contextMenus.create({ "id": "copy-form", "title": "Copy Form", "contexts": ["editable"] }); + chrome.contextMenus.create({ "id": "paste-form", "title": "Paste Form", "contexts": ["editable"], enabled: false }); + chrome.contextMenus.create({ "id": "paste-form2", "title": "Paste Form (with Hidden)", "contexts": ["editable"], enabled: false }); }); chrome.contextMenus.onClicked.addListener(function(msg, tab) { switch (msg.menuItemId) { - case "copy_form": + case "copy-form": copyFormContextMenu(tab); break; - case "paste_form": - pastFormContextMenu(tab); + case "paste-form": + pasteFormContextMenu(tab, false); + break; + case "paste-form2": + pasteFormContextMenu(tab, true); + break; + default: break; + } +}); + +chrome.commands.onCommand.addListener(function (command) { + switch (command) { + case 'copy-form': + chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) { + copyFormContextMenu(tabs[0]); + }); + + break; + case 'paste-form': + chrome.tabs.query({ currentWindow: true, active: true }, function (tabs) { + pasteFormContextMenu(tabs[0], false); + }); + break; default: break; } @@ -20,23 +42,26 @@ chrome.contextMenus.onClicked.addListener(function(msg, tab) { function copyFormContextMenu(tab) { chrome.tabs.sendMessage(tab.id, { action: "copy" }, function(response) { - if (response) { + try { chrome.storage.local.set({ 'clipboard': JSON.stringify(response) },function() { - chrome.contextMenus.update("paste_form", { enabled: true }); + chrome.contextMenus.update("paste-form", { enabled: true }); + chrome.contextMenus.update("paste-form2", { enabled: true }); }); - } else { - // Reload required + } catch (err) { + // Do nothing } }); } -function pastFormContextMenu(tab) { +function pasteFormContextMenu(tab, includeHiddenEl) { chrome.storage.local.get('clipboard', function(response) { try { - let msgData = JSON.parse(response.clipboard); - msgData.action = "paste"; + const payload = { + action: (includeHiddenEl === true ? "paste2" : "paste"), + formData: JSON.parse(response.clipboard) + }; - chrome.tabs.sendMessage(tab.id, msgData); + chrome.tabs.sendMessage(tab.id, payload); } catch (err) { // Do nothing } diff --git a/content.js b/content.js index 55662a7..cafb489 100644 --- a/content.js +++ b/content.js @@ -1,75 +1,97 @@ -chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { - - const parentForm = getParentFormNode(document.activeElement); - if (parentForm == null) { - console.log("Form not found"); - return; - } - - switch (request.action) { +chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { + switch (message.action) { case "copy": - const result = buildFormValueSet(parentForm, "input", "select", "textarea"); - - console.log(result); - + const result = copyFormElementValues(document.activeElement); sendResponse(result); - break; case "paste": - delete request.pasteForm; - - // console.log(request); - - for (let key in request) { - if (String.isNullOrWhitespace(key)) { - continue; - } - - const dataType = checkDataType(request[key]); - if (dataType == "object") { - continue; - } - - const foundElements = parentForm.querySelectorAll("[name='" + key + "']"); - if (foundElements.length <= 0) { - continue; - } - - if (dataType == "array") { - setFormElementValues(foundElements, request[key]); - } else { - for (let x=0; x 0) { - return foundForms[0]; - } + return null; } while (true) { @@ -103,9 +122,25 @@ function getParentFormNode(node) { } /** - * Push form element value to array. + * Get form node in iframe. */ -function buildFormValueSet(form, ...tagNames){ +function getIFrameFormNode(node) { + if (node.nodeName.toLocaleLowerCase() != "iframe") { + return null; + } + + const foundEls = (node.contentDocument || node.contentWindow).getElementsByTagName("form"); + if (foundEls.length <= 0) { + return null; + } + + return foundEls[0]; +} + +/** + * Get form element values. + */ +function getFormElementValueSet(form, ...tagNames){ let result = { }; for (let x=0; x " + message); +} + + + + +Object.getDataType = function(value) { + if (String.isNullOrUndefined(value)) { + return "null"; + } + + if (typeof(value) == "object") { + if (Array.isArray(value)) { + return "array"; + } else { + return "object"; + } + } + + return typeof(value); +}; + String.isNullOrUndefined = function(value) { if (typeof (value) == "undefined") { return true; diff --git a/manifest.json b/manifest.json index 06bc7e4..38a7ab6 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,20 @@ "manifest_version": 3, "name": "Form Copypasta", "description": "Copy and paste form element values. Not for distribution. Internal use only. Based on Copy Form (0.0.1.2) by Sam Larison.", - "version": "0.1.0.028", + "version": "0.1.0.075", + "icons": { + "16": "icon16.png", + "32": "icon32.png", + "48": "icon48.png", + "64": "icon64.png", + "128": "icon128.png" + }, + "permissions": [ + "activeTab", + "contextMenus", + "storage", + "tabs" + ], "content_scripts": [ { "js": [ @@ -19,17 +32,22 @@ "service_worker": "background.js", "type": "module" }, - "icons": { - "16": "icon16.png", - "32": "icon32.png", - "48": "icon48.png", - "64": "icon64.png", - "128": "icon128.png" - }, - "permissions": [ - "activeTab", - "contextMenus", - "storage", - "tabs" - ] + "commands": { + "copy-form": { + "suggested_key": { + "default": "Ctrl+Shift+2", + "windows": "Ctrl+Shift+2", + "mac": "Command+Shift+2" + }, + "description": "Copy form" + }, + "paste-form": { + "suggested_key": { + "default": "Ctrl+Shift+3", + "windows": "Ctrl+Shift+3", + "mac": "Command+Shift+3" + }, + "description": "Paste form" + } + } } \ No newline at end of file