From 2b97d44a4f27d12f99faf62455e55dba84a4ee8d Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 1 Feb 2024 20:31:47 +0000 Subject: [PATCH] Added support for paste with hidden elements Added support for no parent form node found Refactored --- background.js | 10 ++-- content.js | 125 +++++++++++++++++++++++++++++++++++--------------- manifest.json | 2 +- 3 files changed, 95 insertions(+), 42 deletions(-) diff --git a/background.js b/background.js index 73ccbf7..06754e0 100644 --- a/background.js +++ b/background.js @@ -1,6 +1,7 @@ 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": "paste_form2", "title": "Paste Form (with Hidden)", "contexts": ["editable"], enabled: false }); }); chrome.contextMenus.onClicked.addListener(function(msg, tab) { @@ -9,7 +10,10 @@ chrome.contextMenus.onClicked.addListener(function(msg, tab) { copyFormContextMenu(tab); break; case "paste_form": - pastFormContextMenu(tab); + pasteFormContextMenu(tab, false); + break; + case "paste_form2": + pasteFormContextMenu(tab, true); break; default: break; } @@ -30,11 +34,11 @@ function copyFormContextMenu(tab) { }); } -function pastFormContextMenu(tab) { +function pasteFormContextMenu(tab, includeHiddenEl) { chrome.storage.local.get('clipboard', function(response) { try { let msgData = JSON.parse(response.clipboard); - msgData.action = "paste"; + msgData.action = (includeHiddenEl === true ? "paste2" : "paste"); chrome.tabs.sendMessage(tab.id, msgData); } catch (err) { diff --git a/content.js b/content.js index 55662a7..3e9b97c 100644 --- a/content.js +++ b/content.js @@ -1,14 +1,13 @@ chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { - - const parentForm = getParentFormNode(document.activeElement); - if (parentForm == null) { - console.log("Form not found"); + let formContainer = getContainer(document.activeElement); + if (formContainer == null) { + writeLog("Form container not found"); return; } switch (request.action) { case "copy": - const result = buildFormValueSet(parentForm, "input", "select", "textarea"); + const result = getFormElementValueSet(formContainer, "input", "select", "textarea"); console.log(result); @@ -16,30 +15,31 @@ chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { break; case "paste": - delete request.pasteForm; + case "paste2": + const includeHidden = (request.action == "paste2"); - // console.log(request); + delete request.action; for (let key in request) { if (String.isNullOrWhitespace(key)) { continue; } - const dataType = checkDataType(request[key]); + const dataType = Object.getDataType(request[key]); if (dataType == "object") { continue; } - const foundElements = parentForm.querySelectorAll("[name='" + key + "']"); - if (foundElements.length <= 0) { + const foundEls = formContainer.querySelectorAll("[name='" + key + "']"); + if (foundEls.length <= 0) { continue; } if (dataType == "array") { - setFormElementValues(foundElements, request[key]); + setFormElementValues(foundEls, request[key], includeHidden); } else { - for (let x=0; x 0) { - return foundForms[0]; - } + return null; } while (true) { @@ -103,9 +105,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..3feb213 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "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.035", "content_scripts": [ { "js": [