how to use an input that calls functions?

Viewed 38

I want to create my first google chrome extension based on the following code:

<input name="inpt" id="inpt" />
<button id="btn" onClick="onClickHandler( document.getElementById('inpt').value )">Enter</button>
<script>
    functions = {
 1 : function(){alert(1);},
 2 : function(){alert(2);},
 3 : function(){alert(3);},
 4 : function(){alert(4);},
 5 : function(){alert(5);},
 6 : function(){alert(6);},
}
 
function onClickHandler(f){
  functions[f]();
}
</script>

now i want to convert this code to chrome extension and so i did the following

manifest.json

{
    "name": "Zero Retard",
    "version": "1.0",
    "manifest_version": 3,
    "description": "Auto fill form GRC",
    "icons": { 
        "16": "icon/icon.png",
        "48": "icon/icon.png",
        "128": "icon/icon.png" 
    },
    "action": {
        "default_popup": "index.html",
        "default_icon": "icon/icon.png"
    },
    "options_page": "options.html",
    "content_scripts": [
        {
            "matches" : [
                "http://*/*",
                "https://*/*"
            ],
            "js": ["jquery-3.6.0.min.js", "injector.js"]
        }
    ],
    "permissions": [
        "clipboardWrite",
        "activeTab",
        "notifications",
        "contextMenus",
        "storage",
        "scripting",
        "tabs"
    ]
}

index.html

<!doctype html>
<html>
  <head>
<style>
body {
min-width: 120px;
overflow-x: hidden;
font-family: Arial, sans-serif;
font-size: 12px;
        }
        input, textarea {
            width: 140px;
        }
        input#save {
            font-weight: bold; width: auto;
 
        }
    </style>
 
  </head>
  <body>
<h1>GRC</h1>
    <center><form>
  <div>
<label><b>Veuillez saisir un code</b></label>
    <input name="inpt" id="inpt" autocomplete="off"/>
 <p>
<button id="btn">Enter</button>
<script src="popup.js"></script>
</p>
  </div>
</form></center>
  </body>
</html>

popup.js

const button = document.getElementById('btn');
const input = document.getElementById('inpt');
 
button.onclick = async evt => {
 
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  await chrome.scripting.executeScript({
    target: { tabId: tab.id },
    files: ['injector.js'],
 
  });
  await chrome.scripting.executeScript({
    target: { tabId: tab.id },
    func: inPage,
    args: [input.value],
  });
  window.close();
};
 
function inPage(popup) {
  functions[popup]();

injector.js

functions = { 
  1 : function(){alert(1);}, 
  2 : function(){alert(2);}, 
  3 : function(){alert(3);},
  4 : function(){alert(4);}, 
  5 : function(){alert(5);}, 
  6 : function(){alert(6);}, 
}

Is there a solution that allows me to do this. I'm fairly new to all of this, so any help would be much appreciated.

2 Answers

If I were you, I'd remove injector.js and change manifest.json and popup.js like this:

manifest.json

{
  "name": "Zero Retard",
  "version": "1.0",
  "manifest_version": 3,
  "description": "Auto fill form GRC",
  "action": {
    "default_popup": "index.html"
  }
}

popup.js

const button = document.getElementById('btn');
const input = document.getElementById('inpt');

button.onclick = () => {
  functions[input.value]();
};

functions = {
  1: function () { alert(1); },
  2: function () { alert(2); },
  3: function () { alert(3); },
  4: function () { alert(4); },
  5: function () { alert(5); },
  6: function () { alert(6); },
}
<input name="inpt" id="inpt" />
<button id="btn" onClick="onClickHandler(value)">Enter</button>
<script>
let value=document.getElementById('inpt').value;
    functions = {
 1 : function(){alert(1);},
 2 : function(){alert(2);},
 3 : function(){alert(3);},
 4 : function(){alert(4);},
 5 : function(){alert(5);},
 6 : function(){alert(6);},
}
 let allValues=Object.values(functions)
function onClickHandler(value){
  console.log(Object.values(functions)[value]())
}
</script>
Related