diff options
-rw-r--r-- | src/bun.js/webcore/blob.zig | 3 | ||||
-rw-r--r-- | test/js/web/fetch/blob.test.ts | 29 |
2 files changed, 30 insertions, 2 deletions
diff --git a/src/bun.js/webcore/blob.zig b/src/bun.js/webcore/blob.zig index b0f1df935..1e0720ea6 100644 --- a/src/bun.js/webcore/blob.zig +++ b/src/bun.js/webcore/blob.zig @@ -3003,12 +3003,13 @@ pub const Blob = struct { } } + const offset = this.offset +| @as(SizeType, @intCast(relativeStart)); const len = @as(SizeType, @intCast(@max(relativeEnd -| relativeStart, 0))); // This copies over the is_all_ascii flag // which is okay because this will only be a <= slice var blob = this.dupe(); - blob.offset = @as(SizeType, @intCast(relativeStart)); + blob.offset = offset; blob.size = len; // infer the content type if it was not specified diff --git a/test/js/web/fetch/blob.test.ts b/test/js/web/fetch/blob.test.ts index ba44f8c1b..ea8d86a7a 100644 --- a/test/js/web/fetch/blob.test.ts +++ b/test/js/web/fetch/blob.test.ts @@ -1,6 +1,6 @@ import { test, expect } from "bun:test"; -test("Blob.slice", () => { +test("Blob.slice", async () => { const blob = new Blob(["Bun", "Foo"]); const b1 = blob.slice(0, 3, "Text/HTML"); expect(b1 instanceof Blob).toBeTruthy(); @@ -26,6 +26,33 @@ test("Blob.slice", () => { expect(blob.slice(null, "-123").size).toBe(6); expect(blob.slice(0, 10).size).toBe(blob.size); expect(blob.slice("text/plain;charset=utf-8").type).toBe("text/plain;charset=utf-8"); + + // test Blob.slice().slice(), issue#6252 + expect(await blob.slice(0, 4).slice(0, 3).text()).toBe("Bun"); + expect(await blob.slice(0, 4).slice(1, 3).text()).toBe("un"); + expect(await blob.slice(1, 4).slice(0, 3).text()).toBe("unF"); + expect(await blob.slice(1, 4).slice(1, 3).text()).toBe("nF"); + expect(await blob.slice(1, 4).slice(2, 3).text()).toBe("F"); + expect(await blob.slice(1, 4).slice(3, 3).text()).toBe(""); + expect(await blob.slice(1, 4).slice(4, 3).text()).toBe(""); + // test negative start + expect(await blob.slice(1, 4).slice(-1, 3).text()).toBe("F"); + expect(await blob.slice(1, 4).slice(-2, 3).text()).toBe("nF"); + expect(await blob.slice(1, 4).slice(-3, 3).text()).toBe("unF"); + expect(await blob.slice(1, 4).slice(-4, 3).text()).toBe("unF"); + expect(await blob.slice(1, 4).slice(-5, 3).text()).toBe("unF"); + expect(await blob.slice(-1, 4).slice(-1, 3).text()).toBe(""); + expect(await blob.slice(-2, 4).slice(-1, 3).text()).toBe(""); + expect(await blob.slice(-3, 4).slice(-1, 3).text()).toBe("F"); + expect(await blob.slice(-4, 4).slice(-1, 3).text()).toBe("F"); + expect(await blob.slice(-5, 4).slice(-1, 3).text()).toBe("F"); + expect(await blob.slice(-5, 4).slice(-2, 3).text()).toBe("nF"); + expect(await blob.slice(-5, 4).slice(-3, 3).text()).toBe("unF"); + expect(await blob.slice(-5, 4).slice(-4, 3).text()).toBe("unF"); + expect(await blob.slice(-4, 4).slice(-3, 3).text()).toBe("nF"); + expect(await blob.slice(-5, 4).slice(-4, 3).text()).toBe("unF"); + expect(await blob.slice(-3, 4).slice(-2, 3).text()).toBe("F"); + expect(await blob.slice(-blob.size, 4).slice(-blob.size, 3).text()).toBe("Bun"); }); test("new Blob", () => { |