implemented feture and tests (#35309)

Signed-off-by: Domenico Rizzo <domenico.rizzo@gmail.com>
This commit is contained in:
Domenico Rizzo 2025-02-10 21:29:05 +01:00 committed by GitHub
parent 5e0af44edb
commit bea7a969f4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 112 additions and 3 deletions

View file

@ -13,7 +13,10 @@ use js::jsapi::{JSAutoRealm, JSObject};
use js::jsval::UndefinedValue; use js::jsval::UndefinedValue;
use js::rust::{CustomAutoRooterGuard, HandleObject}; use js::rust::{CustomAutoRooterGuard, HandleObject};
use js::typedarray::{ArrayBuffer, ArrayBufferView, CreateWith}; use js::typedarray::{ArrayBuffer, ArrayBufferView, CreateWith};
use net_traits::request::{Referrer, RequestBuilder, RequestMode}; use net_traits::request::{
CacheMode, CredentialsMode, RedirectMode, Referrer, RequestBuilder, RequestMode,
ServiceWorkersMode,
};
use net_traits::{ use net_traits::{
CoreResourceMsg, FetchChannels, MessageData, WebSocketDomAction, WebSocketNetworkEvent, CoreResourceMsg, FetchChannels, MessageData, WebSocketDomAction, WebSocketNetworkEvent,
}; };
@ -258,7 +261,11 @@ impl WebSocketMethods<crate::DomTypeHolder> for WebSocket {
let request = RequestBuilder::new(global.webview_id(), url_record, Referrer::NoReferrer) let request = RequestBuilder::new(global.webview_id(), url_record, Referrer::NoReferrer)
.origin(global.origin().immutable().clone()) .origin(global.origin().immutable().clone())
.insecure_requests_policy(global.insecure_requests_policy()) .insecure_requests_policy(global.insecure_requests_policy())
.mode(RequestMode::WebSocket { protocols }); .mode(RequestMode::WebSocket { protocols })
.service_workers_mode(ServiceWorkersMode::None)
.credentials_mode(CredentialsMode::Include)
.cache_mode(CacheMode::NoCache)
.redirect_mode(RedirectMode::Error);
let channels = FetchChannels::WebSocket { let channels = FetchChannels::WebSocket {
event_sender: resource_event_sender, event_sender: resource_event_sender,

View file

@ -434,6 +434,19 @@ impl RequestBuilder {
self self
} }
pub fn service_workers_mode(
mut self,
service_workers_mode: ServiceWorkersMode,
) -> RequestBuilder {
self.service_workers_mode = service_workers_mode;
self
}
pub fn cache_mode(mut self, cache_mode: CacheMode) -> RequestBuilder {
self.cache_mode = cache_mode;
self
}
pub fn build(self) -> Request { pub fn build(self) -> Request {
let mut request = Request::new( let mut request = Request::new(
self.id, self.id,

View file

@ -511925,7 +511925,7 @@
[] []
], ],
"constants.sub.js": [ "constants.sub.js": [
"fd3c3b84b96a0a2537ac65dc4f626c4be03d9077", "78601ce877a4663443f6dbc16408e62d09492a8d",
[] []
], ],
"cookies": { "cookies": {
@ -512104,6 +512104,14 @@
} }
} }
}, },
"opening-handshake": {
"resources": {
"redirect_response.py": [
"d605586040596d0a5c44f3b1055df987427ae50a",
[]
]
}
},
"resources": { "resources": {
"websockets-test-helpers.sub.js": [ "websockets-test-helpers.sub.js": [
"2680670cc691b14c25721d2dd474a2a4c15bac3f", "2680670cc691b14c25721d2dd474a2a4c15bac3f",
@ -878398,6 +878406,13 @@
} }
] ]
], ],
"cross-origin-cookie-set.html": [
"f5ccbd1a3341ffd3928f08a85b320951ad6da616",
[
null,
{}
]
],
"third-party-cookie-accepted.https.html": [ "third-party-cookie-accepted.https.html": [
"208d297016fffca84a22d8b8b06b3c6dc64f088d", "208d297016fffca84a22d8b8b06b3c6dc64f088d",
[ [
@ -879845,6 +879860,13 @@
"timeout": "long" "timeout": "long"
} }
] ]
],
"received-301-code.html": [
"41ca295d833fb77c40dbafa45dead5e638cbbfdd",
[
null,
{}
]
] ]
}, },
"referrer.any.js": [ "referrer.any.js": [

View file

@ -15,6 +15,7 @@ if (url_has_flag('h2')) {
} }
const SCHEME_DOMAIN_PORT = __SCHEME + '://' + __SERVER__NAME + ':' + __PORT; const SCHEME_DOMAIN_PORT = __SCHEME + '://' + __SERVER__NAME + ':' + __PORT;
const SCHEME_CROSSDOMAIN_PORT = __SCHEME + '://' + '{{hosts[alt][www]}}' + ':' + __PORT;
function url_has_variant(variant) { function url_has_variant(variant) {
const params = new URLSearchParams(location.search); const params = new URLSearchParams(location.search);

View file

@ -0,0 +1,40 @@
<!DOCTYPE html>
<title>Include credentials in cross-origin websocket requests</title>
<meta name=author title="Domenico Rizzo" href="mailto:domenico.rizzo@gmail.com">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src="/websockets/constants.sub.js"></script>
<h1>WebSocket - Set Cross-origin cookie</h1>
<div id=log></div>
<script>
var resp_test = async_test('Cookie should be set')
resp_test.step(function() {
var ws = new WebSocket(SCHEME_CROSSDOMAIN_PORT + "/set-cookie?cookie_test");
ws.onerror = resp_test.step_func_done(function () {
assert_unreached("ws no error");
});
ws.onclose = resp_test.step_func_done(function () {
assert_unreached("'close' should not fire before 'open'.");
});
ws.onopen = resp_test.step_func(function (e) {
ws.onclose = null;
ws.close();
var ws2 = new WebSocket(SCHEME_CROSSDOMAIN_PORT + "/echo-cookie");
ws2.onerror = resp_test.step_func_done(function () {
assert_unreached("ws2 no error");
});
ws2.onclose = resp_test.step_func_done(function () {
assert_unreached("'close' should not fire before 'open'.");
});
ws2.onmessage = resp_test.step_func_done(function (e) {
ws2.onclose = null;
ws2.close();
assert_true(/ws_test_cookie_test=test/.test(e.data));
});
});
})
</script>

View file

@ -0,0 +1,23 @@
<!doctype html>
<title>WebSockets: 301 Code Failed</title>
<meta name=author title="Domenico Rizzo" href="mailto:domenico.rizzo@gmail.com">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../constants.sub.js"></script>
<div id="log"></div>
<script>
async_test(function(t) {
t.step(function() {
const ws = new WebSocket(new URL("resources/redirect_response.py", location.href));
ws.onopen = t.step_func(function() {
assert_unreached("onopen");
});
ws.onerror = t.step_func(function() {
assert_true(true)
t.done()
});
});
}, 'Websockets - Received 301 code');
</script>

View file

@ -0,0 +1,3 @@
def main(request, response):
headers = [('Location', '/echo')]
return (301, "moved"), headers, ''