// Copyright (c) 2011 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_SHARED_IMPL_PPB_INSTANCE_SHARED_H_
#define PPAPI_SHARED_IMPL_PPB_INSTANCE_SHARED_H_

#include "base/compiler_specific.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/shared_impl/ppapi_shared_export.h"
#include "ppapi/thunk/ppb_instance_api.h"

namespace ppapi {

class PPAPI_SHARED_EXPORT PPB_Instance_Shared
    : NON_EXPORTED_BASE(public thunk::PPB_Instance_API) {
 public:
  ~PPB_Instance_Shared() override;

  // Implementation of some shared PPB_Instance_FunctionAPI functions.
  void Log(PP_Instance instance, PP_LogLevel log_level, PP_Var value) override;
  void LogWithSource(PP_Instance instance,
                     PP_LogLevel log_level,
                     PP_Var source,
                     PP_Var value) override;

  // Error checks the given resquest to Request[Filtering]InputEvents. Returns
  // PP_OK if the given classes are all valid, PP_ERROR_NOTSUPPORTED if not.
  int32_t ValidateRequestInputEvents(bool is_filtering, uint32_t event_classes);

  bool ValidateSetCursorParams(PP_MouseCursor_Type type,
                               PP_Resource image,
                               const PP_Point* hot_spot);

  // The length of text to request as a surrounding context of selection.
  // For now, the value is copied from the one with render_view_impl.cc.
  // TODO(kinaba) implement a way to dynamically sync the requirement.
  static const int kExtraCharsForTextInput;
};

}  // namespace ppapi

#endif  // PPAPI_SHARED_IMPL_PPB_INSTANCE_SHARED_H_
