I'm building a chrome extension and I want to add a content to the div element in the compose window of Gmail web page.
By using the inspect tool in chrome, I got the class of the div, prepend the content but it is not showing.
Manifest.json
{
"manifest_version": 2,
"name": "Gmail Extension",
"description": "Personalised extension for gmail",
"version": "1.0",
"icons": {
"128": "icon128.png",
"48": "icon48.png",
"16": "icon16.png"
},
"content_scripts":[
{
"matches": ["https://mail.google.com/*"],
"js": ["content.js", "jquery-3.3.1.min.js"]
}
],
"permissions": [
"tabs",
"https://mail.google.com/*"
]
}
Content.js
$('div#:ug.J-J5-Ji btx').prepend('<p>Test added</p>');
Image of the compose window, the div highlighted
The text element isn't showing
Thanks
Here's what I did to add a checkbox to the Compose window:
// listen for the event that is fired when the document has finished loading
document.addEventListener('DOMContentLoaded', addUpdateButton, true);
addUpdateButton();
function addUpdateButton() {
var optionsArea = document.getElementsByClassName("aoD az6");
if (optionsArea && optionsArea.length > 0) {
var ecsLabel = document.createElement('label');
ecsLabel.setAttribute('name','ecsslabel');
ecsLabel.innerHTML = "Send as ECS: ";
ecsLabel.setAttribute('id','ecsLabel');
optionsArea[0].appendChild(ecsLabel);
var ecs = document.createElement('input');
ecs.setAttribute('type','checkbox');
ecs.setAttribute('name','ecsbox');
chrome.storage.sync.get("ecs_mode",
function(val) {
ecs.checked = val["ecs_mode"];
});
ecs.setAttribute('id','ecsOption');
optionsArea[0].appendChild(ecs);
}
}
and here's the result (actually, I added several checkboxes, but omitted the code for clarity):
Related
Basically I am trying to create an Auto Visitor Extension for Chrome to open a website's URL after some specific time. When I open the popup everything works fine but when the popup is close nothing works. I am trying to find out a method to run that Auto Visitor Extension even when the popup is close I have read multiple questions regarding this phenomena on Stack Overflow but none of them clarifies what I am looking for.
Here is my manifest file:
manifest.json
{
"manifest_version": 2,
"name": "Auto Visitor",
"description": "This extension will visit multiple pages you saved in extension",
"version": "1.0",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"background": {
"scripts": [
"background.js"
],
"persistent": false
},
"permissions": [
"activeTab",
"storage",
"tabs",
"http://*/",
"https://*/"
]
}
The background file that i want to run even when popup is close :
background.js
// this will work only when you denie the background script in manifest
chrome.runtime.onInstalled.addListener(function(details) {
var initTime = 5;
chrome.storage.local.set({"avtime": initTime}, function() {});
});
reloadMainTab();
function reloadMainTab() {
chrome.storage.local.get('avurl', function (result) {
var urlsToLoad = result.avurl;
console.log(urlsToLoad);
if(urlsToLoad==undefined){
// do nothing
}else{
var urlsArr = urlsToLoad.split(",");
chrome.storage.local.get('avtime', function (result) {
var thisTime = result.avtime;
/*
setting it to -1 because it gets incremented by 1
when it goes into getSelected method
*/
var index=-1;
setInterval(function(){
if(index < urlsArr.length-1){
chrome.tabs.getSelected(function (tab) {
// console.log('index in get selected'+index)
chrome.tabs.update(tab.id,{url: urlsArr[index]});
});
index++;
}else{
index=-1;
}
}, thisTime+"000");
});
}
});
}
any help would be really appreciated
I am trying to create a chrome extension where if user selects the item in any web page and hit Ctrl+n then that highlighted text spelling should be altered. How do i do it? I have tried using background event page functionality where DOMContentLoaded is used so I can use the listener where there is two task, one is to find the highlighted text and another is listen for the event like Ctrl+n and do the work of reversing the spelling of that highlighted text. However, when I select the text, that selected text is not displayed in console either.
I have tried the following way
{
"manifest_version": 2,
"name": "RevText",
"description": "Reverse the spelling of higlighted text",
"version": "1.0",
"browser_action": {
"default_icon": "icon.png",
"default_popup": "html/popup.html",
"default_title": "click me"
},
"permissions": [
"activeTab",
"storage"
],
"options_page": "html/options.html",
"background": {
"scripts": ["js/eventPage.js"],
"persistent": false
}
}
function init() {
textToHyperLink();
}
function textToHyperLink(event) {
console.log(event);
var text = "";
if (window.getSelection) { // when selecting the text, the highlighted/selected text is not shown in console
text = window.getSelection().toString();
// show the popup with the name of highlighted text
console.log(text);
alert(text);
} else if (document.selection) {
text = document.selection.createRange().text;
}
return text;
}
if(document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded',init);
} else {
init();
}
UPDATE
Tried content_scripts as
{
"background": {
"scripts": ["js/eventPage.js"],
"persistent": false
},
"content_scripts": [
{
"matches" : ["http://*/*", "https://*/*"],
"js" : ["js/content.js"]
}
]
}
}
function init(event) {
console.log('event', event);
alert('event');
}
document.addEventListener('keydown',init);
This way, the console does not log anything neither alert box is opened when I click on the text and hit random keys.
I am writing my First Chrome Plugin and I just want to get some text present on the current webpage and show it as a alert when i click the Extension. Lets say I am using any any webpage on www.google.com after some Search query, Google shows something like "About 1,21,00,00,000 results (0.39 seconds) " . I want to show this Text as an alert when i execute my plugin. This is what i am doing.
here is the manifest.json that i am using
{
"manifest_version": 2,
"name": "Getting started example",
"description": "This extension shows a Google Image search result for the current page",
"version": "1.0",
"background": {
"persistent": false,
"scripts": ["background.js"]
},
"content_scripts": [{
"matches": ["*://*.google.com/*"],
"js": ["content.js"]
}],
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab"
]
}
Here is my popup.js
document.addEventListener('DOMContentLoaded', function() {
document.getElementById("checkPage").addEventListener("click", handler);
});`
function handler() {
var a = document.getElementById("resultStats");
alert(a.innerText); // or alert(a.innerHTML);
}
Here is my content.js
// Listen for messages
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
// If the received message has the expected format...
if (msg.text === 'report_back') {
// Call the specified callback, passing
// the web-page's DOM content as argument
sendResponse(document.all[0].outerHTML);
}
});
Here is my background.js
var urlRegex = /^https?:\/\/(?:[^./?#]+\.)?google\.com/;
// A function to use as callback
function doStuffWithDom(domContent) {
console.log('I received the following DOM content:\n' + domContent);
}
// When the browser-action button is clicked...
chrome.browserAction.onClicked.addListener(function (tab) {
// ...check the URL of the active tab against our pattern and...
if (urlRegex.test(tab.url)) {
// ...if it matches, send a message specifying a callback too
chrome.tabs.sendMessage(tab.id, {text: 'report_back'}, doStuffWithDom);
}
});
1) run content scrip after document ready ** check "run_at"
"content_scripts": [{
"run_at": "document_idle",
"matches"["*://*.google.com/*"],
"js": ["content.js"]
}],
2) on click of extension make another js to run( popup js). The popup js has access to the ( open page document)
// A function to use as callback
function doStuffWithDom() {
//console.log('I received the following DOM content:\n' + domContent);
//get tabID when browser action clicked # tabId = tab.id
chrome.tabs.executeScript(tabId, {file: "js/popup.js"});
}
3) In popup JS simple you can set alert
var a = document.getElementById("resultStats");
alert(a.innerText); // or alert(a.innerHTML);
Just remove "default_popup" part in manifest.json, as you have listened to chrome.browserAction.onClicked event in background page. They can't live at the same time.
I am trying to fire a notification whenever I double click on a word/select it. Found several examples online but I still cannot get my example working:
Manifest:
{
"name": "hh",
"description": "hh!",
"manifest_version": 2,
"version": "0.0.0.1",
"content_scripts": [
{
"matches": [ "http://*/*", "https://*/*" ],
"js": [ "background.js" ],
"all_frames": true,
"run_at": "document_end"
}
],
"permissions": ["storage", "notifications"],
"icons": { "128": "neoprice.png" }
}
background.js
var listener = function(evt) {
var selection = window.getSelection();
if (selection.rangeCount > 0) {
displayPrice();
var range = selection.getRangeAt(0);
var text = range.cloneContents().textContent;
console.log(text);
}
};
document.addEventListener('dblclick', listener);
function displayPrice(){
chrome.notifications.create(getNotificationId(), {
title: "message.data.name",
iconUrl: 'hh.png',
type: 'basic',
message: "message.data.prompt"
}, function() {});
}
// Returns a new notification ID used in the notification.
function getNotificationId() {
var id = Math.floor(Math.random() * 9007199254740992) + 1;
return id.toString();
}
I was earlier adding the following but I saw people weren't using it, so I removed it
"app": {
"background": {
"scripts": ["background.js", "assets/jquery.min.js"]
}
},
What I am trying to achieve: Whenever they go to ANY page on selecting a word, it fires the function. Later, I wish to use this for a specific page. :)
Tried: How to keep the eventlistener real time for chrome extensions?
Chrome extension double click on a word
https://github.com/max99x/inline-search-chrome-ext
Both don't really work as I want them too. :(
Solution
It seems you are confused with background page and content script. Your background.js is a content script in fact, though its name is "background". While chrome.notifications api can be only called in background page, trying commenting displayPrice function will make your code work.
Next step
Take a look at above tutorials, wdblclick event triggers, use Message Passing to communicate with background page and call chrome.notications api in background page.
What's more
The following code is used in chrome apps rather than chrome extension.
"app": {
"background": {
"scripts": ["background.js", "assets/jquery.min.js"]
}
},
I made an Extension for Firefox that random check all radio buttons & checkboxes on a website. Now I will make it for Chrome.
JS (inject.js):
function randomFromTo(from, to){
return Math.floor(Math.random() * (to - from + 1) + from);
}
function autoFill () {
for (i = 0; i < document.forms.length ;i++) {
for (j = 0; j < document.forms[i].length ;j++) {
if (document.forms[i].elements[j].type == "radio") {
start = j;
lastName = document.forms[i].elements[j].name;
while (j < document.forms[i].length - 1 && lastName == document.forms[i].elements[j+1].name) {
j++;
}
rand = randomFromTo(start, j);
document.forms[i].elements[rand].checked = true;
}
if (document.forms[i].elements[j].type == "checkbox") {
start = j;
lastName = document.forms[i].elements[j].name;
while (j < document.forms[i].length - 1 && lastName == document.forms[i].elements[j+1].name) {
j++;
}
rand = randomFromTo(start, j);
document.forms[i].elements[rand].checked = true;
}
}
}
}
autoFill();
So I read a lot about inject.js and Content Scripts so I tried both. And made it like this.
{
"name": "Auto Check Radio \u0026 Checkbox",
"version": "0.0.1",
"manifest_version": 2,
"description": "",
"homepage_url": "",
"icons": {
"16": "icons/icon16.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
},
"default_locale": "en",
"background": {
"page": "src/bg/background.html",
"persistent": true
},
"browser_action": {
"default_icon": "icons/icon16.png",
"default_title": "Autocheck",
"default_popup": "src/browser_action/browser_action.html"
},
"permissions": [
"tabs",
"notifications",
"http://*/",
"http://*/*",
"https://*/*"
],
"content_scripts": [{
"matches": ["https://*/*", "http://*/*"],
"js": ["src/inject/inject.js"],
"run_at": "document_end"
}],
"web_accessible_resources": ["src/inject/inject.js"],
"js": ["src/inject/inject.js"]
}
]
}
But I've got no idea how I can run the code. On Firefox it is much easier.
I don't need any background.html or browser_action.html
I only want to run the script - in the current tab - by clicking the icon.
Chould anyone give me a tip where i place my script?
Please read the Overview document first. Especially the Architecture part.
Any code that interacts with the page DOM must be in a Content Script. You've already put the code in src/inject.js.
Now, you don't need any UI to pop up when you click the button, so drop the "default_popup" item from the manifest and its HTML.
You also don't want your code to randomly execute when a tab loads. That's what "content_scripts" section in the manifest is about, so simply delete it.
Finally, you don't need a background HTML file. They have been replaced by autogenerated pages that are built from a list of scripts. So:
"background": {
"scripts": ["src/bg/background.js"]
},
"browser_action": {
"default_icon": "icons/icon16.png",
"default_title": "Autocheck"
},
Now, the only job of the background script is to register a handler for the button click. This is done through browserAction API:
// src/bg/background.js
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(tab.id, {file: "src/inject/inject.js"});
});
That's it, at this point it should work.
Now, to trim down the fat.
You don't need a persistent background page, since all it does is keeping simple event listeners that don't save any kind of state information. You can safely add "persistent": false to the manifest.
Your permissions are a massive overkill. There's a handy activeTab permission that gives you access to the current page if your code is invoked by, say, browser action button press.
In fact, that is the only permission your code needs. It will take care of executeScript call.
"permissions" : ["activeTab"],