// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module pdf.mojom;

import "mojo/public/mojom/base/big_buffer.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "services/network/public/mojom/referrer_policy.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom";

// Must match `SaveRequestType` in
// `chrome/common/extensions/api/pdf_viewer_private.idl` and
// `tools/typescript/definitions/pdf_viewer_private.d.ts`.
enum SaveRequestType {
  kAnnotation = 0,
  kOriginal = 1,
  kEdited = 2,
  kSearchified = 3,
};

// Returns by `GetSaveDataBufferHandlerForDrive()`. `handler` is the handler
// to read the data to save to Google Drive. `total_file_size` is the total file
// size to save.
[EnableIf=enable_pdf_save_to_drive]
struct SaveDataBufferHandlerGetResult {
  pending_remote<SaveDataBufferHandler> handler;
  uint32 total_file_size;
};

// Interface for reading the PDF data to save to Google Drive.
[EnableIf=enable_pdf_save_to_drive]
interface SaveDataBufferHandler {
  // Returns `block_size` bytes to save the PDF to Google Drive starting from
  // location `offset`.
  Read(uint32 offset, uint32 block_size) => (mojo_base.mojom.BigBuffer block);
};

interface PdfListener {
  // Sets the current caret position.
  SetCaretPosition(gfx.mojom.PointF position);

  // Move the end of the range selection to |extent|.
  MoveRangeSelectionExtent(gfx.mojom.PointF extent);

  // Sets the selection to be between |base| and |extent|. The |extent| will
  // be moved if the selection is modified.
  SetSelectionBounds(gfx.mojom.PointF base, gfx.mojom.PointF extent);

  // The status of the GetPdfBytes call.
  enum GetPdfBytesStatus {
    kSuccess = 0,
    kSizeLimitExceeded = 1,
    kFailed = 2,
  };

  // Get PDF bytes. If the size of the PDF in bytes is larger than `size_limit`,
  // an empty vector will be returned instead. `bytes` is only guaranteed to be
  // from the PDF engine if `status` is `kSuccess`. `page_count` is the number
  // of pages in the PDF displayed in the renderer, not the number of pages
  // returned in `bytes`.
  GetPdfBytes(uint32 size_limit)
      => (GetPdfBytesStatus status, array<uint8> bytes, uint32 page_count);

  // Get the text contained on the given page of the PDF. `page_index` should be
  // the range [0, # of pages).
  GetPageText(int32 page_index) => (mojo_base.mojom.String16 text);

  // #if BUILDFLAG(ARKWEB_PDF)
  [EnableIf=arkweb_pdf]
  ClearTextSelection();

  [EnableIf=arkweb_pdf]
  OnScaleChanged();
  // #endif

  // Returns the index of the most visible page. If no page is visible,
  // returns nullopt.
  GetMostVisiblePageIndex() => (uint32? page_index);

  // Returns a `SaveDataBufferHandler` and the total file size to read the data
  // to save to Google Drive. Once the handler is acquired, caller can read the
  // data by calling `Read`. If the file is larger than INT_MAX size, returns
  // nullptr.
  [EnableIf=enable_pdf_save_to_drive]
  GetSaveDataBufferHandlerForDrive(SaveRequestType request_type)
      => (SaveDataBufferHandlerGetResult? result);
};

// Browser-side interface used by PDF renderers.
interface PdfHost {
  SetListener(pending_remote<PdfListener> client);

  // Invoked when document load is completed successfully. Will not be invoked
  // if the load fails.
  OnDocumentLoadComplete();

  // Updates the content restrictions, i.e. to disable print/copy.
  UpdateContentRestrictions(int32 restrictions);

  // Brings up SaveAs... dialog to save specified URL.
  SaveUrlAs(url.mojom.Url url, network.mojom.ReferrerPolicy policy);

  // Notifies the embedder of the top-left and bottom-right coordinates of the
  // current selection.
  SelectionChanged(gfx.mojom.PointF left,
                   int32 left_height,
                   gfx.mojom.PointF right,
                   int32 right_height);

  // Notifies the embedder know the plugin can handle save commands internally.
  SetPluginCanSave(bool can_save);

  // Notifies that PDF searchifier has started processing pages. This should be
  // called at most once.
  [EnableIf=enable_screen_ai_service]
  OnSearchifyStarted();

  // #if BUILDFLAG(ARKWEB_PDF)
  [EnableIf=arkweb_pdf]
  ConvertAndUpdateSelectionBounds(gfx.mojom.Rect clipped_selection_bounds);

  [EnableIf=arkweb_pdf]
  HideHandleAndQuickMenu(bool hide);

  [EnableIf=arkweb_pdf]
  ResetResponsePendingInputEvent();

  [EnableIf=arkweb_pdf]
  SetIsLeftHandleVisible(bool visible);

  [EnableIf=arkweb_pdf]
  SetIsRightHandleVisible(bool visible);
  // #endif
};