chrome.tabs.onCreated and executescript for Chrome Extensions not working - javascript

I'm trying to execute some script inside another external page off of a new tab listener.
background.js
function onCreatedChrome(){
chrome.tabs.onCreated.addListener(function(tab) {
if (tab.url.indexOf("chrome-devtools://") == -1) {
localStorage.setItem("tabid", tab.id);
chrome.tabs.executeScript(tab.id, {code: "alert('Hello World')"}, function() {
if (chrome.runtime.lastError) {
localStorage.setItem("Error", chrome.runtime.lastError.message);
console.error(chrome.runtime.lastError.message);
}
else{
localStorage.setItem("Else case", "This should work")
}
});
}
});
}
function createTab(){
return function(){
var url = "https://www.yahoo.com/";
chrome.tabs.create({ url: url });
}
}
$(document).ready(function(){
onCreatedChrome();
$("#button").click(createTab());
});
manifest.json
{
"manifest_version": 2,
"name": "Execute Script",
"description": "ExecuteScript extension",
"version": "1.0",
"permissions": [
"activeTab",
"tabs",
"http://*/*",
"https://www.yahoo.com/*"
],
"content_scripts": [
{
"matches": ["https://*/*"],
"js": ["jquery.js"]
}
],
"background":{
"scripts": ["background.js",
"jquery.js"]
},
"browser_action": {
"default_popup": "index.html"
}
}
index.html
<html>
<head></head>
<body>
<button id="button">Click Me</button>
</body>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="background.js"></script>
</html>
I want thealert('Hello World')to be injected into Yahoo!'s homepage (This is just an example of what I am trying to do in another extension)

The problem with your code is becuase you added jQuery.js after the background.js file
Here is the fix:
"background":{
"scripts": ["jquery.js",
"background.js"]
},
Another alternative for the executeScrit task:
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (changeInfo.status != 'complete')
return;
if (tab.url.indexOf('yahoo.com') != -1) {
chrome.tabs.executeScript(tabId, {
code: 'alert(1)'
});
}
});

Related

Chrome Extension Background Function

I'm trying to define a background function and use it in popup.js. Because, I want to send POST request and don't know a way to do it in popup.js. I've searched for it and so many people just say, it's better to send a POST request in background.js. And chrome blocks the request from popup.js.
Here is my manifest.json:
{
"name": "Getting Started Example",
"version": "1.0",
"description": "Build an Extension!",
"permissions": [
"declarativeContent",
"activeTab",
"tabs",
"storage",
"webNavigation",
"<all_urls>"
],
"background_page": "background.html",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"page_action": {
"default_popup": "popup.html",
"default_icon": {
"16": "icon-16.png",
"48": "icon-48.png",
"128": "icon-128.png"
}
},
"icons": {
"16": "icon-16.png",
"48": "icon-48.png",
"128": "icon-128.png"
},
"manifest_version": 2
}
How can I do it?
Have a look at my code, I have build one password manager extension which interact server and get password to fill in form and it works like a charm. below is the manifest of this app.
{
"name": "Password Manager",
"version": "0.3",
"description": "Manage all Passwords",
"options_page": "options.html",
"permissions": [
"contentSettings",
"tabs",
"activeTab",
"http://*/",
"storage",
"webRequest",
"webRequestBlocking",
"debugger",
"<all_urls>",
{"fileSystem": ["write", "retainEntries", "directory"]}
],
"browser_action": {
"default_icon": "images/icon.png",
"default_popup": "app.html"
},
"manifest_version": 2,
"content_scripts": [
{
"matches": [
"*://*/*"
],
"js": [
"scripts/jquery.js"
]
}],
"background": {
"scripts": [
"scripts/jquery.js",
"scripts/custom.js"
],
"persistent": true
}
}
if you have a look at app.html code below I am able to execute the code in popup.js
<!DOCTYPE html>
<html>
<head>
<title>Popup</title>
<link href="css/bootstrap.css" rel="stylesheet" />
<link href="css/style.min.css" rel="stylesheet" />
<style>
body {
margin: 20p;
padding: 20px;
width: 300px;
min-height: 150px;
}
.header{
width: 100%;
position: absolute;
top: 20px;
}
</style>
</head>
<body>
<br/>
<div class='header'>
User: <label id="username" ></label>
<br/><button class='btn btn-xs btn-warning options_helper' >Settings</button>
</div>
<br/><hr/>
<div id="jstree_demo_div">
</div>
</body>
<script src="scripts/jquery.js"></script>
<script src="scripts/bootstrap.js"></script>
<script src="scripts/jstree.min.js"></script>
<script src="scripts/popup.js"></script>
<script src="scripts/components/core.js"></script>
<script src="scripts/components/lib-typedarrays.js"></script>
<script src="scripts/components/x64-core.js"></script>
<script src="scripts/components/enc-utf16.js"></script>
<script src="scripts/components/enc-base64.js"></script>
<script src="scripts/components/md5.js"></script>
<script src="scripts/components/sha1.js"></script>
<script src="scripts/components/sha256.js"></script>
<script src="scripts/components/sha224.js"></script>
<script src="scripts/components/sha512.js"></script>
<script src="scripts/components/sha384.js"></script>
<script src="scripts/components/ripemd160.js"></script>
<script src="scripts/components/hmac.js"></script>
<script src="scripts/components/pbkdf2.js"></script>
<script src="scripts/components/evpkdf.js"></script>
<script src="scripts/components/cipher-core.js"></script>
<script src="scripts/components/mode-cfb.js"></script>
<script src="scripts/components/mode-ctr.js"></script>
<script src="scripts/components/mode-ofb.js"></script>
<script src="scripts/components/mode-ecb.js"></script>
<script src="scripts/components/pad-ansix923.js"></script>
<script src="scripts/components/pad-iso10126.js"></script>
<script src="scripts/components/pad-zeropadding.js"></script>
<script src="scripts/components/pad-iso97971.js"></script>
<script src="scripts/components/pad-nopadding.js"></script>
<script src="scripts/components/rc4.js"></script>
<script src="scripts/components/rabbit.js"></script>
<script src="scripts/components/aes.js"></script>
<script src="scripts/components/tripledes.js"></script>
<script src="scripts/crypt.js" type="text/javascript"></script>
</html>
and final part for you as you can see I am using ajax in popup.js to retrieve passwords file to save it locally from server.
// document.addEventListener("contextmenu", function(e) {
// e.preventDefault();
// });
var key = localStorage.getItem("access_key");
$(document).ready(function(){
readTextFile("file://"+localStorage.getItem("db_path"));
var menuItems="";
var key = '';
});
$('#jstree_demo_div').on("select_node.jstree", function (e, data) {
chrome.tabs.query({ currentWindow: true, active: true },function (tabArray) {
chrome.tabs.executeScript(tabArray[0].id, {
file: 'scripts/pop.js'
}, function() {
chrome.tabs.sendMessage(tabArray[0].id,{type: data.node.data.jstree.type, options: {
user: data.node.data.jstree.user,
pass: data.node.data.jstree.pass
}
})
})
}
);
});
$(".options_helper").click(function(){
chrome.tabs.create({ url: "options.html" });
})
function readTextFile(file)
{
var rawFile = new XMLHttpRequest();
rawFile.open("GET", file, false);
rawFile.onreadystatechange = function ()
{
if(rawFile.readyState === 4)
{
if(rawFile.status === 200 || rawFile.status == 0)
{
var fullresponse = decrypt(rawFile.responseText,key);
var username = fullresponse.split("|")[1];
var userdata = fullresponse.split("|")[0];
$("#username").text(username);
if (decrypt(rawFile.responseText,key).length>0){
$('#jstree_demo_div').html(userdata);
$('#jstree_demo_div').jstree();
}else{
$('#jstree_demo_div').html("Password Database is not found");
}
}else{
$('#jstree_demo_div').html("Password Database is not found");
}
}else{
}
}
rawFile.send(null);
}
Hope I am able to help you with my whole program written. In case you have question for any part of it. do let me know.

How to change text bold using chrome extension?

I am a programming beginner. I would like to develop a simple Chrome extension that allows to bold for dragged content, when I click a button in popup.html. I succeeded to make bold for dragged content, when I click a default icon, but making a button in popup.html with the function required more complex way.
I think that popup.js is necessary to send a message to content.js to trigger the function boldText(). I struggled to use chrome.tabs.sendMessgge or other things to trigger the function, but I failed.
Please give me some advice.
Here is my code:
1. manifest.json
{
"manifest_version": 2,
"name": "test",
"version" : "1.0",
"description": "test",
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["content.js"]
}],
"background": {
"scripts": ["jquery-3.3.1.slim.js", "background.js"]
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"tabs",
"storage",
"http://*/*",
"https://*/*"
]
}
2. background.js
chrome.browserAction.onClicked.addListener(buttonClicked);
function buttonClicked(tab) {
let msg = {
txt: "hello"
}
chrome.tabs.sendMessage(tab.id, msg);
}
3. content.js
chrome.runtime.onMessage.addListener(gotMessage);
function gotMessage(message, sender, sendResponse) {
if (message.txt === "hello") {
var selection = window.getSelection();
alert(selection);
boldText();
}
}
function boldText() {
document.designMode = "on"; // designMode on for execCommand
document.execCommand('Bold', false);
document.designMode = "off"; // designMode off for execCommand
return false;
}
4. popup.html
<!doctype html>
<html>
<head>
<script src="jquery-3.3.1.slim.js"></script>
<script src="popup.js"></script>
</head>
<body>
<button id="boldButton" value="bold">bold</button>
</body>
</html>

how to send message from backgroundjs to content script in chrome extension?

I am working on chrome extension and I've stuck on a very specific part where backgroundjs is suppose to send a message to current active tab .
This is my manifest file
manifest.json
{
"manifest_version": 2,
"name": "test",
"description": "Some_Test",
"version": "1.0",
"background": {
"page": "background.html"
},
"content_scripts": [
{
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "content.js" ]
}
],
"permissions": [
"background",
"activeTab",
"tabs",
"http://*/*",
"https://*/*"
],
"browser_action": {
"default_popup": "popup.html"
}
}
popup.html
<html>
<body>
<button id="read-button">Read</button>
<script type="text/javascript" src="popup.js"></script>
</body>
</html>
popup.js
function readObject(e) {
console.log(chrome.extension.getBackgroundPage().read());
}
document.getElementById('read-button').addEventListener('click', readObject);
background.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type="text/javascript" src="background.js"></script>
</body>
</html>
background.js
function read() {
chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
chrome.tabs.sendMessage(tabs[0].id, { greeting: "hello" }, function (response) {
return response.farewell;
});
});
}
content.js
chrome.runtime.onMessage.addListener(
function (request, sender, sendResponse) {
console.log("hello");
if (request.greeting == "hello")
sendResponse({ farewell: "goodbye" });
});
This is where the error is :
chrome.tabs.sendMessage(tabs[0].id, { greeting: "hello" }, function (response) {
return response.farewell;
});
It seems that I cannot access tabs[0] object or I am unable to understand the Array which it returns, because i want to access the active tab and tabs[0] simply means it is getting the first tab in the browser and not the active tab.
I think this can only happen if the active window is the Developer Tools of the background page.
Just switch to a normal browser window when testing the extension or define read() function in popup.js and remove the background page altogether if it's not absolutely needed.

javascript flashcard

Can someone please tell me why the following extension does not work? I tried to replace the inline script with script src=" ..." /script and it still doesn't work. Is it better to list both javascripts in content scripts or remove them both?
POPUP.html
<!DOCTYPE html>
<html>
<head>
<style>
body { width: 300px; }
textarea { width: 250px; height: 100px;}
</style>
<script>
function pasteSelection() {
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendRequest(tab.id, {method: "getSelection"}, function (response) {
var text = document.getElementById('text');
text.innerHTML = response.data;
});
});
}
</script>
</head>
<body>
<textarea id="text"> </textarea>
<button onclick="pasteSelection(); ">Paste Selection</button>
</body>
</html>
selection.js
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if (request.method == "getSelection")
sendResponse({data: window.getSelection().toString()});
else
sendResponse({}); // snub them.
});
manifest.json
{
"name": "Selected Text",
"version": "0.1",
"description": "Selected Text",
"browser_action": {
"default_title": "Selected Text",
"default_icon": "online.png",
"default_popup": "popup.html"
},
"permissions": [
"tabs",
"chrome://favicon/",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["selection.js", "paste.js"]
"run_at": "document_start",
"all_frames": true
}
]
}
You can't use any inline code and you are using several depreciated methods. Not moving all of the inline code to an external file is probably what is causing the problem, but it is not good to use depreciated methods anyway. Fixing it would make it look like this:
Popup.html
<!DOCTYPE html>
<html>
<head>
<style>
body { width: 300px; }
textarea { width: 250px; height: 100px;}
</style>
<script src="popup.js"></script>
</head>
<body>
<textarea id="text"> </textarea>
<button id="pasteButton">Paste Selection</button>
</body>
</html>
Popup.js
window.onload = function() {
var pasteButton = document.getElementById("pasteButton");
pasteButton.onclick = function(){
chrome.tabs.query({active:true,currentWindow:true}, function(tab) {
chrome.tabs.sendMessage(tab[0].id,{method:"getSelection"},function(response){
var text = document.getElementById('text');
text.innerHTML = response.data;
});
});
};
};
selection.js
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if (request.method == "getSelection")
sendResponse({data: window.getSelection().toString()});
else
sendResponse({}); // snub them.
});
Manifest.json
{
"name": "Selected Text",
"version": "0.1",
"description": "Selected Text",
"manifest_version": 2,
"browser_action": {
"default_title": "Selected Text",
"default_icon": "online.png",
"default_popup": "popup.html"
},
"permissions": [
"tabs",
"chrome://favicon/",
"http://*/*",
"https://*/*"
],
"content_scripts": [{
"matches": ["http://*/*"],
"js": ["selection.js", "paste.js"],
"run_at": "document_start",
"all_frames": true
}]
}

Get highlight text in current window and send it in a popup

I would like to make a chrome extension that use a popup to do :
select text
click on the chrome extension icon
get it in the popup (textarea, ...)
This question was already asked here but Google did updates and the code I found is not working anymore ...
selection.js
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if (request.method == "getSelection")
sendResponse({data: window.getSelection().toString()});
else
sendResponse({}); // snub them.
});
popup.html
<!DOCTYPE html>
<html>
<head>
<style>
body { width: 300px; }
textarea { width: 250px; height: 100px;}
</style>
<script>
function pasteSelection() {
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendRequest(tab.id, {method: "getSelection"}, function (response) {
var text = document.getElementById('text');
text.innerHTML = response.data;
});
});
}
function getSelectedText(){
if (window.getSelection){
var str = window.getSelection();
}else if (document.getSelection){
var str = document.getSelection();
}else {
var str = document.selection.createRange().text;
}
return str;
}
function affichage(){
var sel = getSelectedText();
alert(sel);
}
function addtext() {
document.form.champ.value = getSelectedText();
}
</script>
</head>
<body>
<form>
<textarea id="text"></textarea>
<button onclick="pasteSelection(); " type="submit">get text</button>
</form>
</body>
</html>
manifest.json
{
"name": "Selected Text",
"version": "0.1",
"description": "Selected Text",
"options_page": "page_options.html",
"browser_action": {
"default_title": "Selected Text",
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"tabs",
"chrome://favicon/",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["selection.js"],
"run_at": "document_start",
"all_frames": true
}
],
"manifest_version": 2
}
I thank you in advance for your help :)
There are multiple problems in your script
chrome.extension.onRequest is deprecated in favor of chrome.extension.onMessage
chrome.tabs.sendRequest is deprecated in favor of chrome.tabs.sendMessage
CSP will not allow inline scripting and <script> tag in html code.
window object of Content Script is different from normal page window object.
After applying multiple changes to code i got it working
manifest.json
Eliminated not applicable sections of manifest
{
"name": "Selected Text",
"version": "0.1",
"description": "Selected Text",
"browser_action": {
"default_title": "Selected Text",
"default_popup": "popup.html"
},
"permissions": [
"tabs",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["selection.js"],
"run_at": "document_start",
"all_frames": true
}
],
"manifest_version": 2
}
popup.html
Ensured popup.html adheres to CSP
<!DOCTYPE html>
<html>
<head>
<style>
body {
width: 300px;
}
textarea {
width: 250px;
height: 100px;
}
</style>
<script src="popup.js"></script>
</head>
<body>
<textarea id="text"></textarea>
<button id="submit">get text</button>
</body>
</html>
popup.js
Script to pick current tab and send message and update DOM.
function pasteSelection() {
//Select current tab to send message
chrome.tabs.query({
"active": true,
"currentWindow": true,
"status": "complete",
"windowType": "normal"
}, function (tabs) {
//It returns array so looping over tabs result
for (tab in tabs) {
//Send Message to a tab
chrome.tabs.sendMessage(tabs[tab].id, {
method: "getSelection"
});
}
});
}
//Adding a handler when message is recieved from content scripts
chrome.extension.onMessage.addListener(function (response, sender) {
//Set text to text area
var text = document.getElementById('text');
text.value = response.data;
});
// Bind On click event to pasteSelection() function
document.addEventListener("DOMContentLoaded", function () {
document.getElementById("submit").onclick = pasteSelection;
});
selection.js
Passes selected text to popup.html
//Add a handler to handle message sent from popup.html
chrome.extension.onMessage.addListener(function (request, sender) {
//Hanlde request based on method
if (request.method == "getSelection")
//Send selected text back to popup.html
chrome.extension.sendMessage({
data: document.getSelection().toString()
});
else chrome.extension.sendMessage({}); // snub them.
});
References
tabs.query()
tabs.sendMessage()
extension.onMessage()
extension.sendMessage()
CSP

Categories

Resources