feat(libSceNKWebKit): implement WebCore::ResourceResponseBase field getters

This commit is contained in:
simnJS committed 2026-11-02 21:16:34 +01:00
1 parent 096c45570f
commit 0e86bb5863
8 files changed
+199 -48

No files matched your search

-32
View File
@@ -39276,10 +39276,6 @@ int APS5_VABI _ZNK7WebCore20RenderBoxModelObject18inlineContinuationEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase11httpVersionEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isAttachmentEv() {
NotImplemented_nid_no_patch(__func__);
}
@@ -39296,34 +39292,14 @@ int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusCodeEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusTextEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase15httpHeaderFieldENS_14HTTPHeaderNameE() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase16textEncodingNameEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase17suggestedFilenameEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase23hasCacheValidatorFieldsEv() {
NotImplemented_nid_no_patch(__func__);
}
@@ -39348,10 +39324,6 @@ int APS5_VABI _ZNK7WebCore20ResourceResponseBase34cacheControlContainsMustRevali
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase3urlEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase6sourceEv() {
NotImplemented_nid_no_patch(__func__);
}
@@ -39364,10 +39336,6 @@ int APS5_VABI _ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv() {
NotImplemented_nid_no_patch(__func__);
}
int APS5_VABI _ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE() {
NotImplemented_nid_no_patch(__func__);
}
@@ -6822,29 +6822,21 @@ int APS5_VABI _ZNK7WebCore20LowPowerModeNotifier21isLowPowerModeEnabledEv();
int APS5_VABI _ZNK7WebCore20PasteboardCustomData18createSharedBufferEv();
int APS5_VABI _ZNK7WebCore20PasteboardWriterData7isEmptyEv();
int APS5_VABI _ZNK7WebCore20RenderBoxModelObject18inlineContinuationEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase11httpVersionEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isAttachmentEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase12isSuccessfulEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase13isRedirectionEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusCodeEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusTextEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase15httpHeaderFieldENS_14HTTPHeaderNameE();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase16textEncodingNameEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase17suggestedFilenameEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase23hasCacheValidatorFieldsEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase24isAttachmentWithFilenameEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoCacheEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoStoreEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase29cacheControlContainsImmutableEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase34cacheControlContainsMustRevalidateEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase3urlEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase6sourceEv();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase8isHTTP09Ev();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE();
int APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv();
int APS5_VABI _ZNK7WebCore20ScrollingCoordinator25scrollableContainerNodeIDERKNS_12RenderObjectE();
int APS5_VABI _ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE();
int APS5_VABI _ZNK7WebCore21BackForwardController12forwardCountEv();
@@ -0,0 +1,17 @@
#pragma once
#include "SceTypes.hpp"
#include "prx/libSceNKWebKit/src/ResourceResponseAbi.hpp"
extern "C" {
const NKWebKit::WtfAbi::URL& APS5_VABI _ZNK7WebCore20ResourceResponseBase3urlEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
long long APS5_VABI _ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase16textEncodingNameEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusTextEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase11httpVersionEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
const NKWebKit::WebCoreAbi::ResponseHeaderStorage& APS5_VABI _ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
bool APS5_VABI _ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(const NKWebKit::WebCoreAbi::ResourceResponseBase* self);
}
@@ -4,6 +4,7 @@
#include "prx/libSceNKWebKit/include/Api.hpp"
#include "prx/libSceNKWebKit/include/InventoryExports.hpp"
#include "prx/libSceNKWebKit/include/JscExports.hpp"
#include "prx/libSceNKWebKit/include/ResourceResponseExports.hpp"
#include "prx/libSceNKWebKit/include/WebCoreExports.hpp"
#include "prx/libSceNKWebKit/include/WebKitConfigExports.hpp"
#include "prx/libSceNKWebKit/include/WebKitValueExports.hpp"
@@ -0,0 +1,54 @@
#include "prx/libSceNKWebKit/include/ResourceResponseExports.hpp"
#include "prx/libSceNKWebKit/include/WtfExports.hpp"
#include <stdexcept>
namespace {
using NKWebKit::WebCoreAbi::ResourceResponseBase;
const ResourceResponseBase& Checked(const ResourceResponseBase* self) {
if (!self) throw std::invalid_argument("null WebCore::ResourceResponseBase");
return *self;
}
}
extern "C" {
const NKWebKit::WtfAbi::URL& APS5_VABI _ZNK7WebCore20ResourceResponseBase3urlEv(const ResourceResponseBase* self) {
return Checked(self).url;
}
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase8mimeTypeEv(const ResourceResponseBase* self) {
return Checked(self).mimeType;
}
long long APS5_VABI _ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv(const ResourceResponseBase* self) {
return Checked(self).expectedContentLength;
}
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase16textEncodingNameEv(const ResourceResponseBase* self) {
return Checked(self).textEncodingName;
}
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase14httpStatusTextEv(const ResourceResponseBase* self) {
return Checked(self).httpStatusText;
}
const NKWebKit::WebCoreAbi::StringSlot& APS5_VABI _ZNK7WebCore20ResourceResponseBase11httpVersionEv(const ResourceResponseBase* self) {
return Checked(self).httpVersion;
}
const NKWebKit::WebCoreAbi::ResponseHeaderStorage& APS5_VABI _ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv(const ResourceResponseBase* self) {
return Checked(self).httpHeaderFields;
}
bool APS5_VABI _ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(const ResourceResponseBase* self) {
const auto& url = Checked(self).url;
if (!url.impl || !(url.bits & 1)) return false;
NKWebKit::WtfAbi::StringView view{url.impl->data, url.impl->length, !!(url.impl->hashAndFlags & 4)};
return _ZN3WTF22protocolIsInHTTPFamilyENS_10StringViewE(view);
}
}
@@ -0,0 +1,37 @@
#pragma once
#include "prx/libSceNKWebKit/src/WtfStringAbi.hpp"
#include <cstddef>
namespace NKWebKit::WebCoreAbi {
struct StringSlot {
WtfAbi::StringImpl* impl;
};
struct ResponseHeaderStorage {
alignas(8) unsigned char storage[128];
};
struct ResourceResponseBase {
WtfAbi::URL url;
StringSlot mimeType;
long long expectedContentLength;
StringSlot textEncodingName;
StringSlot httpStatusText;
StringSlot httpVersion;
ResponseHeaderStorage httpHeaderFields;
};
static_assert(sizeof(StringSlot) == 8);
static_assert(sizeof(ResponseHeaderStorage) == 128);
static_assert(offsetof(ResourceResponseBase, url) == 0);
static_assert(offsetof(ResourceResponseBase, mimeType) == 40);
static_assert(offsetof(ResourceResponseBase, expectedContentLength) == 48);
static_assert(offsetof(ResourceResponseBase, textEncodingName) == 56);
static_assert(offsetof(ResourceResponseBase, httpStatusText) == 64);
static_assert(offsetof(ResourceResponseBase, httpVersion) == 72);
static_assert(offsetof(ResourceResponseBase, httpHeaderFields) == 80);
}
@@ -0,0 +1,89 @@
#include "prx/libc/include/general/VabiMacros.hpp"
#include "prx/libSceNKWebKit/libSceNKWebKit.hpp"
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stdexcept>
using NKWebKit::WebCoreAbi::ResourceResponseBase;
using NKWebKit::WtfAbi::StringImpl;
static void Check(bool value, int line) {
if (!value) {
std::fprintf(stderr, "ResourceResponseBase check failed at line %d\n", line);
std::abort();
}
}
#define Require(value) Check((value), __LINE__)
static StringImpl Make(const char* text) {
return StringImpl{2, static_cast<unsigned>(std::strlen(text)), text, 4};
}
static void TestFields() {
auto urlText = Make("http://a/");
auto mime = Make("text/html");
auto encoding = Make("utf-8");
auto status = Make("OK");
auto version = Make("HTTP/1.1");
ResourceResponseBase response{};
response.url.impl = &urlText;
response.url.bits = 1 | (4 << 6);
response.mimeType.impl = &mime;
response.expectedContentLength = 1234567890123LL;
response.textEncodingName.impl = &encoding;
response.httpStatusText.impl = &status;
response.httpVersion.impl = &version;
response.httpHeaderFields.storage[3] = 9;
Require(&_ZNK7WebCore20ResourceResponseBase3urlEv(&response) == &response.url);
Require(&_ZNK7WebCore20ResourceResponseBase8mimeTypeEv(&response) == &response.mimeType);
Require(_ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv(&response) == 1234567890123LL);
Require(&_ZNK7WebCore20ResourceResponseBase16textEncodingNameEv(&response) == &response.textEncodingName);
Require(&_ZNK7WebCore20ResourceResponseBase14httpStatusTextEv(&response) == &response.httpStatusText);
Require(&_ZNK7WebCore20ResourceResponseBase11httpVersionEv(&response) == &response.httpVersion);
Require(&_ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv(&response) == &response.httpHeaderFields);
Require(_ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv(&response).storage[3] == 9);
Require(urlText.refCount == 2 && mime.refCount == 2);
response.expectedContentLength = -1;
Require(_ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv(&response) == -1);
}
static void TestHTTPFamily() {
auto http = Make("http://a/");
auto https = Make("HTTPS://a/");
auto file = Make("file:///a");
auto ftp = Make("ftp://a/");
ResourceResponseBase response{};
Require(!_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(&response));
response.url.impl = &http;
response.url.bits = 1 | (4 << 6);
Require(_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(&response));
response.url.impl = &https;
Require(_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(&response));
response.url.impl = &file;
Require(!_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(&response));
response.url.impl = &ftp;
Require(!_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(&response));
response.url.impl = &http;
response.url.bits = 0;
Require(!_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv(&response));
}
static void TestNull() {
bool thrown = false;
try {
_ZNK7WebCore20ResourceResponseBase3urlEv(nullptr);
} catch (const std::invalid_argument&) {
thrown = true;
}
Require(thrown);
}
int main() {
TestFields();
TestHTTPFamily();
TestNull();
return 0;
}
+1 -8
View File
@@ -18,6 +18,7 @@ Inventory prose retains historical counts; use the [generated progress report](h
- [Dictionary key order](../../../core/libs/prx/libSceNKWebKit/src/Dictionary.cpp) (libSceNKWebKit) - `WKDictionaryCopyKeys` returns keys sorted by UTF-16 code unit, not in the `WTF::HashMap` iteration order of [WKDictionary.cpp](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebKit/Shared/API/c/WKDictionary.cpp).
- [Out-of-line colors](../../../core/libs/prx/libSceNKWebKit/src/WebCoreColor.cpp) (libSceNKWebKit) - `WebCore::Color` operations on an out-of-line value (extended color spaces in [Color.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebCore/platform/graphics/Color.h)) throw; only inline 8-bit sRGBA values are handled.
- [WTF host services](../../../core/libs/prx/libSceNKWebKit/src/WtfSystem.cpp) (libSceNKWebKit) - `fastMalloc`, `bmalloc` and Gigacage allocations come from the host allocator, and `numberOfProcessorCores`, `ramSize`, the clocks and random values come from the host, not the console; they throw when the host cannot answer. `WTFCrash` and failed assertions abort the process.
- [WebCore::ResourceResponseBase](../../../core/libs/prx/libSceNKWebKit/src/ResourceResponse.cpp) (libSceNKWebKit) - the object layout in [ResourceResponseAbi.hpp](../../../core/libs/prx/libSceNKWebKit/src/ResourceResponseAbi.hpp) comes from [ResourceResponseBase.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebCore/platform/network/ResourceResponseBase.h) and is not checked against the PS5 module: `URL` at 0, four `AtomString` and the 64-bit expected length up to offset 80, then a 128-byte `HTTPHeaderMap` (6 inline `CommonHeadersVector` slots as in [HTTPHeaderMap.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebCore/platform/network/HTTPHeaderMap.h)). Only these fields are modelled because `std::optional<CertificateInfo>` follows the `Box<NetworkLoadMetrics>` and the size of the PS5 `CertificateInfo` is unknown, so the offsets of `m_httpStatusCode`, `m_isNull`, `m_initLevel`, `m_type`, `m_source` and the flags are not established. The getters (`url`, `mimeType`, `expectedContentLength`, `textEncodingName`, `httpStatusText`, `httpVersion`, `httpHeaderFields`, `isInHTTPFamily`) skip `lazyInit` because the curl [ResourceResponse.h](https://github.com/neonmodder123/PS5-WebKit-11.x/blob/80f77e94c63ee7202eec3d4b5b1a021dd89011ba/Source/WebCore/platform/network/curl/ResourceResponse.h) has no `platformLazyInit`; the PS5 `ResourceResponse` is not known to match. `isInHTTPFamily` reads the valid bit of `URL::bits` and the scheme text, not the cached `m_protocolIsInHTTPFamily` bit, whose position is unknown. The 30 other exports (`ResourceResponseBase` constructors, `setURL`, `setType`, `setExpectedContentLength`, `setHTTPStatusCode`, `httpStatusCode`, `source`, `isSuccessful`, `isRedirection`, `isHTTP09`, `isAttachment*`, `suggestedFilename`, `sanitize*`, `syntheticRedirectResponse`, `cacheControlContains*`, `hasCacheValidatorFields`, `lazyInit`, `httpHeaderField*`, `addHTTPHeaderField*`, `setHTTPHeaderField*`) still throw `NotImplemented_nid_no_patch`: they write `m_isNull`, read fields after `CertificateInfo`, or need `HTTPHeaderMap`, `CertificateInfo`, `Vector` or `ResourceResponse` layouts.
### Known export names; ABI prototypes unverified
@@ -6731,29 +6732,21 @@ Inventory prose retains historical counts; use the [generated progress report](h
| `_ZNK7WebCore20PasteboardCustomData18createSharedBufferEv` | `oNgcYv7sg2E` |
| `_ZNK7WebCore20PasteboardWriterData7isEmptyEv` | `pCjXnlN6R4c` |
| `_ZNK7WebCore20RenderBoxModelObject18inlineContinuationEv` | `nV9al8rbOKg` |
| `_ZNK7WebCore20ResourceResponseBase11httpVersionEv` | `qJpr45shtzs` |
| `_ZNK7WebCore20ResourceResponseBase12isAttachmentEv` | `C+morSMfP84` |
| `_ZNK7WebCore20ResourceResponseBase12isSuccessfulEv` | `3a6B43jFjX8` |
| `_ZNK7WebCore20ResourceResponseBase13isRedirectionEv` | `BrSesfxNNvs` |
| `_ZNK7WebCore20ResourceResponseBase14httpStatusCodeEv` | `bFhYDNofRSE` |
| `_ZNK7WebCore20ResourceResponseBase14httpStatusTextEv` | `MYd7F5R6ryw` |
| `_ZNK7WebCore20ResourceResponseBase14isInHTTPFamilyEv` | `wW+Pyy9LiGA` |
| `_ZNK7WebCore20ResourceResponseBase15httpHeaderFieldENS_14HTTPHeaderNameE` | `JkEYUFSjoXw` |
| `_ZNK7WebCore20ResourceResponseBase16httpHeaderFieldsEv` | `cots5mYtZpo` |
| `_ZNK7WebCore20ResourceResponseBase16textEncodingNameEv` | `wTRdXzKM3u4` |
| `_ZNK7WebCore20ResourceResponseBase17suggestedFilenameEv` | `fBVtigUQ-qk` |
| `_ZNK7WebCore20ResourceResponseBase21expectedContentLengthEv` | `i4zxQPHkqJs` |
| `_ZNK7WebCore20ResourceResponseBase23hasCacheValidatorFieldsEv` | `qAv1-ceZ9iQ` |
| `_ZNK7WebCore20ResourceResponseBase24isAttachmentWithFilenameEv` | `ClZ8vxvE28U` |
| `_ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoCacheEv` | `bTMmuXgrk-4` |
| `_ZNK7WebCore20ResourceResponseBase27cacheControlContainsNoStoreEv` | `CchgKVep+h8` |
| `_ZNK7WebCore20ResourceResponseBase29cacheControlContainsImmutableEv` | `OKrc5AyAqtM` |
| `_ZNK7WebCore20ResourceResponseBase34cacheControlContainsMustRevalidateEv` | `8956F1voabk` |
| `_ZNK7WebCore20ResourceResponseBase3urlEv` | `VljXeIAPJoA` |
| `_ZNK7WebCore20ResourceResponseBase6sourceEv` | `Nc4OHQvmIOM` |
| `_ZNK7WebCore20ResourceResponseBase8isHTTP09Ev` | `JjPx6bo9fbs` |
| `_ZNK7WebCore20ResourceResponseBase8lazyInitENS0_9InitLevelE` | `o+TiqWzvS8s` |
| `_ZNK7WebCore20ResourceResponseBase8mimeTypeEv` | `HDR9zkTEoJ4` |
| `_ZNK7WebCore20ScrollingCoordinator36coordinatesScrollingForOverflowLayerERKNS_11RenderLayerE` | `1nxJkpm8wLA` |
| `_ZNK7WebCore21BackForwardController12forwardCountEv` | `wmkk8v-vEI0` |
| `_ZNK7WebCore21BackForwardController18canGoBackOrForwardEi` | `No2407W5Jes` |