chromium/chrome/browser/ash/crosapi/file_change_service_bridge_ash.cc

// Copyright 2024 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/ash/crosapi/file_change_service_bridge_ash.h"

#include "base/logging.h"
#include "chrome/browser/ash/file_manager/fileapi_util.h"
#include "chrome/browser/ash/fileapi/file_change_service.h"
#include "chrome/browser/ash/fileapi/file_change_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "storage/browser/file_system/file_system_context.h"
#include "storage/browser/file_system/file_system_url.h"

namespace crosapi {
namespace {

// Helpers ---------------------------------------------------------------------

// Returns a `storage::FileSystemURL` for the given `profile` and `file_path`.
// Note that the return value must be checked for validity in order to ascertain
// success/failure.
storage::FileSystemURL CreateFileSystemURL(Profile* profile,
                                           const base::FilePath& file_path) {
  if (GURL url; file_manager::util::ConvertAbsoluteFilePathToFileSystemUrl(
          profile, file_path, file_manager::util::GetFileManagerURL(), &url)) {
    return file_manager::util::GetFileManagerFileSystemContext(profile)
        ->CrackURLInFirstPartyContext(url);
  }
  return storage::FileSystemURL();
}

}  // namespace

// FileChangeServiceBridgeAsh --------------------------------------------------

FileChangeServiceBridgeAsh::FileChangeServiceBridgeAsh(Profile* profile)
    : profile_(profile) {
  profile_observation_.Observe(profile_);
}

FileChangeServiceBridgeAsh::~FileChangeServiceBridgeAsh() = default;

void FileChangeServiceBridgeAsh::BindReceiver(
    mojo::PendingReceiver<mojom::FileChangeServiceBridge> receiver) {
  receivers_.Add(this, std::move(receiver));
}

void FileChangeServiceBridgeAsh::OnProfileWillBeDestroyed(Profile* profile) {
  CHECK_EQ(profile_, profile);
  profile_ = nullptr;
  profile_observation_.Reset();
}

void FileChangeServiceBridgeAsh::OnFileCreatedFromShowSaveFilePicker(
    const GURL& file_picker_binding_context,
    const base::FilePath& file_path) {
  CHECK(profile_);

  if (storage::FileSystemURL file_system_url =
          CreateFileSystemURL(profile_, file_path);
      file_system_url.is_valid()) {
    ash::FileChangeServiceFactory::GetInstance()
        ->GetService(profile_)
        ->NotifyFileCreatedFromShowSaveFilePicker(file_picker_binding_context,
                                                  file_system_url);
  } else {
    LOG(WARNING) << "Unexpected `OnFileCreatedFromShowSaveFilePicker()` event.";
  }
}

}  // namespace crosapi