// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_PROXY_PDF_RESOURCE_H_
#define PPAPI_PROXY_PDF_RESOURCE_H_

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/proxy/connection.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_proxy_export.h"
#include "ppapi/thunk/ppb_pdf_api.h"

namespace ppapi {
namespace proxy {

class PPAPI_PROXY_EXPORT PDFResource
    : public PluginResource,
      public thunk::PPB_PDF_API {
 public:
  PDFResource(Connection connection, PP_Instance instance);
  ~PDFResource() override;

  // For unittesting with a given locale.
  void SetLocaleForTest(const std::string& locale) {
    locale_ = locale;
  }

  // Resource override.
  thunk::PPB_PDF_API* AsPPB_PDF_API() override;

  // PPB_PDF_API implementation.
  void SearchString(const unsigned short* input_string,
                    const unsigned short* input_term,
                    bool case_sensitive,
                    PP_PrivateFindResult** results,
                    uint32_t* count) override;
  void DidStartLoading() override;
  void DidStopLoading() override;
  void SetContentRestriction(int restrictions) override;
  void UserMetricsRecordAction(const PP_Var& action) override;
  void HasUnsupportedFeature() override;
  void Print() override;
  void ShowAlertDialog(const char* messasge) override;
  bool ShowConfirmDialog(const char* messasge) override;
  PP_Var ShowPromptDialog(const char* messasge,
                          const char* default_answer) override;
  void SaveAs() override;
  PP_Bool IsFeatureEnabled(PP_PDFFeature feature) override;
  void SetSelectedText(const char* selected_text) override;
  void SetLinkUnderCursor(const char* url) override;
  void GetV8ExternalSnapshotData(const char** natives_data_out,
                                 int* natives_size_out,
                                 const char** snapshot_data_out,
                                 int* snapshot_size_out) override;
  void SetAccessibilityViewportInfo(
      PP_PrivateAccessibilityViewportInfo* viewport_info) override;
  void SetAccessibilityDocInfo(
      PP_PrivateAccessibilityDocInfo* doc_info) override;
  void SetAccessibilityPageInfo(
      PP_PrivateAccessibilityPageInfo* page_info,
      PP_PrivateAccessibilityTextRunInfo text_runs[],
      PP_PrivateAccessibilityCharInfo chars[]) override;
  void SetCrashData(const char* pdf_url, const char* top_level_url) override;
  void SelectionChanged(const PP_FloatPoint& left,
                        int32_t left_height,
                        const PP_FloatPoint& right,
                        int32_t right_height) override;
  void SetPluginCanSave(bool can_save) override;

 private:
  std::string locale_;

  DISALLOW_COPY_AND_ASSIGN(PDFResource);
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_PDF_RESOURCE_H_
