javascript - WebExtensions API - 将模态注入网站
问题描述
I am using (fraction of) the accepted answer in: Inject iframe into page with restrictive content to inject <iframe>
to a webpage that is part of the content of a modal window. Currently I am able to access the external website displayed in the <iframe>
and pass my cookies to it just fine, but upon interacting with it (clicking on a submit button) my cookies are not sent with the onclick
event (which points to a JS function making AJAX request to the server). Therefor the server says that I am not logged in.
The question: How to pass the cookies with the AJAX? Is that even possible?
What I have tried: Editing the cookies SameSite
value to None
and the Secure
to true
for the website displayed in the <iframe>
allows the cookies to be passed. It is desirable however not instruct the user to modify browser settings or cookies.
manifest.json:
{
"manifest_version": 2,
"name": "Add button",
"description": "This extension will add some buttons to page.",
"version": "1.0",
"background": {
"scripts": ["background.js"]
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"activeTab",
"webNavigation",
"tabs",
"https://*.example.com/*",
"https://external-iframe-site.com/*"
],
"web_accessible_resources": [
"contentBackground.js",
"modal.js",
"iframe.html"
]
}
background.js
const filter = {
url: [
{
urlMatches: '(example.com\/in)'
}
]
}
chrome.webNavigation.onHistoryStateUpdated.addListener(
function(details)
{
chrome.tabs.executeScript(null,{file:"jquery-1.6.1.min.js"},
function()
{
chrome.tabs.insertCSS({file: "content.css"});
chrome.tabs.executeScript(null,{file:"modal.js"});
});
}, filter);
iframe.html
<iframe src="https://external-iframe-site.com/php/sync_user.php?action=Check&profileCode=someProfileCodeForTheExample"
></iframe>
modal.js
let a = document.createElement("a"); // Create Check with DOM
a.innerHTML = "Check";
a.id = "chkBtn";
a.target = "_blank";
let checkLink = "https://external-iframe-site.com/php/sync_user.php?action=Check&profileCode={profileCode}";
checkLink = checkLink.replace("{profileCode}", encodeURI(window.location.href));
a.href = checkLink;
$("div.target").prepend(a);
var modal = (function(){
var
method = {},
$overlay,
$modal,
$content,
$close;
// ... methods for closing/opening/etc. that you do not need to know ...
// Generate the HTML and add it to the document
$overlay = $('<div id="overlay"></div>');
$modal = $('<div id="modal"></div>');
$content = $('<div id="content"></div>');
$close = $('<a id="close" href="#">close</a>');
$modal.hide();
$overlay.hide();
$modal.append($content, $close);
$(document).ready(function(){
$('div.authentication-outlet').append($overlay, $modal);
});
return method;
}());
// Get iframe local url
var iframeOrigin = chrome.runtime.getURL('iframe.html');
// Wait until the DOM has loaded before querying the document
$(document).ready(function(){
$('#chkBtn').click(function(e){
//Opens the modal with "src" of the local iframe.html file
modal.open({content:
'<iframe src=' + '"' + iframeOrigin + '"'+' width="992" height="500"></iframe>'
});
e.preventDefault();
});
});
解决方案
推荐阅读
- python - 更改 Selenium webdriver 的用户代理客户端提示
- typescript - 在 Mocha 中测试 props.history
- java - 使用 JPA 和 Spring Boot 获取表记录时使用多列作为过滤器
- git-config - ~/.gitconfig:设置子命令选项
- python - 文本文件到列并存储在每个列的单独数组中
- location - FTK-经纬度无效,看不懂
- c# - Microsoft Graph API - 获取共享时出错
- windows - 具有差异列的两个 csv 文件之间的 Grep 差异
- ruby-on-rails - 如何仅显示未与 Rails 中的项目链接的用户
- reactjs - 在 Styled Comp 中传递的道具未渲染