Skip to content
Snippets Groups Projects
Commit 000aa638 authored by didierfred's avatar didierfred
Browse files

init

parents
No related branches found
No related tags found
No related merge requests found
# user-agent-rewriter
## What it does
This extension uses the webRequest API to rewrite the browser's User Agent header, but only when visiting pages under "https://httpbin.org", for example: https://httpbin.org/user-agent
It adds a browser action. The browser action has a popup that lets the user choose one of three browsers: Firefox 41, Chrome 41, and IE 11. When the user chooses a browser, the extension then rewrites the User Agent header so the real browser identifies itself as the chosen browser on the site https://httpbin.org/.
## What it shows
* how to intercept and modify HTTP requests
* how to write a browser action with a popup
* how to give the popup style and behavior using CSS and JS
* how to send a message from a popup script to a background script
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
var targetPage = "https://httpbin.org/*";
var modifyTable = [];
var started = "off";
// If no table stored , use and store a default one
if (!localStorage.getItem('modifyTable'))
{
modifyTable = [
["add","test_header_name","test_header_value","on"],
];
localStorage.setItem("modifyTable",JSON.stringify(modifyTable));
}
else
{
modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
}
// If no target page stored , use a default one
if (!localStorage.getItem('targetPage')) localStorage.setItem('targetPage',targetPage);
else targetPage = localStorage.getItem('targetPage');
// If no started value stored , use a default one
if (!localStorage.getItem('started')) localStorage.setItem('started',started);
else started = localStorage.getItem('started');
if (started=="on") addListener();
// listen for change in configuration or start/stop
browser.runtime.onMessage.addListener(notify);
/**
Rewrite the header
**/
function rewriteHeader(e) {
window.console.info("IT Works");
for (var to_modify of modifyTable)
{
if (to_modify[3]=="on")
{
if (to_modify[0]=="add")
{
console.log("add = " + to_modify[1]);
var new_header = {"name" :to_modify[1],"value":to_modify[2]};
e.requestHeaders.push(new_header);
}
else if (to_modify[0]=="modify")
{
for (var header of e.requestHeaders)
{
if (header.name.toLowerCase() == to_modify[1].toLowerCase()) header.value = to_modify[2];
}
}
else if (to_modify[0]=="delete")
{
var index = -1;
for (var i=0; i < e.requestHeaders.length; i++)
{
if (e.requestHeaders[i].name.toLowerCase() == to_modify[1].toLowerCase()) index=i;
}
if (index!=-1)
{
e.requestHeaders.splice(index,1);
}
}
}
}
return {requestHeaders: e.requestHeaders};
}
function notify(message)
{
if (message=="reload")
{
modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
targetPage = localStorage.getItem('targetPage');
if (started=="on")
{
browser.webRequest.onBeforeSendHeaders.removeListener(rewriteHeader);
addListener();
}
}
else if (message=="off")
{
browser.webRequest.onBeforeSendHeaders.removeListener(rewriteHeader);
started="off";
}
else if (message=="on")
{
addListener();
started="on";
}
}
/*
Add rewriteHeader as a listener to onBeforeSendHeaders,
only for the target page.
Make it "blocking" so we can modify the headers.
*/
function addListener()
{
browser.webRequest.onBeforeSendHeaders.addListener(rewriteHeader,
{urls: [targetPage]},
["blocking", "requestHeaders"]);
}
The "person-32.png" "person-48.png" icons are taken from the Ionicons iconset (http://ionicons.com/), and are used here under the MIT license: http://opensource.org/licenses/MIT.
icons/person-32.png

393 B

icons/person-48.png

573 B

icons/start_temp.png

68.9 KiB

{
"description": "Modify header nouvelle version ",
"manifest_version": 2,
"name": "modify-header-2",
"version": "0.1",
"homepage_url": "https://a_defenirnir",
"icons": {
"48": "icons/person-48.png"
},
"permissions": [
"activeTab","storage","webRequest", "webRequestBlocking", "https://httpbin.org/*"
],
"background": {
"scripts": ["background.js"]
},
"browser_action": {
"default_icon": "icons/person-32.png",
"default_title": "Modify a header",
"default_popup": "popup/config.html"
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<table>
<tr>
<td width="530">
<h1> SIMPLE MODIFY HEADER </h1>
Url Pattern : <input id="targetPage" type="text" value=""></input>
</td>
<td width="200">
<img id="start_img" src="img/start.png" align="right" valign="center"> </img>
</td>
</tr>
</table>
<br>
<br>
<table id="config_tab" id="config">
<tr>
<td> Action </td>
<td> Header Name </td>
<td> Header Value </td>
<td> Status </td>
</tr>
</table>
<center>
<br>
<input type="button" id="add_button" value="ADD NEW LINE" ></input>
<input type="button" id="save_button" value="SAVE"></input>
</center>
<script type="text/javascript" src="config.js"> </script>
</body>
</html>
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
var line_number = 1;
var started = "off";
window.onload = function() {
var configTable = JSON.parse(localStorage.getItem("modifyTable"));
for (var to_add of configTable) appendLine(to_add[0],to_add[1],to_add[2],to_add[3]);
document.getElementById('save_button').addEventListener('click',function (e) {save_data();});
document.getElementById('add_button').addEventListener('click',function (e) {appendLine("add","-","-","off");});
document.getElementById('start_img').addEventListener('click',function (e) {start_modify();});
document.getElementById('targetPage').value=localStorage.getItem("targetPage");
started = localStorage.getItem("started");
if (started=="on") document.getElementById("start_img").src = "img/stop.png";
} ;
function appendLine(action,header_name,header_value,status) {
var html = "<td><select id=\"select_action" + line_number + "\" disable=false><option value=\"add\">add</option><option value=\"modify\">modify</option><option value=\"delete\">delete</option></select></td>";
html = html + "<td><input id=\"header_name"+ line_number +"\" value=\"" + header_name + "\"></input></td>";
html = html + "<td><input id=\"header_value"+ line_number +"\" value=\"" + header_value + "\"></input></td>";
html = html + "<td><select id=\"select_status" + line_number + "\"><option value=\"on\"> ON </option><option value=\"off\">OFF</option></select></td>";
html = html + "<td><input type=\"button\" value=\"DELETE\" id=\"delete_button" + line_number + "\"></input> </td>";
var newTR = document.createElement("tr");
newTR.id="line" + line_number;
newTR.innerHTML = html;
document.getElementById("config_tab").appendChild(newTR);
document.getElementById("select_action"+line_number).value = action;
document.getElementById("select_status"+line_number).value = status;
var line_number_to_delete = line_number;
document.getElementById('delete_button'+line_number).addEventListener('click',function (e) {delete_line(line_number_to_delete)});
line_number++;
}
function save_data ()
{
var tr_elements = document.querySelectorAll("#config_tab tr");
var to_save = [];
for (i=1;i<tr_elements.length;i++) // ignore line 1 which is the table header
{
var line_to_save = [];
line_to_save.push(tr_elements[i].childNodes[0].childNodes[0].value); // select_action
line_to_save.push(tr_elements[i].childNodes[1].childNodes[0].value); // header_name
line_to_save.push(tr_elements[i].childNodes[2].childNodes[0].value); // header_value
line_to_save.push(tr_elements[i].childNodes[3].childNodes[0].value); // status
to_save.push(line_to_save);
}
localStorage.setItem("modifyTable",JSON.stringify(to_save));
localStorage.setItem("targetPage",document.getElementById('targetPage').value);
browser.runtime.sendMessage("reload");
}
function delete_line(line_number_to_delete)
{
if (line_number_to_delete != line_number)
{
for (i=line_number_to_delete;i<line_number-1;i++)
{
var j = i+1;
console.log("i=" + i + ",j=" + j);
document.getElementById("select_action"+i).value = document.getElementById("select_action"+j).value;
document.getElementById("header_name"+i).value = document.getElementById("header_name"+j).value;
document.getElementById("header_value"+i).value = document.getElementById("header_value"+j).value;
document.getElementById("select_status"+i).value = document.getElementById("select_status"+j).value;
}
}
var Node_to_delete = document.getElementById("line"+(line_number-1));
Node_to_delete.parentNode.removeChild(Node_to_delete);
line_number--;
}
function start_modify()
{
if (started=="off")
{
localStorage.setItem("started","on");
browser.runtime.sendMessage("on");
started = "on";
document.getElementById("start_img").src = "img/stop.png";
}
else
{
localStorage.setItem("started","off");
browser.runtime.sendMessage("off");
started = "off";
document.getElementById("start_img").src = "img/start.png";
}
}
popup/img/start.png

2.85 KiB

popup/img/stop.png

3.73 KiB

popup/img/stop_big.png

17.3 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment