blob: 462cfaa56bb1732fc66be7907ea2395d994bec21 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/web_applications/web_app_proto_utils.h"
#include <memory>
#include "base/base64.h"
#include "chrome/browser/web_applications/proto/web_app.pb.h"
#include "chrome/browser/web_applications/web_app.h"
#include "chrome/browser/web_applications/web_app_helpers.h"
#include "chrome/browser/web_applications/web_app_registrar.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace web_app {
namespace {
using Purpose = blink::mojom::ManifestImageResource_Purpose;
const char kStartUrl[] = "https://example.com/launchurl";
const char kAppName[] = "Test name";
const char kScope[] = "https://example.com/scope";
const char kUserPageOrdinal[] = "fake_user_page_ordinal";
const char kUserLaunchOrdinal[] = "fake_user_launch_ordinal";
const char kIconUrl[] = "https://example.com/icon.png";
const int kIconSizePx = 128;
} // namespace
// Test that a M85 serialized proto parses correctly in the current version.
TEST(WebAppProtoUtilsTest, M85SpecificsProtoParse) {
// Serialized in branch 4183 (M85) using:
// sync_proto.set_launch_url(kStartUrl);
// sync_proto.set_name(kAppName);
// sync_proto.set_user_display_mode(sync_pb::WebAppSpecifics::BROWSER);
// sync_pb::WebAppIconInfo* icon_info = sync_proto.add_icon_infos();
// icon_info->set_url(kIconUrl);
// sync_proto.SerializeAsString()
const std::string serialized_proto = {
10, 29, 104, 116, 116, 112, 115, 58, 47, 47, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 47, 108, 97, 117, 110,
99, 104, 117, 114, 108, 18, 9, 84, 101, 115, 116, 32, 110,
97, 109, 101, 24, 1, 50, 30, 18, 28, 104, 116, 116, 112,
115, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99,
111, 109, 47, 105, 99, 111, 110, 46, 112, 110, 103};
// Parse the proto.
sync_pb::WebAppSpecifics sync_proto;
bool parsed = sync_proto.ParseFromString(serialized_proto);
// Check the proto was parsed.
ASSERT_TRUE(parsed);
EXPECT_EQ(kStartUrl, sync_proto.start_url());
EXPECT_EQ(kAppName, sync_proto.name());
EXPECT_EQ(sync_pb::WebAppSpecifics::BROWSER, sync_proto.user_display_mode());
// Check the fields were parsed into the web app struct.
absl::optional<WebApp::SyncFallbackData> fallback_data =
ParseSyncFallbackDataStruct(sync_proto);
ASSERT_TRUE(fallback_data.has_value());
EXPECT_EQ(kAppName, fallback_data->name);
ASSERT_EQ(1u, fallback_data->icon_infos.size());
EXPECT_EQ(kIconUrl, fallback_data->icon_infos[0].url.spec());
EXPECT_EQ(apps::IconInfo::Purpose::kAny,
fallback_data->icon_infos[0].purpose);
}
// Test that a minimal M85 proto (ie. only fields that would always be set in
// M85) is correctly parsed to a WebApp::SyncFallbackData in the current
// Chromium version.
TEST(WebAppProtoUtilsTest, M85SpecificsProtoToWebApp_Minimal) {
// Set the minimal proto fields.
sync_pb::WebAppSpecifics sync_proto;
sync_proto.set_start_url(kStartUrl);
sync_proto.set_name(kAppName);
sync_proto.set_user_display_mode(sync_pb::WebAppSpecifics::BROWSER);
// Parse the proto.
absl::optional<WebApp::SyncFallbackData> fallback_data =
ParseSyncFallbackDataStruct(sync_proto);
// Check the fields were parsed.
ASSERT_TRUE(fallback_data.has_value());
EXPECT_EQ(kAppName, fallback_data->name);
ASSERT_EQ(0u, fallback_data->icon_infos.size());
}
// Test that a M85 proto with all fields populated is correctly parsed to a
// WebApp::SyncFallbackData in the current Chromium version.
TEST(WebAppProtoUtilsTest, M85SpecificsProtoToWebApp_FullyPopulated) {
// Set all proto fields.
sync_pb::WebAppSpecifics sync_proto;
sync_proto.set_start_url(kStartUrl);
sync_proto.set_name(kAppName);
sync_proto.set_user_display_mode(sync_pb::WebAppSpecifics::STANDALONE);
sync_proto.set_theme_color(SK_ColorRED);
sync_proto.set_scope(kScope);
sync_proto.set_user_page_ordinal(kUserPageOrdinal);
sync_proto.set_user_launch_ordinal(kUserLaunchOrdinal);
sync_pb::WebAppIconInfo* icon_info_1 = sync_proto.add_icon_infos();
icon_info_1->set_url(kIconUrl);
icon_info_1->set_size_in_px(kIconSizePx);
icon_info_1->set_purpose(sync_pb::WebAppIconInfo_Purpose_ANY);
sync_pb::WebAppIconInfo* icon_info_2 = sync_proto.add_icon_infos();
icon_info_2->set_url(kIconUrl);
icon_info_2->set_size_in_px(kIconSizePx);
icon_info_2->set_purpose(sync_pb::WebAppIconInfo_Purpose_MASKABLE);
// Parse the proto.
absl::optional<WebApp::SyncFallbackData> fallback_data =
ParseSyncFallbackDataStruct(sync_proto);
// Check the fields were parsed.
ASSERT_TRUE(fallback_data.has_value());
EXPECT_EQ(kAppName, fallback_data->name);
EXPECT_EQ(SK_ColorRED, fallback_data->theme_color);
EXPECT_EQ(kScope, fallback_data->scope.spec());
ASSERT_EQ(2u, fallback_data->icon_infos.size());
EXPECT_EQ(kIconUrl, fallback_data->icon_infos[0].url.spec());
EXPECT_EQ(kIconSizePx, fallback_data->icon_infos[0].square_size_px);
EXPECT_EQ(apps::IconInfo::Purpose::kAny,
fallback_data->icon_infos[0].purpose);
EXPECT_EQ(kIconUrl, fallback_data->icon_infos[1].url.spec());
EXPECT_EQ(kIconSizePx, fallback_data->icon_infos[1].square_size_px);
EXPECT_EQ(apps::IconInfo::Purpose::kMaskable,
fallback_data->icon_infos[1].purpose);
}
TEST(WebAppProtoUtilsTest, RunOnOsLoginModes) {
RunOnOsLoginMode mode = ToRunOnOsLoginMode(WebAppProto::MINIMIZED);
EXPECT_EQ(RunOnOsLoginMode::kMinimized, mode);
mode = ToRunOnOsLoginMode(WebAppProto::WINDOWED);
EXPECT_EQ(RunOnOsLoginMode::kWindowed, mode);
mode = ToRunOnOsLoginMode(WebAppProto::NOT_RUN);
EXPECT_EQ(RunOnOsLoginMode::kNotRun, mode);
// Any other value should return kNotRun.
mode = ToRunOnOsLoginMode(static_cast<WebAppProto::RunOnOsLoginMode>(0xCAFE));
EXPECT_EQ(RunOnOsLoginMode::kNotRun, mode);
WebAppProto::RunOnOsLoginMode proto_mode =
ToWebAppProtoRunOnOsLoginMode(RunOnOsLoginMode::kWindowed);
EXPECT_EQ(WebAppProto::WINDOWED, proto_mode);
proto_mode = ToWebAppProtoRunOnOsLoginMode(RunOnOsLoginMode::kMinimized);
EXPECT_EQ(WebAppProto::MINIMIZED, proto_mode);
proto_mode = ToWebAppProtoRunOnOsLoginMode(RunOnOsLoginMode::kNotRun);
EXPECT_EQ(WebAppProto::NOT_RUN, proto_mode);
}
} // namespace web_app