From 9e7c781737a0c1de270c648c90642588b7c98681 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 2 May 2022 14:42:27 +0100 Subject: [PATCH 1/2] Add ArrayBuffer, JSTypedArray and Data conversion --- Sources/DOMKit/ECMAScript/ArrayBuffer.swift | 27 ++++++++++++++++++--- Tests/DOMKitTests/DOMKitTests.swift | 19 +++++++++++++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/Sources/DOMKit/ECMAScript/ArrayBuffer.swift b/Sources/DOMKit/ECMAScript/ArrayBuffer.swift index 195bbd54..9ecb04b4 100644 --- a/Sources/DOMKit/ECMAScript/ArrayBuffer.swift +++ b/Sources/DOMKit/ECMAScript/ArrayBuffer.swift @@ -2,8 +2,8 @@ // Created by Manuel Burghard. Licensed unter MIT. // -import JavaScriptKit import _CJavaScriptKit +import JavaScriptKit public typealias Int8Array = JSTypedArray public typealias Int16Array = JSTypedArray @@ -15,7 +15,6 @@ public typealias Float32Array = JSTypedArray public typealias Float64Array = JSTypedArray public class ArrayBuffer: JSBridgedClass { - public class var constructor: JSFunction { JSObject.global.ArrayBuffer.function! } public let jsObject: JSObject @@ -25,10 +24,32 @@ public class ArrayBuffer: JSBridgedClass { } public convenience init(length: Int) { - self.init(unsafelyWrapping: Self.constructor.new( length)) + self.init(unsafelyWrapping: Self.constructor.new(length)) } public static func isView(_ object: JSValueCompatible) -> Bool { JSObject.global.ArrayBuffer.object!.isView!(object).fromJSValue()! } } + +extension JSTypedArray { + convenience init(_ arrayBuffer: ArrayBuffer) { + self.init(unsafelyWrapping: Self.constructor.new(arrayBuffer)) + } + + var buffer: ArrayBuffer { + ArrayBuffer(unsafelyWrapping: jsObject.buffer.object!) + } +} + +#if canImport(Foundation) +import Foundation + +extension Data { + init(_ arrayBuffer: ArrayBuffer) { + self = JSTypedArray(arrayBuffer).withUnsafeBytes { + Data(buffer: $0) + } + } +} +#endif diff --git a/Tests/DOMKitTests/DOMKitTests.swift b/Tests/DOMKitTests/DOMKitTests.swift index 4015104f..10515a66 100644 --- a/Tests/DOMKitTests/DOMKitTests.swift +++ b/Tests/DOMKitTests/DOMKitTests.swift @@ -1,8 +1,10 @@ -import XCTest import DOMKit +import Foundation +import JavaScriptKit +import XCTest final class DOMKitTests: XCTestCase { - func testExample() { + func testQuerySelector() { let document = globalThis.document let button = document.createElement(localName: "button") button.textContent = "Hello, world!" @@ -11,4 +13,17 @@ final class DOMKitTests: XCTestCase { let queriedButton = document.querySelector(selectors: "body button") XCTAssertEqual(queriedButton?.textContent, "Hello, world!") } + + func testDataBuffer() { + let array: [UInt8] = [1, 2, 3, 4, 5] + let data = Data(array) + let typedArray = JSTypedArray(data) + + typedArray.withUnsafeBytes { + XCTAssertEqual($0.count, data.count) + for index in $0.indices { + XCTAssertEqual(array[index], $0[index]) + } + } + } } From fa18508d6335d0205b581b56c6ee680d6ac08f0a Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 2 May 2022 14:45:56 +0100 Subject: [PATCH 2/2] Add `testTypedArrayToData` test --- Sources/DOMKit/ECMAScript/ArrayBuffer.swift | 4 ++-- Tests/DOMKitTests/DOMKitTests.swift | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Sources/DOMKit/ECMAScript/ArrayBuffer.swift b/Sources/DOMKit/ECMAScript/ArrayBuffer.swift index 9ecb04b4..9b4e8a9d 100644 --- a/Sources/DOMKit/ECMAScript/ArrayBuffer.swift +++ b/Sources/DOMKit/ECMAScript/ArrayBuffer.swift @@ -32,7 +32,7 @@ public class ArrayBuffer: JSBridgedClass { } } -extension JSTypedArray { +public extension JSTypedArray { convenience init(_ arrayBuffer: ArrayBuffer) { self.init(unsafelyWrapping: Self.constructor.new(arrayBuffer)) } @@ -45,7 +45,7 @@ extension JSTypedArray { #if canImport(Foundation) import Foundation -extension Data { +public extension Data { init(_ arrayBuffer: ArrayBuffer) { self = JSTypedArray(arrayBuffer).withUnsafeBytes { Data(buffer: $0) diff --git a/Tests/DOMKitTests/DOMKitTests.swift b/Tests/DOMKitTests/DOMKitTests.swift index 10515a66..16cf7424 100644 --- a/Tests/DOMKitTests/DOMKitTests.swift +++ b/Tests/DOMKitTests/DOMKitTests.swift @@ -14,7 +14,7 @@ final class DOMKitTests: XCTestCase { XCTAssertEqual(queriedButton?.textContent, "Hello, world!") } - func testDataBuffer() { + func testDataToTypedArray() { let array: [UInt8] = [1, 2, 3, 4, 5] let data = Data(array) let typedArray = JSTypedArray(data) @@ -26,4 +26,18 @@ final class DOMKitTests: XCTestCase { } } } + + func testTypedArrayToData() { + let array: [UInt8] = [1, 2, 3, 4, 5] + let typedArray = JSTypedArray(array) + + let data = Data(typedArray.buffer) + + typedArray.withUnsafeBytes { + XCTAssertEqual($0.count, data.count) + for index in $0.indices { + XCTAssertEqual(array[index], $0[index]) + } + } + } }