chromium/ash/lobster/lobster_image_actuator.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 "ash/lobster/lobster_image_actuator.h"

#include "base/base64.h"
#include "base/containers/span.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/strings/strcat.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/ime/text_input_client.h"
#include "url/gurl.h"

namespace ash {

void InsertImageOrCopyToClipboard(ui::TextInputClient* input_client,
                                  const std::string& image_bytes) {
  if (!input_client) {
    LOG(ERROR) << "No valid input client found.";
  }

  GURL image_data_url(base::StrCat(
      {"data:image/jpeg;base64,", base::Base64Encode(image_bytes)}));

  if (!image_data_url.is_valid()) {
    return;
  }

  if (input_client->CanInsertImage()) {
    input_client->InsertImage(image_data_url);
  } else {
    // Overwrite the clipboard data with the image data url.
    auto clipboard = std::make_unique<ui::ScopedClipboardWriter>(
        ui::ClipboardBuffer::kCopyPaste);

    clipboard->WriteHTML(base::UTF8ToUTF16(base::StrCat(
                             {"<img src=\"", image_data_url.spec(), "\">"})),
                         /*source_url=*/"");

    // TODO:b: - Show a toast notification if needed.
  }
}

void WriteImageToPath(const base::FilePath& file_path,
                      const std::string& image_bytes) {
  base::ThreadPool::PostTaskAndReplyWithResult(
      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
      base::BindOnce(
          [](const base::FilePath& file_path, std::string_view image_bytes) {
            return base::WriteFile(file_path, image_bytes);
          },
          file_path, image_bytes),
      base::BindOnce(
          [](const base::FilePath& file_path, bool success) {
            if (!success) {
              LOG(ERROR) << "Fail to write image to path: " << file_path;
            }
          },
          file_path));
}

}  // namespace ash