1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <utility>
#include "third_party/blink/public/common/notifications/notification_mojom_traits.h"
#include "third_party/blink/public/mojom/notifications/notification.mojom.h"
namespace {
// Maximum number of entries in a vibration pattern.
constexpr int kMaximumVibrationPatternLength = 99;
// Maximum duration of each vibration in a pattern.
constexpr int kMaximumVibrationDurationMs = 10000; // 10 seconds.
bool ValidateVibrationPattern(const std::vector<int>& vibration_pattern) {
if (vibration_pattern.size() > kMaximumVibrationPatternLength)
return false;
for (const int duration : vibration_pattern) {
if (duration < 0 || duration > kMaximumVibrationDurationMs)
return false;
}
return true;
}
bool ValidateActions(
const std::vector<blink::mojom::NotificationActionPtr>& actions) {
return actions.size() <= blink::mojom::NotificationData::kMaximumActions;
}
bool ValidateData(const std::vector<char>& data) {
return data.size() <=
blink::mojom::NotificationData::kMaximumDeveloperDataSize;
}
} // namespace
namespace mojo {
// static
bool StructTraits<blink::mojom::NotificationDataDataView,
blink::PlatformNotificationData>::
Read(blink::mojom::NotificationDataDataView notification_data,
blink::PlatformNotificationData* platform_notification_data) {
// TODO(https://crbug.com/798466): Read the data directly into
// platform_notification_data.data once it stores a vector of ints not chars.
std::vector<uint8_t> data;
std::optional<std::string> lang;
if (!notification_data.ReadTitle(&platform_notification_data->title) ||
!notification_data.ReadDirection(
&platform_notification_data->direction) ||
!notification_data.ReadLang(&lang) ||
!notification_data.ReadBody(&platform_notification_data->body) ||
!notification_data.ReadTag(&platform_notification_data->tag) ||
!notification_data.ReadImage(&platform_notification_data->image) ||
!notification_data.ReadIcon(&platform_notification_data->icon) ||
!notification_data.ReadBadge(&platform_notification_data->badge) ||
!notification_data.ReadVibrationPattern(
&platform_notification_data->vibration_pattern) ||
!notification_data.ReadActions(&platform_notification_data->actions) ||
!notification_data.ReadData(&data) ||
!notification_data.ReadShowTriggerTimestamp(
&platform_notification_data->show_trigger_timestamp) ||
!notification_data.ReadScenario(&platform_notification_data->scenario)) {
return false;
}
platform_notification_data->lang = std::move(lang).value_or(std::string());
platform_notification_data->data.assign(data.begin(), data.end());
platform_notification_data->timestamp =
base::Time::FromMillisecondsSinceUnixEpoch(notification_data.timestamp());
platform_notification_data->renotify = notification_data.renotify();
platform_notification_data->silent = notification_data.silent();
platform_notification_data->require_interaction =
notification_data.require_interaction();
return ValidateVibrationPattern(
platform_notification_data->vibration_pattern) &&
ValidateActions(platform_notification_data->actions) &&
ValidateData(platform_notification_data->data);
}
// static
bool StructTraits<blink::mojom::NotificationResourcesDataView,
blink::NotificationResources>::
Read(blink::mojom::NotificationResourcesDataView in,
blink::NotificationResources* out) {
return in.ReadImage(&out->image) && in.ReadIcon(&out->notification_icon) &&
in.ReadBadge(&out->badge) && in.ReadActionIcons(&out->action_icons);
}
} // namespace mojo
|