Skip to content

Commit 08d4406

Browse files
authoredFeb 24, 2025··
feat: ada 3.1.1 including URLPattern support (#268)
1 parent d4f3b68 commit 08d4406

File tree

9 files changed

+9380
-3629
lines changed

9 files changed

+9380
-3629
lines changed
 

‎NativeScript/ada/ada.cpp

+3,517-1,775
Large diffs are not rendered by default.

‎NativeScript/ada/ada.h

+5,015-1,847
Large diffs are not rendered by default.

‎NativeScript/runtime/ModuleBinding.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ namespace tns {
6060
V(worker) \
6161
V(timers) \
6262
V(url) \
63-
V(urlsearchparams)
63+
V(urlsearchparams) \
64+
V(urlpattern)
6465

6566
enum {
6667
NM_F_BUILTIN = 1 << 0, // Unused.

‎NativeScript/runtime/Runtime.mm

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "ModuleBinding.hpp"
2626
#include "URLImpl.h"
2727
#include "URLSearchParamsImpl.h"
28+
#include "URLPatternImpl.h"
2829

2930
#define STRINGIZE(x) #x
3031
#define STRINGIZE_VALUE_OF(x) STRINGIZE(x)

‎NativeScript/runtime/URLPatternImpl.cpp

+689
Large diffs are not rendered by default.

‎NativeScript/runtime/URLPatternImpl.h

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
//
2+
// Created by Osei Fortune on 30/01/2025.
3+
//
4+
#pragma once
5+
6+
#include "Common.h"
7+
#include "Helpers.h"
8+
#include "ada/ada.h"
9+
using namespace ada;
10+
namespace tns {
11+
12+
class v8_regex_provider {
13+
public:
14+
using regex_type = v8::Global<v8::RegExp>;
15+
16+
static std::optional<regex_type> create_instance(std::string_view pattern,
17+
bool ignore_case);
18+
19+
static std::optional<std::vector<std::optional<std::string>>> regex_search(
20+
std::string_view input, const regex_type& pattern);
21+
22+
static bool regex_match(std::string_view input, const regex_type& pattern);
23+
};
24+
25+
class URLPatternImpl {
26+
public:
27+
URLPatternImpl(url_pattern<v8_regex_provider> pattern);
28+
29+
static void Init(v8::Isolate* isolate,
30+
v8::Local<v8::ObjectTemplate> globalTemplate);
31+
32+
url_pattern<v8_regex_provider>* GetPattern();
33+
34+
static URLPatternImpl* GetPointer(v8::Local<v8::Object> object);
35+
36+
static v8::Local<v8::FunctionTemplate> GetCtor(v8::Isolate* isolate);
37+
38+
static void Ctor(const v8::FunctionCallbackInfo<v8::Value>& args);
39+
40+
static void GetHash(v8::Local<v8::Name> name,
41+
const v8::PropertyCallbackInfo<v8::Value>& info);
42+
43+
static void GetHostName(v8::Local<v8::Name> name,
44+
const v8::PropertyCallbackInfo<v8::Value>& info);
45+
46+
static void GetPassword(v8::Local<v8::Name> name,
47+
const v8::PropertyCallbackInfo<v8::Value>& info);
48+
49+
static void GetPathName(v8::Local<v8::Name> name,
50+
const v8::PropertyCallbackInfo<v8::Value>& info);
51+
52+
static void GetPort(v8::Local<v8::Name> name,
53+
const v8::PropertyCallbackInfo<v8::Value>& info);
54+
55+
static void GetProtocol(v8::Local<v8::Name> name,
56+
const v8::PropertyCallbackInfo<v8::Value>& info);
57+
58+
static void GetSearch(v8::Local<v8::Name> name,
59+
const v8::PropertyCallbackInfo<v8::Value>& info);
60+
61+
static void GetUserName(v8::Local<v8::Name> name,
62+
const v8::PropertyCallbackInfo<v8::Value>& info);
63+
64+
static void GetHasRegExpGroups(
65+
v8::Local<v8::Name> name,
66+
const v8::PropertyCallbackInfo<v8::Value>& info);
67+
68+
static void Test(const v8::FunctionCallbackInfo<v8::Value>& args);
69+
70+
static void Exec(const v8::FunctionCallbackInfo<v8::Value>& args);
71+
72+
void BindFinalizer(v8::Isolate* isolate,
73+
const v8::Local<v8::Object>& object) {
74+
v8::HandleScope scopedHandle(isolate);
75+
weakHandle_.Reset(isolate, object);
76+
weakHandle_.SetWeak(this, Finalizer, v8::WeakCallbackType::kParameter);
77+
}
78+
79+
static void Finalizer(const v8::WeakCallbackInfo<URLPatternImpl>& data) {
80+
auto* pThis = data.GetParameter();
81+
pThis->weakHandle_.Reset();
82+
delete pThis;
83+
}
84+
85+
private:
86+
url_pattern<v8_regex_provider> pattern_;
87+
v8::Global<v8::Object> weakHandle_;
88+
89+
static std::optional<ada::url_pattern_init> ParseInput(
90+
v8::Isolate* isolate, const v8::Local<v8::Value>& input);
91+
};
92+
} // namespace tns

‎TestRunner/app/tests/URLPattern.js

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
describe("URLPattern", function () {
3+
it("throws on invalid URLPattern", function () {
4+
var exceptionCaught = false;
5+
try {
6+
const pattern = new URLPattern(1);
7+
} catch (e) {
8+
exceptionCaught = true;
9+
}
10+
expect(exceptionCaught).toBe(true);
11+
});
12+
13+
it("does not throw on valid URLPattern", function () {
14+
var exceptionCaught = false;
15+
try {
16+
const pattern = new URLPattern("https://example.com/books/:id");
17+
} catch (e) {
18+
exceptionCaught = true;
19+
}
20+
expect(exceptionCaught).toBe(false);
21+
});
22+
23+
it("parses simple pattern", function () {
24+
const pattern = new URLPattern("https://example.com/books/:id");
25+
expect(pattern.protocol).toBe("https");
26+
expect(pattern.hostname).toBe("example.com");
27+
expect(pattern.pathname).toBe("/books/:id");
28+
expect(pattern.port).toBe("");
29+
expect(pattern.search).toBe("*");
30+
expect(pattern.hash).toBe("*");
31+
expect(pattern.username).toBe("*");
32+
expect(pattern.password).toBe("*");
33+
expect(pattern.hasRegExpGroups).toBe(false);
34+
});
35+
36+
37+
it("parses with undefined base", function () {
38+
const pattern = new URLPattern("https://google.com", undefined);
39+
expect(pattern.protocol).toBe("https");
40+
expect(pattern.hostname).toBe("google.com");
41+
});
42+
43+
it("parses with null base", function () {
44+
const pattern = new URLPattern("https://google.com", null);
45+
expect(pattern.protocol).toBe("https");
46+
expect(pattern.hostname).toBe("google.com");
47+
});
48+
49+
});

‎TestRunner/app/tests/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ require("./Timers");
8282

8383
require("./URL");
8484
require("./URLSearchParams");
85+
require("./URLPattern");
8586

8687
// Tests common for all runtimes.
8788
require("./shared/index").runAllTests();

‎v8ios.xcodeproj/project.pbxproj

+14-6
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,8 @@
319319
C2F64E8322E870A300EDB057 /* NativeScript.mm in Sources */ = {isa = PBXBuildFile; fileRef = C2F64E8222E870A300EDB057 /* NativeScript.mm */; };
320320
C2FEA16F22A3C75C00A5C0FC /* InlineFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C2FEA16D22A3C75C00A5C0FC /* InlineFunctions.cpp */; };
321321
C2FEA17022A3C75C00A5C0FC /* InlineFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = C2FEA16E22A3C75C00A5C0FC /* InlineFunctions.h */; };
322+
F1CB51832D5C37100042555E /* URLPatternImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F1CB51822D5C37100042555E /* URLPatternImpl.cpp */; };
323+
F1CB51842D5C37100042555E /* URLPatternImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = F1CB51812D5C37100042555E /* URLPatternImpl.h */; };
322324
F1F30E742B58FC74006A62C0 /* URLImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F1F30E702B58FC74006A62C0 /* URLImpl.cpp */; };
323325
F1F30E752B58FC74006A62C0 /* URLSearchParamsImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F1F30E712B58FC74006A62C0 /* URLSearchParamsImpl.cpp */; };
324326
F1F30E762B58FC74006A62C0 /* URLSearchParamsImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = F1F30E722B58FC74006A62C0 /* URLSearchParamsImpl.h */; };
@@ -818,6 +820,8 @@
818820
C2FF3017225203FD00933782 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
819821
C2FF301C2252062A00933782 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
820822
C2FF301F2252065E00933782 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
823+
F1CB51812D5C37100042555E /* URLPatternImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = URLPatternImpl.h; sourceTree = "<group>"; };
824+
F1CB51822D5C37100042555E /* URLPatternImpl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = URLPatternImpl.cpp; sourceTree = "<group>"; };
821825
F1F30E702B58FC74006A62C0 /* URLImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLImpl.cpp; sourceTree = "<group>"; };
822826
F1F30E712B58FC74006A62C0 /* URLSearchParamsImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLSearchParamsImpl.cpp; sourceTree = "<group>"; };
823827
F1F30E722B58FC74006A62C0 /* URLSearchParamsImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLSearchParamsImpl.h; sourceTree = "<group>"; };
@@ -1372,6 +1376,8 @@
13721376
C2DDEB3B229EAB8600345BFE /* runtime */ = {
13731377
isa = PBXGroup;
13741378
children = (
1379+
F1CB51812D5C37100042555E /* URLPatternImpl.h */,
1380+
F1CB51822D5C37100042555E /* URLPatternImpl.cpp */,
13751381
F1F30E702B58FC74006A62C0 /* URLImpl.cpp */,
13761382
F1F30E732B58FC74006A62C0 /* URLImpl.h */,
13771383
F1F30E712B58FC74006A62C0 /* URLSearchParamsImpl.cpp */,
@@ -1543,6 +1549,7 @@
15431549
F6191AB129C0FCE8003F588F /* InspectorServer.h in Headers */,
15441550
C247C16722F82842001D2CA2 /* libplatform.h in Headers */,
15451551
C2DDEBA4229EAC8300345BFE /* Runtime.h in Headers */,
1552+
F1CB51842D5C37100042555E /* URLPatternImpl.h in Headers */,
15461553
F1F30E8B2B58FE28006A62C0 /* ada.h in Headers */,
15471554
C2DDEB8D229EAC8300345BFE /* Common.h in Headers */,
15481555
C247C17122F82842001D2CA2 /* v8config.h in Headers */,
@@ -2177,6 +2184,7 @@
21772184
F6191AB029C0FCE8003F588F /* JsV8InspectorClient.mm in Sources */,
21782185
C2DDEB9C229EAC8300345BFE /* ClassBuilder.cpp in Sources */,
21792186
C266569322AFFF7E00EE15CC /* Pointer.cpp in Sources */,
2187+
F1CB51832D5C37100042555E /* URLPatternImpl.cpp in Sources */,
21802188
C2DDEB93229EAC8300345BFE /* ArgConverter.mm in Sources */,
21812189
C22C092222CA3F370080D176 /* Worker.mm in Sources */,
21822190
C2C8EE7A22CF64E4001F8CEC /* SimpleAllocator.cpp in Sources */,
@@ -2433,7 +2441,7 @@
24332441
ALWAYS_SEARCH_USER_PATHS = NO;
24342442
CLANG_ANALYZER_NONNULL = YES;
24352443
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
2436-
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
2444+
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
24372445
CLANG_CXX_LIBRARY = "libc++";
24382446
CLANG_ENABLE_MODULES = YES;
24392447
CLANG_ENABLE_OBJC_ARC = YES;
@@ -2496,7 +2504,7 @@
24962504
ALWAYS_SEARCH_USER_PATHS = NO;
24972505
CLANG_ANALYZER_NONNULL = YES;
24982506
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
2499-
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
2507+
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
25002508
CLANG_CXX_LIBRARY = "libc++";
25012509
CLANG_ENABLE_MODULES = YES;
25022510
CLANG_ENABLE_OBJC_ARC = YES;
@@ -2676,7 +2684,7 @@
26762684
C2DDEB2A229EA89200345BFE /* Debug */ = {
26772685
isa = XCBuildConfiguration;
26782686
buildSettings = {
2679-
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
2687+
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
26802688
CLANG_CXX_LIBRARY = "compiler-default";
26812689
CLANG_ENABLE_MODULES = NO;
26822690
CODE_SIGN_IDENTITY = "Apple Development";
@@ -2731,7 +2739,7 @@
27312739
C2DDEB2B229EA89200345BFE /* Release */ = {
27322740
isa = XCBuildConfiguration;
27332741
buildSettings = {
2734-
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
2742+
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
27352743
CLANG_CXX_LIBRARY = "compiler-default";
27362744
CLANG_ENABLE_MODULES = NO;
27372745
CODE_SIGN_IDENTITY = "Apple Development";
@@ -2788,7 +2796,7 @@
27882796
buildSettings = {
27892797
ALLOW_TARGET_PLATFORM_SPECIALIZATION = NO;
27902798
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
2791-
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
2799+
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
27922800
CLANG_ENABLE_MODULES = NO;
27932801
CLANG_ENABLE_OBJC_ARC = NO;
27942802
CURRENT_PROJECT_VERSION = 1;
@@ -2883,7 +2891,7 @@
28832891
buildSettings = {
28842892
ALLOW_TARGET_PLATFORM_SPECIALIZATION = NO;
28852893
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
2886-
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
2894+
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
28872895
CLANG_ENABLE_MODULES = NO;
28882896
CLANG_ENABLE_OBJC_ARC = NO;
28892897
CURRENT_PROJECT_VERSION = 1;

0 commit comments

Comments
 (0)
Please sign in to comment.