| Index: extensions/browser/api/lock_screen_data/lock_screen_data_api.cc | 
| diff --git a/extensions/browser/api/lock_screen_data/lock_screen_data_api.cc b/extensions/browser/api/lock_screen_data/lock_screen_data_api.cc | 
| index 87943dfacb8015caf3a88339750868978d9889ed..6679ae43a3a191d7c9811c8289d1a0d68a747cc8 100644 | 
| --- a/extensions/browser/api/lock_screen_data/lock_screen_data_api.cc | 
| +++ b/extensions/browser/api/lock_screen_data/lock_screen_data_api.cc | 
| @@ -4,20 +4,62 @@ | 
|  | 
| #include "extensions/browser/api/lock_screen_data/lock_screen_data_api.h" | 
|  | 
| -#include <memory> | 
| +#include <string> | 
| +#include <utility> | 
| #include <vector> | 
|  | 
| +#include "extensions/browser/api/lock_screen_data/data_item.h" | 
| +#include "extensions/browser/api/lock_screen_data/item_storage.h" | 
| +#include "extensions/browser/api/lock_screen_data/operation_result.h" | 
| #include "extensions/common/api/lock_screen_data.h" | 
|  | 
| namespace extensions { | 
|  | 
| +namespace { | 
| + | 
| +std::string GetErrorString(lock_screen_data::OperationResult result) { | 
| +  switch (result) { | 
| +    case lock_screen_data::OperationResult::kSuccess: | 
| +    case lock_screen_data::OperationResult::kPending: | 
| +      NOTREACHED() << "Expected a failure code."; | 
| +      return "Unknown"; | 
| +    case lock_screen_data::OperationResult::kFailed: | 
| +      return "Unknown"; | 
| +    case lock_screen_data::OperationResult::kFileCreationFailed: | 
| +    case lock_screen_data::OperationResult::kFileWriteFailed: | 
| +    case lock_screen_data::OperationResult::kFileReadFailed: | 
| +    case lock_screen_data::OperationResult::kFileDeleteFailed: | 
| +      return "Internal - file operation"; | 
| +    case lock_screen_data::OperationResult::kInvalidKey: | 
| +    case lock_screen_data::OperationResult::kWrongKey: | 
| +      return "Internal - encryption"; | 
| +    case lock_screen_data::OperationResult::kNotFound: | 
| +      return "Not found"; | 
| +    case lock_screen_data::OperationResult::kNoBackingFile: | 
| +      return "Not initialized"; | 
| +  } | 
| +  NOTREACHED() << "Unknown operation status"; | 
| +  return "Unknown"; | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| LockScreenDataCreateFunction::LockScreenDataCreateFunction() {} | 
|  | 
| LockScreenDataCreateFunction::~LockScreenDataCreateFunction() {} | 
|  | 
| ExtensionFunction::ResponseAction LockScreenDataCreateFunction::Run() { | 
| +  if (!lock_screen_data::ItemStorage::Get(browser_context())) | 
| +    return RespondNow(Error("Not available")); | 
| + | 
| +  const lock_screen_data::DataItem* item = | 
| +      lock_screen_data::ItemStorage::Get(browser_context()) | 
| +          ->CreateItem(extension_id()); | 
| +  if (!item) | 
| +    return RespondNow(Error("Creation failed")); | 
| + | 
| api::lock_screen_data::DataItemInfo item_info; | 
| -  item_info.id = "fake"; | 
| +  item_info.id = item->id(); | 
| return RespondNow( | 
| ArgumentList(api::lock_screen_data::Create::Results::Create(item_info))); | 
| } | 
| @@ -27,7 +69,22 @@ LockScreenDataGetAllFunction::LockScreenDataGetAllFunction() {} | 
| LockScreenDataGetAllFunction::~LockScreenDataGetAllFunction() {} | 
|  | 
| ExtensionFunction::ResponseAction LockScreenDataGetAllFunction::Run() { | 
| +  if (!lock_screen_data::ItemStorage::Get(browser_context())) | 
| +    return RespondNow(Error("Not available")); | 
| + | 
| +  std::vector<const lock_screen_data::DataItem*> items = | 
| +      lock_screen_data::ItemStorage::Get(browser_context()) | 
| +          ->GetAllForExtension(extension_id()); | 
| + | 
| std::vector<api::lock_screen_data::DataItemInfo> items_info; | 
| +  for (auto* const item : items) { | 
| +    if (!item) | 
| +      continue; | 
| +    api::lock_screen_data::DataItemInfo item_info; | 
| +    item_info.id = item->id(); | 
| +    items_info.emplace_back(std::move(item_info)); | 
| +  } | 
| + | 
| return RespondNow( | 
| ArgumentList(api::lock_screen_data::GetAll::Results::Create(items_info))); | 
| } | 
| @@ -37,11 +94,37 @@ LockScreenDataGetContentFunction::LockScreenDataGetContentFunction() {} | 
| LockScreenDataGetContentFunction::~LockScreenDataGetContentFunction() {} | 
|  | 
| ExtensionFunction::ResponseAction LockScreenDataGetContentFunction::Run() { | 
| +  if (!lock_screen_data::ItemStorage::Get(browser_context())) | 
| +    return RespondNow(Error("Not available")); | 
| + | 
| std::unique_ptr<api::lock_screen_data::GetContent::Params> params( | 
| api::lock_screen_data::GetContent::Params::Create(*args_)); | 
| EXTENSION_FUNCTION_VALIDATE(params.get()); | 
|  | 
| -  return RespondNow(Error("Not found")); | 
| +  lock_screen_data::OperationResult result = | 
| +      lock_screen_data::ItemStorage::Get(browser_context()) | 
| +          ->GetItemContent( | 
| +              extension_id(), params->id, | 
| +              base::Bind(&LockScreenDataGetContentFunction::OnDone, this)); | 
| +  if (result == lock_screen_data::OperationResult::kPending) | 
| +    return RespondLater(); | 
| +  if (result == lock_screen_data::OperationResult::kNoBackingFile) { | 
| +    return RespondNow( | 
| +        ArgumentList(api::lock_screen_data::GetContent::Results::Create( | 
| +            std::vector<char>()))); | 
| +  } | 
| +  return RespondNow(Error(GetErrorString(result))); | 
| +} | 
| + | 
| +void LockScreenDataGetContentFunction::OnDone( | 
| +    lock_screen_data::OperationResult result, | 
| +    std::unique_ptr<std::vector<char>> data) { | 
| +  if (result == lock_screen_data::OperationResult::kSuccess) { | 
| +    Respond(ArgumentList( | 
| +        api::lock_screen_data::GetContent::Results::Create(*data))); | 
| +    return; | 
| +  } | 
| +  Respond(Error(GetErrorString(result))); | 
| } | 
|  | 
| LockScreenDataSetContentFunction::LockScreenDataSetContentFunction() {} | 
| @@ -49,11 +132,30 @@ LockScreenDataSetContentFunction::LockScreenDataSetContentFunction() {} | 
| LockScreenDataSetContentFunction::~LockScreenDataSetContentFunction() {} | 
|  | 
| ExtensionFunction::ResponseAction LockScreenDataSetContentFunction::Run() { | 
| +  if (!lock_screen_data::ItemStorage::Get(browser_context())) | 
| +    return RespondNow(Error("Not available")); | 
| + | 
| std::unique_ptr<api::lock_screen_data::SetContent::Params> params( | 
| api::lock_screen_data::SetContent::Params::Create(*args_)); | 
| EXTENSION_FUNCTION_VALIDATE(params.get()); | 
|  | 
| -  return RespondNow(Error("Not found")); | 
| +  lock_screen_data::OperationResult result = | 
| +      lock_screen_data::ItemStorage::Get(browser_context()) | 
| +          ->SetItemContent( | 
| +              extension_id(), params->id, params->data, | 
| +              base::Bind(&LockScreenDataSetContentFunction::OnDone, this)); | 
| +  if (result == lock_screen_data::OperationResult::kPending) | 
| +    return RespondLater(); | 
| +  return RespondNow(Error(GetErrorString(result))); | 
| +} | 
| + | 
| +void LockScreenDataSetContentFunction::OnDone( | 
| +    lock_screen_data::OperationResult result) { | 
| +  if (result == lock_screen_data::OperationResult::kSuccess) { | 
| +    Respond(NoArguments()); | 
| +    return; | 
| +  } | 
| +  Respond(Error(GetErrorString(result))); | 
| } | 
|  | 
| LockScreenDataDeleteFunction::LockScreenDataDeleteFunction() {} | 
| @@ -64,7 +166,13 @@ ExtensionFunction::ResponseAction LockScreenDataDeleteFunction::Run() { | 
| std::unique_ptr<api::lock_screen_data::Delete::Params> params( | 
| api::lock_screen_data::Delete::Params::Create(*args_)); | 
| EXTENSION_FUNCTION_VALIDATE(params.get()); | 
| -  return RespondNow(Error("Not found.")); | 
| + | 
| +  lock_screen_data::OperationResult result = | 
| +      lock_screen_data::ItemStorage::Get(browser_context()) | 
| +          ->DeleteItem(extension_id(), params->id); | 
| +  if (result == lock_screen_data::OperationResult::kSuccess) | 
| +    return RespondNow(NoArguments()); | 
| +  return RespondNow(Error(GetErrorString(result))); | 
| } | 
|  | 
| }  // namespace extensions | 
|  |