Skip to content

Commit 0844dd0

Browse files
committed
re-enable datauris
1 parent 0d0dfd9 commit 0844dd0

File tree

4 files changed

+56
-80
lines changed

4 files changed

+56
-80
lines changed

src/browser/DataURI.zig

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
const std = @import("std");
2+
const Allocator = std.mem.Allocator;
3+
4+
// Parses data:[<media-type>][;base64],<data>
5+
pub fn parse(allocator: Allocator, src: []const u8) !?[]const u8 {
6+
if (!std.mem.startsWith(u8, src, "data:")) {
7+
return null;
8+
}
9+
10+
const uri = src[5..];
11+
const data_starts = std.mem.indexOfScalar(u8, uri, ',') orelse return null;
12+
13+
var data = uri[data_starts + 1 ..];
14+
15+
// Extract the encoding.
16+
const metadata = uri[0..data_starts];
17+
if (std.mem.endsWith(u8, metadata, ";base64")) {
18+
const decoder = std.base64.standard.Decoder;
19+
const decoded_size = try decoder.calcSizeForSlice(data);
20+
21+
const buffer = try allocator.alloc(u8, decoded_size);
22+
errdefer allocator.free(buffer);
23+
24+
try decoder.decode(buffer, data);
25+
data = buffer;
26+
}
27+
28+
return data;
29+
}
30+
31+
const testing = @import("../testing.zig");
32+
test "DataURI: parse valid" {
33+
try test_valid("data:text/javascript; charset=utf-8;base64,Zm9v", "foo");
34+
try test_valid("data:text/javascript; charset=utf-8;,foo", "foo");
35+
try test_valid("data:,foo", "foo");
36+
}
37+
38+
test "DataURI: parse invalid" {
39+
try test_cannot_parse("atad:,foo");
40+
try test_cannot_parse("data:foo");
41+
try test_cannot_parse("data:");
42+
}
43+
44+
fn test_valid(uri: []const u8, expected: []const u8) !void {
45+
defer testing.reset();
46+
const data_uri = try parse(testing.arena_allocator, uri) orelse return error.TestFailed;
47+
try testing.expectEqual(expected, data_uri);
48+
}
49+
50+
fn test_cannot_parse(uri: []const u8) !void {
51+
try testing.expectEqual(null, parse(undefined, uri));
52+
}

src/browser/ScriptManager.zig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const parser = @import("netsurf.zig");
2323

2424
const Env = @import("env.zig").Env;
2525
const Page = @import("page.zig").Page;
26+
const DataURI = @import("DataURI.zig");
2627
const Browser = @import("browser.zig").Browser;
2728
const HttpClient = @import("../http/Client.zig");
2829
const URL = @import("../url.zig").URL;
@@ -168,6 +169,9 @@ pub fn addFromElement(self: *ScriptManager, element: *parser.Element) !void {
168169
var source: Script.Source = undefined;
169170
var remote_url: ?[:0]const u8 = null;
170171
if (try parser.elementGetAttribute(element, "src")) |src| {
172+
if (try DataURI.parse(page.arena, src)) |data_uri| {
173+
source = .{ .@"inline" = data_uri };
174+
}
171175
remote_url = try URL.stitch(page.arena, src, page.url.raw, .{ .null_terminated = true });
172176
source = .{ .remote = .{} };
173177
} else {

src/browser/datauri.zig

Lines changed: 0 additions & 79 deletions
This file was deleted.

src/browser/page.zig

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ const Dump = @import("dump.zig");
2525
const State = @import("State.zig");
2626
const Env = @import("env.zig").Env;
2727
const Mime = @import("mime.zig").Mime;
28-
const DataURI = @import("datauri.zig").DataURI;
2928
const Session = @import("session.zig").Session;
3029
const Renderer = @import("renderer.zig").Renderer;
3130
const Window = @import("html/window.zig").Window;

0 commit comments

Comments
 (0)