Javascript 区分webRequest.onBeforeRequest原始页面与注入页面
我正在后台脚本中使用Javascript 区分webRequest.onBeforeRequest原始页面与注入页面,javascript,firefox-addon-webextensions,Javascript,Firefox Addon Webextensions,我正在后台脚本中使用webRequest.onBeforeRequest。然后,在注入到原始页面的内容(?)脚本中,我向页面发出请求的URL发出AJAX请求,我正在检测该URL,因此它自然开始循环,很快就会挂起浏览器 作为一种临时措施,我在AJAX调用中的URL末尾添加了另一个参数(&me=1),并制作了一个URL过滤器,该过滤器的结尾与原始URL的结尾类似,但这似乎不是最好的方法,因为原始URL在将来可能会更改 有什么更好的方法?例如,我查看了侦听器返回的requestDetails。但是,由
webRequest.onBeforeRequest
。然后,在注入到原始页面的内容(?)脚本中,我向页面发出请求的URL发出AJAX请求,我正在检测该URL,因此它自然开始循环,很快就会挂起浏览器
作为一种临时措施,我在AJAX调用中的URL末尾添加了另一个参数(&me=1),并制作了一个URL
过滤器,该过滤器的结尾与原始URL的结尾类似,但这似乎不是最好的方法,因为原始URL在将来可能会更改
有什么更好的方法?例如,我查看了侦听器返回的requestDetails
。但是,由于脚本是在原始页面中注入的,所以我找不到任何区别。或者,我可以制作一个URL
过滤器,它只接受不以“&me=1”结尾的URL
(我不能(不会)使用flag变量,因为页面会不断地动态变化,这似乎不是最好的方法,即使我可以让它以某种方式工作(我没有)
当然,或者,我可以只使用原始请求提供的数据,但我无法使用将执行此操作的事件/对象,但可能不知何故我错过了它,因为我几乎是web扩展的初学者
编辑:
manifest.json
{
"manifest_version": 2,
"name": "testtube",
"version": "1.0",
"permissions": [
"webRequest",
"https://*/*",
"activeTab"
],
"web_accessible_resources": [
"https://www.youtube.com/player_api",
"index.html",
"js/jquery-3.2.1.min.js",
"js/player.js",
"js/jquery-ui.min.js",
"css/jquery-ui.css", "css/style.css"
],
"content_scripts": [
{
"matches": [ "https://www.youtube.com/watch*"],
"css": [ "css/jquery.dataTables.min.css", "css/jquery-ui.css", "css/style.css" ],
"js": [ "js/jquery-3.2.1.min.js","js/jquery-ui.min.js", "js/main.js" ]
}
]
,"background": {
"scripts": ["js/background.js" ]
}
}
background.js
"use strict";
var lastRequestId = 0;
function logURL(requestDetails) {
console.log("requestDetails: ", requestDetails);
//this is actually a solution as per my answer below
if ((lastRequestId != requestDetails.requestId) && (requestDetails.url.indexOf("&me=1") == -1))
{
browser.tabs.sendMessage(requestDetails.tabId, { ccurl: requestDetails.url }).then(response => {
console.log("Message from the content script:");
console.log(response.response);
}).catch(onError);;
}
}
browser.webRequest.onBeforeRequest.removeListener(logURL);
browser.webRequest.onBeforeRequest.addListener(
logURL,
{ urls: ["*://www.youtube.com/api/somepattern*"] }
);
function onError(error) {
console.error(`Error: ${error}`);
}
main.js
"use strict";
var jq;
jq = document.createElement('script');
jq.onload = function () { };
jq.src = chrome.extension.getURL("/js/jquery-3.2.1.min.js");
document.querySelector('head').appendChild(jq);
jq = document.createElement('script');
jq.onload = function () { };
jq.src = chrome.extension.getURL("/js/jquery-ui.min.js");
document.querySelector('head').appendChild(jq);
/*... some other scripts... */
var s = document.createElement('script');
s.src = chrome.extension.getURL('/js/player.js');
s.onload = function () {
this.remove();
};
(document.head || document.documentElement).appendChild(s);
var _url = "";
function UURL(request, sender, sendResponse) {
_url = request.url;
var loadR = " loadRequest('" + _url.toString() + "'); ";
var script = document.createElement('script');
script.textContent = loadR;
document.querySelector('head').appendChild(script);
return Promise.resolve({ response: "Hi from content script" });
}
$(function () {
console.log("jquery loaded");
browser.runtime.onMessage.removeListener(UURL)
browser.runtime.onMessage.addListener(UURL);
/* irrelevant code here... */
});
player.js
var loadRequest = function loadRequest(_url) {
_url = _url + "&me=1";
$.ajax({
type: "get",
url: _url,
dataType: "xml",
success: function (data) {
/* irrelevant code here */
好的,“临时措施”的改进版本是,在侦听器中,我针对请求的url添加了另一个条件
(requestDetails.url.indexOf("&me=1") == -1)
然后打我的ajax电话。。。在请求的
url
过滤器中,我只在最后留下asterix(*)。通过这种方式,不管原始url是否在最后更改,都可以捕获额外的请求。。如果没有其他人回复,这就足够了。好的,“临时措施”的改进版本是,在侦听器中,我针对请求的url添加了另一个条件
(requestDetails.url.indexOf("&me=1") == -1)
然后打我的ajax电话。。。在请求的url
过滤器中,我只在最后留下asterix(*)。通过这种方式,不管原始url是否在最后更改,都可以捕获额外的请求。。如果没有其他人回复,就足够了。如果您试图区分主页加载和XMLHttpRequest
1
有多种方法可以区分不同类型的请求。如果没有实际的代码来尝试,我们必须猜测您实际在做什么
正常页面加载的示例如下所示:
webRequest.onBeforeRequest->arg[0]={“frameId”:0,“方法”:“GET”,“parentFrameId”:-1,“requestId”:“260870”,“tabId”:411,“时间戳”:150040123979.044,“类型”:“main_frame”,“url”:http://www.example.com/"}
-----------------------------------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^
如您所见,该对象包含一个类型
属性,该属性是一个。对于主框架的HTML加载,它将包含“main_frame”
(详细信息
对象也将包含“frameId”:0,“parentFrameId:-1
)
对于AJAX请求,type
属性的值应该是xmlhttprequest
。然而,您所说的“ajax请求”有可能是指除请求之外的其他内容。在这种情况下,type
属性可能有一些其他值,但它不应该是“main\u frame”
一,。我对问题的原版理解与okkko的意图不同。如目前所述,这不包括他们感兴趣的案例。但是,它可能对阅读此问题/答案的其他人有一定的价值,因此我将其保留。如果您试图区分主页加载和
XMLHttpRequest
1
有多种方法可以区分不同类型的请求。如果没有实际的代码来尝试,我们必须猜测您实际在做什么
正常页面加载的示例如下所示:
webRequest.onBeforeRequest->arg[0]={“frameId”:0,“方法”:“GET”,“parentFrameId”:-1,“requestId”:“260870”,“tabId”:411,“时间戳”:150040123979.044,“类型”:“main_frame”,“url”:http://www.example.com/"}
-----------------------------------------------------------------------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^
如您所见,该对象包含一个类型
属性,该属性是一个。对于主框架的HTML加载,它将包含“main_frame”
(详细信息
对象也将包含“frameId”:0,“parentFrameId:-1
)
对于AJAX请求,type
属性的值应该是xmlhttprequest
。然而,您所说的“ajax请求”有可能是指除请求之外的其他内容。在这种情况下,type
属性可能有一些其他值,但它不应该是“main\u frame”
一,。我对问题的原版理解与okkko的意图不同。如目前所述,这不包括他们感兴趣的案例。但是,它可能对阅读此问题/答案的其他人有一些价值,因此我将其保留。请将问题放在主题上:包括重复问题的问题。对于Chrome扩展或Firefox WebExtensions,这几乎总是意味着包括manifest.json和一些背景、内容和/或弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。请参阅:,和。我通常会尝试提供一些代码,但在本cas中