Chrome extension doesnt work after switching for manifest v3 - javascript

I've struggle with this issue for a few hours and still don't know what I am missing.
I create player to play some videos. Extension added "Next" button, you click and it plays another video.
The list of which video it should play is host as symlink from local host - watch.ber.in.com/videos/list.js:
info_list = [
{"video":"first_video", "link":"https://watch.ber.in.com/player.html?channel=first_video", "info":"movie_tittle"},
"video":"second_video", "link":"https://watch.ber.in.com/player.html?channel=first_video", "info":"movie_tittle2"}
]
current_channel_index = info_list.findIndex(x => x.channel == player.channel)
document.getElementById('info-label').innerHTML = info_list[current_channel_index].info
document.getElementById('next-button').addEventListener('click',function () {window.location = info_list[current_channel_index+1].link})
document.getElementById('progress-label').innerHTML=current_channel_index+1 + '/2'
I have done some research how to update script from manifest v2 to manifest v3 and finally Chrome stopped showing errors, but also my "Next" button has stopped working and I can't really figure it out why.
This is my manifest.json file:
{
"manifest_version": 3,
"name": "video player",
"description": "lets watch some movies!",
"version": "2.2",
"permissions": [
"scripting",
"activeTab",
"contentSettings"
],
"content_scripts": [
{
"matches": [
"https://watch.ber.in.com/player.html*"
],
"run_at": "document_idle",
"js": [
"myscript.js"
]
}
],
"host_permissions":["<all_urls>"],
"web_accessible_resources": [
{
"matches": ["*://*/*", "http://*/*", "https://*/*"],
"resources": ["list.js"]
}
],
"content_security_policy": {
"extension_pages": "default-src 'self'"
}
}
and my myscript.js:
//Load verification list from server
var script=document.createElement("script");
script.src="https://watch.ber.in.com/videos/list.js";
document.body.appendChild(script);
//Create a progress label
var progress=document.createElement("label");
player_form = document.getElementById("player-form")
progress.id = "progress-label"
player_form.appendChild(progress);
//Change the label of change channel button
document.getElementsByTagName("input")[2].value="Change"
//Add info
var label=document.createElement("label");
player_status = document.getElementById("player-status")
label.id = "info-label"
player_status.appendChild(label);
//Move verification to the top of the page.
problemator = document.getElementById("problemator")
player_status.appendChild(problemator);
//Create next button
var button=document.createElement("button");
button.innerHTML= "Next";
button.className="button"
button.id="next-button"
problemator.appendChild(button);
//Change default status to "OK"
document.getElementsByTagName("select").status.value=200
Any idea what am I missing?

Related

Stuck# in selecting textarea in my chrome extension from DOM

Overflow Developes: I have search a lot about the textarea selection but have't found the proper solution.
Goal: I am going to build my own extension in which I want to perform some functionality. I have accessed the DOM. And further cannot able to access the only textarea.
Required: enter image description here I Want this type of working in my extension.
manifest.json
{
"manifest_version": 2,
"name": "DOM",
"version": "0.0",
"background": {
"persistent": false,
"scripts": [
"background.js"
]
},
"content_scripts": [
{
"matches": [
"*://*.stackoverflow.com/*"
],
"js": [
"content.js"
]
}
],
"browser_action": {
"default_title": "DOM",
"default_popup": "index.html"
},
"permissions": [
"activeTab",
"tabs",
"<all_urls>"
]}
index.html
<!DOCTYPE html>
<html>
<head>Fayzan</head>
<body> <button id="test">DOM!</button>
<script src="test.js"></script>
</body>
</html>
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);
}
});
background.js
var urlRegex = /^https?:\/\/(?:[^./?#]+\.)?stackoverflow\.com/;
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);
}
});
test.js
document.getElementById("test").addEventListener('click', () => {
alert("DOM POPUP");
function modifyDOM() {
console.log('Tab script:');
console.log(document.body);
return document.body.innerHTML;
}
chrome.tabs.executeScript({
code: '(' + modifyDOM + ')();'
},
(results) => {
console.log("fayzan bhatti");
console.log(results);
}
);
});

jQuery-ui dialog doesn't work

I've inherited a chrome extension that once you visit a page it spins through the DOM and adds a span which contains a list of 4 links when you mouse over the span the list displays the 4 links (anchors). I'd like when you click one of these 4 links if it could show a jQuery-ui dialog box with a button. The text of this box will be dynamic but I just need to get the dialog box showing on link click for now.
I'm not seeing any errors in my console but I'm also not seeing the dialog present itself. I do see the console.log being spit out from line 8 of main.js with the ruleDialog DIV showing.
Prior to me making adjustments these links worked normally (performed an API call) and they worked fine so I know the extension as a whole is functional (besides my dialog not showing).
I've done some looking around here on SO and I've found a few questions slightly related to my problem but have not had success with getting my particular case to work.
Here is a screenshot showing what it adds to the page:
manifest.json:
{
"manifest_version": 2,
"name": "My Extension",
"short_name": "ME",
"author": "caleywoods",
"description": "my extension",
"version": "0.0.11",
"content_scripts": [
{
"matches": [
//my pages
],
"js": [
"jquery-2.1.4.min.js",
"jquery-ui.min.js",
"main.js"
],
"css": [
"style.css",
"jquery-ui.min.css"
]
}
],
"web_accessible_resources": [
"images/*"
],
"options_ui": {
"page": "options.html",
"chrome_style": true
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"storage",
//my pages (same as "matches")
]
}
main.js:
function addOurSpan() {
var diaDiv = document.createElement('DIV');
diaDiv.id = "ruleDialog";
diaDiv.innerHTML = "Testing!";
diaDiv.style = "display: none;">
console.log(diaDiv);
$('.link .flat-list.buttons').each(function(i, e) {
// Skip elements we've already added the dropdown to
if ($(e).has('.my-class').length) { return; }
// Create selected option/trigger div
var selected = document.createElement('DIV');
selected.className = 'dropdown lightdrop my-class';
var selectedSpan = document.createElement('SPAN');
selectedSpan.className = "selected";
$(selectedSpan).text("OUR ADDED BUTTON");
selected.appendChild(selectedSpan);
// Create options div
var options = document.createElement('DIV');
options.className = 'drop-choices';
// The rule by button label and hover-text
var rules = {
'Rule 1': 'Unrelated Stuff',
'Rule 2': 'Miscellaneous Stuff',
'Rule 3': 'Repetitive Stuff',
'Rule 4': 'Scam Stuff',
};
for (var r in rules) {
var ruleLink = document.createElement('A');
$(ruleLink).text(r);
ruleLink.title = rules[r];
ruleLink.className = 'choice';
$(ruleLink).click(function(ev) {
ev.preventDefault();
// $("#ruleDialog").dialog({
// modal:true,
// buttons: {
// Accept: function() {
// $( this ).dialog( "close" );
// }
// }
// });
$("#ruleDialog").dialog();
});
}
var li = document.createElement('LI');
var spacer = document.createElement('DIV');
spacer.className = "spacer";
spacer.appendChild(selected);
spacer.appendChild(options);
li.appendChild(spacer);
e.appendChild(li);
});
}
$(document).ready(function() { addOurSpan(); });

Chrome Extension to Redirect to URL with Parameter

I'm attempting to create a Chrome extension which will add a parameter to the end of a URL if the URL matches a given pattern (*://*.mydomain.com/s/*). Below is the manifest file and background script I have, but I cannot get it working. What am I doing wrong?
manifest.json:
{
"manifest_version": 2,
"name": "Search Grid View",
"version": "0.1",
"description": "Changes MyDomain.com search to grid view by default",
"background": {
"scripts": ["background.js"]
},
"permissions": [
"tabs",
"webRequest",
"*://*.mydomain.com/s/*",
"webRequestBlocking"
]
}
background.js:
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
var currentUrl = tabs[0].url;
var newUrl = currentUrl + "&style=gridview"
return { redirectUrl: newUrl};
},
{
urls: [
'*://*.mydomain.com/s/*'
],
types: ['main_frame']
},
['blocking']);
Thanks in advance for any advice!
Use debugger - click your extension's background page on chrome://extensions page and switch to the Sources panel.
To obtain the url use onBeforeRequest's callback parameter
Check if the url is already modified.
chrome.webRequest.onBeforeRequest.addListener(
function(details) {
return {
redirectUrl: details.url +
(details.url.indexOf("?") == -1 ? "?" : "") +
(details.url.indexOf("&style=gridview") == -1 ? "&style=gridview" : "")
};
},
{urls: ['*://*.mydomain.com/s/*'], types: ['main_frame']},
['blocking']
);

Remove cache automatically from chrome when match page url

I'm trying to remove the cache when the user go to this url stackoverflow.com/?clear then reload and go to stackoverflow.com with a clean cache, I tried a many methods but I failed.
Here is my last attempt, It's not affect the cache at all!
Manifest Code
{
"name": "stackoverflow",
"version": "1.0",
"background": {
"scripts": ["jquery.js","background.js"],
"persistent": false
},
"page_action" :
{
"default_icon" : "icon.png",
"default_title" : "Remove"
},
"permissions" : [
"declarativeContent", "browsingData", "tabs"
],
"manifest_version": 2
}
background.js
chrome.runtime.onInstalled.addListener(function() {
// Replace all rules ...
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
// With a new rule ...
chrome.declarativeContent.onPageChanged.addRules([
{
// That fires when a page's URL contains a 'stackoverflow.com/?clea' ...
conditions: [
new chrome.declarativeContent.PageStateMatcher({
pageUrl: { urlContains: 'stackoverflow.com/?clear' },
})
],
// And shows the extension's page action.
actions: [ new chrome.declarativeContent.ShowPageAction() ]
}
]);
});
});
function clearMe(tab) {
var ms = (30 * 60) * 1000; // 30 minutes
var time = Date.now() - ms;
chrome.browsingData.removeCache({"since": time}, function() {
chrome.tabs.update({url: 'http://stackoverflow.com'});
});
}
//It will be perfect if user do not have to click
chrome.pageAction.onClicked.addListener(clearMe)
I need better alternative to remove cache without even the user click a button.
tabs api should be enough for this. Here's how you should do it. I've tested it and it's working fine.
Manifest Code
{
"name": "stackoverflow",
"version": "1.0",
"background": {
"scripts": ["background.js"],
"persistent": false
},
"permissions" : [
"tabs", "browsingData"
],
"manifest_version": 2
}
background.js
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
// if url is changed
if (changeInfo.url) {
var url = changeInfo.url;
if (url.indexOf("stackoverflow.com/?clear") != -1) {
alert("Clearing cache...");
clearMe(tab);
}
}
});
function clearMe(tab) {
var ms = (30 * 60) * 1000; // 30 minutes
var time = Date.now() - ms;
chrome.browsingData.removeCache({"since": time}, function() {
chrome.tabs.update(tab.id, { url: 'http://stackoverflow.com' });
});
}

How to get chrome extensions to perform function in background on page load?

I am making a chrome extension to sign into a wifi system, and currently have it set so that they must click on the extension to sign in. But instead I want it to just sign them in every 30 minutes, using background js I want it to check a cookie I saved if 30 minutes has passed and then sign in. But instead it only works when you first install it.
Here is my manifest.json:
{
"manifest_version": 2,
"name": "BCA Auto Login",
"description": "This extension automatically signs you into the BCA wifi",
"version": "1.0",
"permissions": [ "cookies", "http://*/*", "https://*/*" ],
"content_scripts": [{
"matches": ["http://*/*","https://*/*"],
"js": ["jquery.js","login.js"]
}],
"background": {
"scripts": ["jquery.js", "background.js"]
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
}
}
Here is my background.js:
$(document).ready(function(){
chrome.cookies.get({ url: 'urlofCookie.com', name: 'time' },
//the cookie is a time in minutes
function (cookie) {
if (cookie) {
var current = new Date();
if((current.getMinutes() - cookie) >= 30){
$.ajax({
type : 'POST',
url : 'https://signinURL',
data : {
username: 'username',
password: 'password',
},
success : workedFunction
});
}
}
else{
cookieNotFound();
}
});
});
You only call the function on page load, so no wonder it does not execute after that. If you want to perform an action periodically, you can use the chrome.alarms API and create an alarm to fire every 30 minutes (you don't even need the cookie unless you use it for other things as well).
E.g.:
var wifiAlarmName = "wifiSignIn";
chrome.alarms.create(wifiAlarmName, {
delayInMinutes: 0,
periodInMinutes: 30
});
chrome.alarms.onAlarm.addListener(function(alarm) {
if (alarm.name === wifiAlarmName) {
// Sign in
...
}
});

Categories