Skip to content

Commit

Permalink
Cherry-pick 0e6ba3e. rdar://125791668
Browse files Browse the repository at this point in the history
    Add SPI for creating _WKApplicationManifest with data
    https://bugs.webkit.org/show_bug.cgi?id=272075
    rdar://125791668

    Reviewed by Chris Dumez.

    Test: WKApplicationManifest.EmptyJSONData
          WKApplicationManifest.JSONDataEncoding

    * Source/WebKit/UIProcess/API/Cocoa/_WKApplicationManifest.h:
    * Source/WebKit/UIProcess/API/Cocoa/_WKApplicationManifest.mm:
    (-[_WKApplicationManifest initWithJSONData:manifestURL:documentURL:]):
    * Tools/TestWebKitAPI/Tests/WebKitCocoa/ApplicationManifest.mm:
    (TestWebKitAPI::TEST(WKApplicationManifest, EmptyJSONData)):
    (TestWebKitAPI::TEST(WKApplicationManifest, JSONDataEncoding)):

    Canonical link: https://commits.webkit.org/277014@main

Canonical link: https://commits.webkit.org/272448.870@safari-7618-branch
  • Loading branch information
szewai authored and drobson1005 committed Apr 5, 2024
1 parent ad907bb commit 73400af
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Source/WebKit/UIProcess/API/Cocoa/_WKApplicationManifest.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ typedef NS_ENUM(NSInteger, _WKApplicationManifestIconPurpose) {
WK_CLASS_AVAILABLE(macos(10.13.4), ios(11.3))
@interface _WKApplicationManifest : NSObject <NSSecureCoding>

- (instancetype)init NS_UNAVAILABLE;
- (nullable instancetype)initWithJSONData:(NSData *)jsonData manifestURL:(NSURL *)manifestURL documentURL:(NSURL *)documentURL WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));

@property (nonatomic, readonly, nullable, copy) NSString *rawJSON;
@property (nonatomic, readonly, nullable, copy) NSString *name;
@property (nonatomic, readonly, nullable, copy) NSString *shortName;
Expand Down
25 changes: 25 additions & 0 deletions Source/WebKit/UIProcess/API/Cocoa/_WKApplicationManifest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,22 @@ @implementation _WKApplicationManifest

#if ENABLE(APPLICATION_MANIFEST)

- (instancetype)initWithJSONData:(NSData *)jsonData manifestURL:(NSURL *)manifestURL documentURL:(NSURL *)documentURL
{
if (!(self = [super init]))
return nil;

RetainPtr jsonString = adoptNS([[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
if (!jsonString)
return nil;

// FIXME: Return nil if jsonString cannot be deserialized into JSON object.
auto manifest = WebCore::ApplicationManifestParser::parse(jsonString.get(), URL(manifestURL), URL(documentURL));
API::Object::constructInWrapper<API::ApplicationManifest>(self, manifest);

return self;
}

+ (BOOL)supportsSecureCoding
{
return YES;
Expand Down Expand Up @@ -465,6 +481,15 @@ - (NSURL *)manifestId

#else // ENABLE(APPLICATION_MANIFEST)

- (instancetype)initWithJSONData:(NSData *)jsonData manifestURL:(NSURL *)manifestURL documentURL:(NSURL *)documentURL
{
UNUSED_PARAM(jsonData);
UNUSED_PARAM(manifestURL);
UNUSED_PARAM(documentURL);

return nil;
}

+ (_WKApplicationManifest *)applicationManifestFromJSON:(NSString *)json manifestURL:(NSURL *)manifestURL documentURL:(NSURL *)documentURL
{
UNUSED_PARAM(json);
Expand Down
28 changes: 28 additions & 0 deletions Tools/TestWebKitAPI/Tests/WebKitCocoa/ApplicationManifest.mm
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,34 @@
EXPECT_EQ(decodedIcon.purposes[1].unsignedLongValue, 4ul);
}

TEST(WKApplicationManifest, EmptyJSONData)
{
RetainPtr<NSURL> manifestURL = [NSURL URLWithString:@"https://test.com/manifest.json"];
RetainPtr<NSURL> documentURL = [NSURL URLWithString:@"https://test.com"];

NSDictionary *emptyJSONObject = @{ };
RetainPtr emptyJSONData = [NSJSONSerialization dataWithJSONObject:emptyJSONObject options:0 error:nil];
RetainPtr manifest = adoptNS([[_WKApplicationManifest alloc] initWithJSONData:emptyJSONData.get() manifestURL:manifestURL.get() documentURL:documentURL.get()]);
EXPECT_NOT_NULL(manifest);
}

TEST(WKApplicationManifest, JSONDataEncoding)
{
RetainPtr<NSURL> manifestURL = [NSURL URLWithString:@"https://test.com/manifest.json"];
RetainPtr<NSURL> documentURL = [NSURL URLWithString:@"https://test.com"];

NSString *jsonString = @"{ \"name\": \"TestName\" }";
RetainPtr jsonDataUTF8 = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
RetainPtr jsonDataUTF16 = [jsonString dataUsingEncoding:NSUTF32StringEncoding];
RetainPtr manifest = adoptNS([[_WKApplicationManifest alloc] initWithJSONData:jsonDataUTF8.get() manifestURL:manifestURL.get() documentURL:documentURL.get()]);
EXPECT_NOT_NULL(manifest);
EXPECT_WK_STREQ("TestName", manifest.get().name);

manifest = adoptNS([[_WKApplicationManifest alloc] initWithJSONData:jsonDataUTF16.get() manifestURL:manifestURL.get() documentURL:documentURL.get()]);
EXPECT_NULL(manifest);
}


} // namespace TestWebKitAPI

#endif // ENABLE(APPLICATION_MANIFEST)

0 comments on commit 73400af

Please sign in to comment.