// 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/ui/omnibox/clipboard_utils.h"

#include <string>

#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/omnibox/omnibox_view.h"
#include "components/omnibox/browser/omnibox_text_util.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/data_transfer_policy/data_transfer_endpoint.h"

bool CanGetClipboardText() {
  // Note that this is intended for pre-flighting and so therefore, in this
  // context, it's unsafe to actually try to access the clipboard (especially on
  // macOS with Pasteboard Privacy). Therefore, make reasonable assumptions
  // below (marked as such) to avoid inspecting actual clipboard data.

  // Try text format.
  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  ui::DataTransferEndpoint data_dst = ui::DataTransferEndpoint(
      ui::EndpointType::kDefault, {.notify_if_restricted = false});
  if (clipboard->IsFormatAvailable(ui::ClipboardFormatType::PlainTextType(),
                                   ui::ClipboardBuffer::kCopyPaste,
                                   &data_dst)) {
    // Reasonable assumption: If there is text data on the clipboard, it's of
    // non-zero length.
    return true;
  }

  // Try bookmark format.
  if (clipboard->IsFormatAvailable(ui::ClipboardFormatType::UrlType(),
                                   ui::ClipboardBuffer::kCopyPaste,
                                   &data_dst)) {
    // Reasonable assumption: The URL is valid.
    return true;
  }

  return false;
}

std::u16string GetClipboardText(bool notify_if_restricted) {
  // Try text format.
  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  ui::DataTransferEndpoint data_dst =
      ui::DataTransferEndpoint(ui::EndpointType::kDefault,
                               {.notify_if_restricted = notify_if_restricted});
  if (clipboard->IsFormatAvailable(ui::ClipboardFormatType::PlainTextType(),
                                   ui::ClipboardBuffer::kCopyPaste,
                                   &data_dst)) {
    std::u16string text;
    clipboard->ReadText(ui::ClipboardBuffer::kCopyPaste, &data_dst, &text);
    text = text.substr(0, kMaxClipboardTextLength);
    return omnibox::SanitizeTextForPaste(text);
  }

  // Try bookmark format.
  //
  // It is tempting to try bookmark format first, but the URL we get out of a
  // bookmark has been cannonicalized via GURL.  This means if a user copies
  // and pastes from the URL bar to itself, the text will get fixed up and
  // cannonicalized, which is not what the user expects.  By pasting in this
  // order, we are sure to paste what the user copied.
  if (clipboard->IsFormatAvailable(ui::ClipboardFormatType::UrlType(),
                                   ui::ClipboardBuffer::kCopyPaste,
                                   &data_dst)) {
    std::string url_str;
    clipboard->ReadBookmark(&data_dst, nullptr, &url_str);
    // pass resulting url string through GURL to normalize
    GURL url(url_str);
    if (url.is_valid()) {
      return omnibox::StripJavascriptSchemas(base::UTF8ToUTF16(url.spec()));
    }
  }

  return std::u16string();
}
