blob: d5368d92c7209ee330a14e40a2ddfe5960753c3b [file] [log] [blame]
// Copyright 2015 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/extensions/api/instance_id/instance_id_api.h"
#include "base/functional/bind.h"
#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
#include "base/time/time.h"
#include "chrome/browser/gcm/instance_id/instance_id_profile_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/instance_id.h"
#include "components/gcm_driver/instance_id/instance_id_driver.h"
#include "components/gcm_driver/instance_id/instance_id_profile_service.h"
#include "extensions/buildflags/buildflags.h"
#include "extensions/common/extension.h"
static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE));
namespace extensions {
namespace {
// Error messages.
const char kInvalidParameter[] = "Function was called with invalid parameters.";
const char kDisabled[] = "Instance ID is currently disabled.";
const char kAsyncOperationPending[] = "Asynchronous operation is pending.";
const char kNetworkError[] = "Network error occurred.";
const char kServerError[] = "Server error occurred.";
const char kUnknownError[] = "Unknown error occurred.";
const char* InstanceIDResultToError(instance_id::InstanceID::Result result) {
switch (result) {
case instance_id::InstanceID::INVALID_PARAMETER:
return kInvalidParameter;
case instance_id::InstanceID::DISABLED:
return kDisabled;
case instance_id::InstanceID::ASYNC_OPERATION_PENDING:
return kAsyncOperationPending;
case instance_id::InstanceID::NETWORK_ERROR:
return kNetworkError;
case instance_id::InstanceID::SERVER_ERROR:
return kServerError;
case instance_id::InstanceID::UNKNOWN_ERROR:
return kUnknownError;
default:
NOTREACHED() << "Unexpected value of result cannot be converted: "
<< result;
}
}
} // namespace
InstanceIDApiFunction::InstanceIDApiFunction() = default;
InstanceIDApiFunction::~InstanceIDApiFunction() = default;
ExtensionFunction::ResponseAction InstanceIDApiFunction::Run() {
if (Profile::FromBrowserContext(browser_context())->IsOffTheRecord()) {
return RespondNow(Error(
"chrome.instanceID not supported in incognito mode"));
}
return DoWork();
}
instance_id::InstanceID* InstanceIDApiFunction::GetInstanceID() const {
return instance_id::InstanceIDProfileServiceFactory::GetForProfile(
Profile::FromBrowserContext(browser_context()))->driver()->
GetInstanceID(extension()->id());
}
InstanceIDGetIDFunction::InstanceIDGetIDFunction() = default;
InstanceIDGetIDFunction::~InstanceIDGetIDFunction() = default;
ExtensionFunction::ResponseAction InstanceIDGetIDFunction::DoWork() {
GetInstanceID()->GetID(
base::BindOnce(&InstanceIDGetIDFunction::GetIDCompleted, this));
return RespondLater();
}
void InstanceIDGetIDFunction::GetIDCompleted(const std::string& id) {
Respond(WithArguments(id));
}
InstanceIDGetCreationTimeFunction::InstanceIDGetCreationTimeFunction() =
default;
InstanceIDGetCreationTimeFunction::~InstanceIDGetCreationTimeFunction() =
default;
ExtensionFunction::ResponseAction InstanceIDGetCreationTimeFunction::DoWork() {
GetInstanceID()->GetCreationTime(base::BindOnce(
&InstanceIDGetCreationTimeFunction::GetCreationTimeCompleted, this));
return RespondLater();
}
void InstanceIDGetCreationTimeFunction::GetCreationTimeCompleted(
const base::Time& creation_time) {
Respond(WithArguments(creation_time.InMillisecondsFSinceUnixEpoch()));
}
InstanceIDGetTokenFunction::InstanceIDGetTokenFunction() = default;
InstanceIDGetTokenFunction::~InstanceIDGetTokenFunction() = default;
ExtensionFunction::ResponseAction InstanceIDGetTokenFunction::DoWork() {
std::optional<api::instance_id::GetToken::Params> params =
api::instance_id::GetToken::Params::Create(args());
EXTENSION_FUNCTION_VALIDATE(params);
GetInstanceID()->GetToken(
params->get_token_params.authorized_entity,
params->get_token_params.scope, /*time_to_live=*/base::TimeDelta(),
/*flags=*/{},
base::BindOnce(&InstanceIDGetTokenFunction::GetTokenCompleted, this));
return RespondLater();
}
void InstanceIDGetTokenFunction::GetTokenCompleted(
const std::string& token,
instance_id::InstanceID::Result result) {
if (result == instance_id::InstanceID::SUCCESS)
Respond(WithArguments(token));
else
Respond(Error(InstanceIDResultToError(result)));
}
InstanceIDDeleteTokenFunction::InstanceIDDeleteTokenFunction() = default;
InstanceIDDeleteTokenFunction::~InstanceIDDeleteTokenFunction() = default;
ExtensionFunction::ResponseAction InstanceIDDeleteTokenFunction::DoWork() {
std::optional<api::instance_id::DeleteToken::Params> params =
api::instance_id::DeleteToken::Params::Create(args());
EXTENSION_FUNCTION_VALIDATE(params);
GetInstanceID()->DeleteToken(
params->delete_token_params.authorized_entity,
params->delete_token_params.scope,
base::BindOnce(&InstanceIDDeleteTokenFunction::DeleteTokenCompleted,
this));
return RespondLater();
}
void InstanceIDDeleteTokenFunction::DeleteTokenCompleted(
instance_id::InstanceID::Result result) {
if (result == instance_id::InstanceID::SUCCESS)
Respond(NoArguments());
else
Respond(Error(InstanceIDResultToError(result)));
}
InstanceIDDeleteIDFunction::InstanceIDDeleteIDFunction() = default;
InstanceIDDeleteIDFunction::~InstanceIDDeleteIDFunction() = default;
ExtensionFunction::ResponseAction InstanceIDDeleteIDFunction::DoWork() {
GetInstanceID()->DeleteID(
base::BindOnce(&InstanceIDDeleteIDFunction::DeleteIDCompleted, this));
return RespondLater();
}
void InstanceIDDeleteIDFunction::DeleteIDCompleted(
instance_id::InstanceID::Result result) {
if (result == instance_id::InstanceID::SUCCESS)
Respond(NoArguments());
else
Respond(Error(InstanceIDResultToError(result)));
}
} // namespace extensions