我制作的Chrome扩展程序将充当类似于Chrome的密码管理器,但具有一些不同的功能。
当用户提交登录表单时,我的分机可以拦截提交并获取用户名和密码。现在,我想显示一个弹出窗口,询问用户是否要保存密码。
如果可以在存在的任何页面之上显示我自己的自定义HTML,那么它将在页面重新加载后消失。所以我应该将数据存储在会话变量中,每次加载页面时,检查它是否有什么东西?
我想避免打开另一个窗口,它看起来很草率。有没有更好的方法来获取表单数据并在提交后加载页面之后使用?
答案 0 :(得分:2)
那很棘手......
我自己不使用chrome扩展,但我确实写了类似的GreaseMonkey扩展。
首先,让我说这是一个坏主意......这里有一些非常重要的安全问题,但我会回答你是怎么回事。
第一步是告知页面加载的时间恰好跟随提交(而不是通过书签或链接打开或在新标签中打开)。
我知道这样做的唯一方法是链接到window.name
属性,该属性在页面加载之间持续存在。
说这是hacky会是真的。说它的脆弱将更加真实。它甚至可能会突然停止在某些浏览器下工作。
但是,这是我所知道的唯一方式。
所以..你的步骤是。
form.submit
并保存网址,用户名和密码。如果页面使用ajax或挂钩到form.submit
本身,则所有投注均已关闭。window.name
password
字段。window.name
中的旗帜是否存在 - 此页面是从登录名加载的。答案 1 :(得分:0)
这可以使用事件和内容脚本的组合来完成。
使用manifest.json注册内容脚本
"content_scripts": [ {
"js": [ "/util/jquery.js", "main.js"],
"matches": [ "http://*/*", "https://*/*"],
"run_at": "document_start",
}],
内容脚本侦听要提交的表单
$("form").submit(function(e) {
var $this = $(this);
console.log('submit');
var formData = findFormData($this); //function searches form for username/password
//Send message to background page with user/pass data
chrome.runtime.sendMessage({greeting:'form_submit', data:formData}, function(){ /*if needed */ });
});
使用清单创建后台脚本注册(使用persistent = false使后台脚本成为“事件”脚本)。我们还需要以下权限
"background": {
"scripts": ["/background/background.js"],
"persistent" : false
},
"permissions": [
"activeTab",
"storage",
"webNavigation"
]
最后,我们将消息监听器添加到后台页面
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
switch (request.greeting) {
case 'form_submit':
var data = request.data;
console.log('We Have Data!', request.data);
//We want to display the prompt when this page loads, so add listener
chrome.webNavigation.onCompleted.addListener( function askUser(details) {
//Create prompt here!
//remove the onCompleted listener so it doesn't appear when navigating again
chrome.webNavigation.onCompleted.removeListener(askUser);
});
sendResponse({farewell: "success"});
break;
}
});