mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-28 22:53:28 +00:00
Merge pull request #1103 from lightpanda-io/text_decode_view
Text decode view
This commit is contained in:
2
.github/actions/install/action.yml
vendored
2
.github/actions/install/action.yml
vendored
@@ -17,7 +17,7 @@ inputs:
|
|||||||
zig-v8:
|
zig-v8:
|
||||||
description: 'zig v8 version to install'
|
description: 'zig v8 version to install'
|
||||||
required: false
|
required: false
|
||||||
default: 'v0.1.30'
|
default: 'v0.1.33'
|
||||||
v8:
|
v8:
|
||||||
description: 'v8 version to install'
|
description: 'v8 version to install'
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ ARG MINISIG=0.12
|
|||||||
ARG ZIG=0.15.1
|
ARG ZIG=0.15.1
|
||||||
ARG ZIG_MINISIG=RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U
|
ARG ZIG_MINISIG=RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U
|
||||||
ARG V8=14.0.365.4
|
ARG V8=14.0.365.4
|
||||||
ARG ZIG_V8=v0.1.30
|
ARG ZIG_V8=v0.1.33
|
||||||
ARG TARGETPLATFORM
|
ARG TARGETPLATFORM
|
||||||
|
|
||||||
RUN apt-get update -yq && \
|
RUN apt-get update -yq && \
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
.fingerprint = 0xda130f3af836cea0,
|
.fingerprint = 0xda130f3af836cea0,
|
||||||
.dependencies = .{
|
.dependencies = .{
|
||||||
.v8 = .{
|
.v8 = .{
|
||||||
.url = "https://github.com/lightpanda-io/zig-v8-fork/archive/c25223900587005c9cf13f25e56a7e0be26a533c.tar.gz",
|
.url = "https://github.com/lightpanda-io/zig-v8-fork/archive/7a1beb016efcb2bd66c0b46b5fc6bcd04fa72db8.tar.gz",
|
||||||
.hash = "v8-0.0.0-xddH6x_DAwBh0gSbFFv1fyiExhExXKzZpbmj5sFH4MRY",
|
.hash = "v8-0.0.0-xddH6_PFAwAqwLMWbF7S0rAZzRbN8zmf2GhLH_ThdMSR",
|
||||||
},
|
},
|
||||||
// .v8 = .{ .path = "../zig-v8-fork" }
|
//.v8 = .{ .path = "../zig-v8-fork" }
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const log = @import("../../log.zig");
|
const log = @import("../../log.zig");
|
||||||
|
|
||||||
|
const Env = @import("../env.zig").Env;
|
||||||
const Page = @import("../page.zig").Page;
|
const Page = @import("../page.zig").Page;
|
||||||
|
|
||||||
// https://encoding.spec.whatwg.org/#interface-textdecoder
|
// https://encoding.spec.whatwg.org/#interface-textdecoder
|
||||||
@@ -69,8 +70,8 @@ pub fn get_fatal(self: *const TextDecoder) bool {
|
|||||||
const DecodeOptions = struct {
|
const DecodeOptions = struct {
|
||||||
stream: bool = false,
|
stream: bool = false,
|
||||||
};
|
};
|
||||||
pub fn _decode(self: *TextDecoder, input_: ?[]const u8, opts_: ?DecodeOptions, page: *Page) ![]const u8 {
|
pub fn _decode(self: *TextDecoder, str_: ?[]const u8, opts_: ?DecodeOptions, page: *Page) ![]const u8 {
|
||||||
var str = input_ orelse return "";
|
var str = str_ orelse return "";
|
||||||
const opts: DecodeOptions = opts_ orelse .{};
|
const opts: DecodeOptions = opts_ orelse .{};
|
||||||
|
|
||||||
if (self.stream.items.len > 0) {
|
if (self.stream.items.len > 0) {
|
||||||
|
|||||||
@@ -1251,23 +1251,31 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
|
|||||||
fn jsValueToTypedArray(_: *JsContext, comptime T: type, js_value: v8.Value) !?[]T {
|
fn jsValueToTypedArray(_: *JsContext, comptime T: type, js_value: v8.Value) !?[]T {
|
||||||
var force_u8 = false;
|
var force_u8 = false;
|
||||||
var array_buffer: ?v8.ArrayBuffer = null;
|
var array_buffer: ?v8.ArrayBuffer = null;
|
||||||
|
var byte_len: usize = undefined;
|
||||||
|
var byte_offset: usize = undefined;
|
||||||
|
|
||||||
if (js_value.isTypedArray()) {
|
if (js_value.isTypedArray()) {
|
||||||
const buffer_view = js_value.castTo(v8.ArrayBufferView);
|
const buffer_view = js_value.castTo(v8.ArrayBufferView);
|
||||||
|
byte_len = buffer_view.getByteLength();
|
||||||
|
byte_offset = buffer_view.getByteOffset();
|
||||||
array_buffer = buffer_view.getBuffer();
|
array_buffer = buffer_view.getBuffer();
|
||||||
} else if (js_value.isArrayBufferView()) {
|
} else if (js_value.isArrayBufferView()) {
|
||||||
force_u8 = true;
|
force_u8 = true;
|
||||||
const buffer_view = js_value.castTo(v8.ArrayBufferView);
|
const buffer_view = js_value.castTo(v8.ArrayBufferView);
|
||||||
|
byte_len = buffer_view.getByteLength();
|
||||||
|
byte_offset = buffer_view.getByteOffset();
|
||||||
array_buffer = buffer_view.getBuffer();
|
array_buffer = buffer_view.getBuffer();
|
||||||
} else if (js_value.isArrayBuffer()) {
|
} else if (js_value.isArrayBuffer()) {
|
||||||
force_u8 = true;
|
force_u8 = true;
|
||||||
array_buffer = js_value.castTo(v8.ArrayBuffer);
|
array_buffer = js_value.castTo(v8.ArrayBuffer);
|
||||||
|
byte_len = array_buffer.?.getByteLength();
|
||||||
|
byte_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const buffer = array_buffer orelse return null;
|
const buffer = array_buffer orelse return null;
|
||||||
|
|
||||||
const backing_store = v8.BackingStore.sharedPtrGet(&buffer.getBackingStore());
|
const backing_store = v8.BackingStore.sharedPtrGet(&buffer.getBackingStore());
|
||||||
const data = backing_store.getData();
|
const data = backing_store.getData();
|
||||||
const byte_len = backing_store.getByteLength();
|
|
||||||
|
|
||||||
switch (T) {
|
switch (T) {
|
||||||
u8 => {
|
u8 => {
|
||||||
@@ -1275,56 +1283,56 @@ pub fn Env(comptime State: type, comptime WebApis: type) type {
|
|||||||
if (force_u8 or js_value.isUint8Array() or js_value.isUint8ClampedArray()) {
|
if (force_u8 or js_value.isUint8Array() or js_value.isUint8ClampedArray()) {
|
||||||
if (byte_len == 0) return &[_]u8{};
|
if (byte_len == 0) return &[_]u8{};
|
||||||
const arr_ptr = @as([*]u8, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]u8, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0..byte_len];
|
return arr_ptr[byte_offset .. byte_offset + byte_len];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
i8 => {
|
i8 => {
|
||||||
if (js_value.isInt8Array()) {
|
if (js_value.isInt8Array()) {
|
||||||
if (byte_len == 0) return &[_]i8{};
|
if (byte_len == 0) return &[_]i8{};
|
||||||
const arr_ptr = @as([*]i8, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]i8, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0..byte_len];
|
return arr_ptr[byte_offset .. byte_offset + byte_len];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
u16 => {
|
u16 => {
|
||||||
if (js_value.isUint16Array()) {
|
if (js_value.isUint16Array()) {
|
||||||
if (byte_len == 0) return &[_]u16{};
|
if (byte_len == 0) return &[_]u16{};
|
||||||
const arr_ptr = @as([*]u16, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]u16, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0 .. byte_len / 2];
|
return arr_ptr[byte_offset .. byte_offset + byte_len / 2];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
i16 => {
|
i16 => {
|
||||||
if (js_value.isInt16Array()) {
|
if (js_value.isInt16Array()) {
|
||||||
if (byte_len == 0) return &[_]i16{};
|
if (byte_len == 0) return &[_]i16{};
|
||||||
const arr_ptr = @as([*]i16, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]i16, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0 .. byte_len / 2];
|
return arr_ptr[byte_offset .. byte_offset + byte_len / 2];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
u32 => {
|
u32 => {
|
||||||
if (js_value.isUint32Array()) {
|
if (js_value.isUint32Array()) {
|
||||||
if (byte_len == 0) return &[_]u32{};
|
if (byte_len == 0) return &[_]u32{};
|
||||||
const arr_ptr = @as([*]u32, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]u32, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0 .. byte_len / 4];
|
return arr_ptr[byte_offset .. byte_offset + byte_len / 4];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
i32 => {
|
i32 => {
|
||||||
if (js_value.isInt32Array()) {
|
if (js_value.isInt32Array()) {
|
||||||
if (byte_len == 0) return &[_]i32{};
|
if (byte_len == 0) return &[_]i32{};
|
||||||
const arr_ptr = @as([*]i32, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]i32, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0 .. byte_len / 4];
|
return arr_ptr[byte_offset .. byte_offset + byte_len / 4];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
u64 => {
|
u64 => {
|
||||||
if (js_value.isBigUint64Array()) {
|
if (js_value.isBigUint64Array()) {
|
||||||
if (byte_len == 0) return &[_]u64{};
|
if (byte_len == 0) return &[_]u64{};
|
||||||
const arr_ptr = @as([*]u64, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]u64, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0 .. byte_len / 8];
|
return arr_ptr[byte_offset .. byte_offset + byte_len / 8];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
i64 => {
|
i64 => {
|
||||||
if (js_value.isBigInt64Array()) {
|
if (js_value.isBigInt64Array()) {
|
||||||
if (byte_len == 0) return &[_]i64{};
|
if (byte_len == 0) return &[_]i64{};
|
||||||
const arr_ptr = @as([*]i64, @ptrCast(@alignCast(data)));
|
const arr_ptr = @as([*]i64, @ptrCast(@alignCast(data)));
|
||||||
return arr_ptr[0 .. byte_len / 8];
|
return arr_ptr[byte_offset .. byte_offset + byte_len / 8];
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => {},
|
else => {},
|
||||||
|
|||||||
@@ -45,3 +45,16 @@
|
|||||||
testing.expectEqual('', d2.decode(new Uint8Array([226, 153]), { stream: true }));
|
testing.expectEqual('', d2.decode(new Uint8Array([226, 153]), { stream: true }));
|
||||||
testing.expectEqual('♥', d2.decode(new Uint8Array([165]), { stream: true }));
|
testing.expectEqual('♥', d2.decode(new Uint8Array([165]), { stream: true }));
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script id=slice>
|
||||||
|
const buf1 = new ArrayBuffer(7);
|
||||||
|
const arr1 = new Uint8Array(buf1)
|
||||||
|
arr1[0] = 80;
|
||||||
|
arr1[1] = 81;
|
||||||
|
arr1[2] = 82;
|
||||||
|
arr1[3] = 83;
|
||||||
|
arr1[4] = 84;
|
||||||
|
arr1[5] = 85;
|
||||||
|
arr1[6] = 86;
|
||||||
|
testing.expectEqual('RST', d3.decode(new Uint8Array(buf1, 2, 3)));
|
||||||
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user