/* * Copyright (C) 2022 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #import "config.h" #import "NotificationData.h" #import "NotificationDirection.h" static NSString * const WebNotificationTitleKey = @"WebNotificationTitleKey"; static NSString * const WebNotificationBodyKey = @"WebNotificationBodyKey"; static NSString * const WebNotificationIconURLKey = @"WebNotificationIconURLKey"; static NSString * const WebNotificationTagKey = @"WebNotificationTagKey"; static NSString * const WebNotificationLanguageKey = @"WebNotificationLanguageKey"; static NSString * const WebNotificationDirectionKey = @"WebNotificationDirectionKey"; static NSString * const WebNotificationOriginKey = @"WebNotificationOriginKey"; static NSString * const WebNotificationServiceWorkerRegistrationURLKey = @"WebNotificationServiceWorkerRegistrationURLKey"; static NSString * const WebNotificationUUIDStringKey = @"WebNotificationUUIDStringKey"; static NSString * const WebNotificationSessionIDKey = @"WebNotificationSessionIDKey"; static NSString * const WebNotificationDataKey = @"WebNotificationDataKey"; namespace WebCore { std::optional NotificationData::fromDictionary(NSDictionary *dictionary) { NSString *title = dictionary[WebNotificationTitleKey]; NSString *body = dictionary[WebNotificationBodyKey]; NSString *iconURL = dictionary[WebNotificationIconURLKey]; NSString *tag = dictionary[WebNotificationTagKey]; NSString *language = dictionary[WebNotificationLanguageKey]; NSString *originString = dictionary[WebNotificationOriginKey]; NSString *serviceWorkerRegistrationURL = dictionary[WebNotificationServiceWorkerRegistrationURLKey]; NSNumber *sessionID = dictionary[WebNotificationSessionIDKey]; NSData *notificationData = dictionary[WebNotificationDataKey]; NSString *uuidString = dictionary[WebNotificationUUIDStringKey]; auto uuid = UUID::parseVersion4(String(uuidString)); if (!uuid) return std::nullopt; NotificationDirection direction; NSNumber *directionNumber = dictionary[WebNotificationDirectionKey]; switch ((NotificationDirection)(directionNumber.unsignedLongValue)) { case NotificationDirection::Auto: case NotificationDirection::Ltr: case NotificationDirection::Rtl: direction = (NotificationDirection)directionNumber.unsignedLongValue; break; default: return std::nullopt; } NotificationData data { title, body, iconURL, tag, language, direction, originString, URL { String { serviceWorkerRegistrationURL } }, *uuid, PAL::SessionID { sessionID.unsignedLongLongValue }, { }, { static_cast(notificationData.bytes), notificationData.length } }; return WTFMove(data); } NSDictionary *NotificationData::dictionaryRepresentation() const { return @{ WebNotificationTitleKey : (NSString *)title, WebNotificationBodyKey : (NSString *)body, WebNotificationIconURLKey : (NSString *)iconURL, WebNotificationTagKey : (NSString *)tag, WebNotificationLanguageKey : (NSString *)language, WebNotificationOriginKey : (NSString *)originString, WebNotificationDirectionKey : @((unsigned long)direction), WebNotificationServiceWorkerRegistrationURLKey : (NSString *)serviceWorkerRegistrationURL.string(), WebNotificationUUIDStringKey : (NSString *)notificationID.toString(), WebNotificationSessionIDKey : @(sourceSession.toUInt64()), WebNotificationDataKey: [NSData dataWithBytes:data.data() length:data.size()] }; } } // namespace WebKit