| // Copyright 2014 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. | |
| #include "ppapi/proxy/ppp_pdf_proxy.h" | |
| #include "build/build_config.h" | |
| #include "ppapi/proxy/host_dispatcher.h" | |
| #include "ppapi/proxy/ppapi_messages.h" | |
| #include "ppapi/shared_impl/proxy_lock.h" | |
| namespace ppapi { | |
| namespace proxy { | |
| namespace { | |
| #if !defined(OS_NACL) | |
| PP_Var GetLinkAtPosition(PP_Instance instance, PP_Point point) { | |
| // This isn't implemented in the out of process case. | |
| return PP_MakeUndefined(); | |
| } | |
| void Transform(PP_Instance instance, PP_PrivatePageTransformType type) { | |
| bool clockwise = type == PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW; | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_Rotate(API_ID_PPP_PDF, instance, clockwise)); | |
| } | |
| PP_Bool GetPrintPresetOptionsFromDocument( | |
| PP_Instance instance, | |
| PP_PdfPrintPresetOptions_Dev* options) { | |
| PP_Bool ret = PP_FALSE; | |
| HostDispatcher::GetForInstance(instance) | |
| ->Send(new PpapiMsg_PPPPdf_PrintPresetOptions( | |
| API_ID_PPP_PDF, instance, options, &ret)); | |
| return ret; | |
| } | |
| void EnableAccessibility(PP_Instance instance) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_EnableAccessibility(API_ID_PPP_PDF, instance)); | |
| } | |
| void SetCaretPosition(PP_Instance instance, const PP_FloatPoint* position) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_SetCaretPosition(API_ID_PPP_PDF, instance, | |
| *position)); | |
| } | |
| void MoveRangeSelectionExtent(PP_Instance instance, | |
| const PP_FloatPoint* extent) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_MoveRangeSelectionExtent(API_ID_PPP_PDF, instance, | |
| *extent)); | |
| } | |
| void SetSelectionBounds(PP_Instance instance, | |
| const PP_FloatPoint* base, | |
| const PP_FloatPoint* extent) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_SetSelectionBounds(API_ID_PPP_PDF, instance, *base, | |
| *extent)); | |
| } | |
| PP_Bool CanEditText(PP_Instance instance) { | |
| PP_Bool ret = PP_FALSE; | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_CanEditText(API_ID_PPP_PDF, instance, &ret)); | |
| return ret; | |
| } | |
| PP_Bool HasEditableText(PP_Instance instance) { | |
| PP_Bool ret = PP_FALSE; | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_HasEditableText(API_ID_PPP_PDF, instance, &ret)); | |
| return ret; | |
| } | |
| void ReplaceSelection(PP_Instance instance, const char* text) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_ReplaceSelection(API_ID_PPP_PDF, instance, text)); | |
| } | |
| PP_Bool CanUndo(PP_Instance instance) { | |
| PP_Bool ret = PP_FALSE; | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_CanUndo(API_ID_PPP_PDF, instance, &ret)); | |
| return ret; | |
| } | |
| PP_Bool CanRedo(PP_Instance instance) { | |
| PP_Bool ret = PP_FALSE; | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_CanRedo(API_ID_PPP_PDF, instance, &ret)); | |
| return ret; | |
| } | |
| void Undo(PP_Instance instance) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_Undo(API_ID_PPP_PDF, instance)); | |
| } | |
| void Redo(PP_Instance instance) { | |
| HostDispatcher::GetForInstance(instance)->Send( | |
| new PpapiMsg_PPPPdf_Redo(API_ID_PPP_PDF, instance)); | |
| } | |
| int32_t PrintBegin(PP_Instance instance, | |
| const PP_PrintSettings_Dev* print_settings, | |
| const PP_PdfPrintSettings_Dev* pdf_print_settings) { | |
| int32_t ret = 0; | |
| HostDispatcher::GetForInstance(instance)->Send(new PpapiMsg_PPPPdf_PrintBegin( | |
| API_ID_PPP_PDF, instance, *print_settings, *pdf_print_settings, &ret)); | |
| return ret; | |
| } | |
| const PPP_Pdf ppp_pdf_interface = { | |
| &GetLinkAtPosition, | |
| &Transform, | |
| &GetPrintPresetOptionsFromDocument, | |
| &EnableAccessibility, | |
| &SetCaretPosition, | |
| &MoveRangeSelectionExtent, | |
| &SetSelectionBounds, | |
| &CanEditText, | |
| &HasEditableText, | |
| &ReplaceSelection, | |
| &CanUndo, | |
| &CanRedo, | |
| &Undo, | |
| &Redo, | |
| &PrintBegin, | |
| }; | |
| #else | |
| // The NaCl plugin doesn't need the host side interface - stub it out. | |
| const PPP_Pdf ppp_pdf_interface = {}; | |
| #endif | |
| } // namespace | |
| PPP_Pdf_Proxy::PPP_Pdf_Proxy(Dispatcher* dispatcher) | |
| : InterfaceProxy(dispatcher), | |
| ppp_pdf_(NULL) { | |
| if (dispatcher->IsPlugin()) { | |
| ppp_pdf_ = static_cast<const PPP_Pdf*>( | |
| dispatcher->local_get_interface()(PPP_PDF_INTERFACE)); | |
| } | |
| } | |
| PPP_Pdf_Proxy::~PPP_Pdf_Proxy() { | |
| } | |
| // static | |
| const PPP_Pdf* PPP_Pdf_Proxy::GetProxyInterface() { | |
| return &ppp_pdf_interface; | |
| } | |
| bool PPP_Pdf_Proxy::OnMessageReceived(const IPC::Message& msg) { | |
| if (!dispatcher()->IsPlugin()) | |
| return false; | |
| bool handled = true; | |
| IPC_BEGIN_MESSAGE_MAP(PPP_Pdf_Proxy, msg) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_Rotate, OnPluginMsgRotate) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_PrintPresetOptions, | |
| OnPluginMsgPrintPresetOptions) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_EnableAccessibility, | |
| OnPluginMsgEnableAccessibility) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_SetCaretPosition, | |
| OnPluginMsgSetCaretPosition) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_MoveRangeSelectionExtent, | |
| OnPluginMsgMoveRangeSelectionExtent) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_SetSelectionBounds, | |
| OnPluginMsgSetSelectionBounds) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_CanEditText, OnPluginMsgCanEditText) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_HasEditableText, | |
| OnPluginMsgHasEditableText) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_ReplaceSelection, | |
| OnPluginMsgReplaceSelection) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_CanUndo, OnPluginMsgCanUndo) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_CanRedo, OnPluginMsgCanRedo) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_Undo, OnPluginMsgUndo) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_Redo, OnPluginMsgRedo) | |
| IPC_MESSAGE_HANDLER(PpapiMsg_PPPPdf_PrintBegin, OnPluginMsgPrintBegin) | |
| IPC_MESSAGE_UNHANDLED(handled = false) | |
| IPC_END_MESSAGE_MAP() | |
| return handled; | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgRotate(PP_Instance instance, bool clockwise) { | |
| PP_PrivatePageTransformType type = clockwise ? | |
| PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW : | |
| PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW; | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->Transform, instance, type); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgPrintPresetOptions( | |
| PP_Instance instance, | |
| PP_PdfPrintPresetOptions_Dev* options, | |
| PP_Bool* result) { | |
| if (ppp_pdf_) { | |
| *result = CallWhileUnlocked( | |
| ppp_pdf_->GetPrintPresetOptionsFromDocument, instance, options); | |
| } | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgEnableAccessibility(PP_Instance instance) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->EnableAccessibility, instance); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgSetCaretPosition(PP_Instance instance, | |
| const PP_FloatPoint& position) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->SetCaretPosition, instance, &position); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgMoveRangeSelectionExtent( | |
| PP_Instance instance, | |
| const PP_FloatPoint& extent) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->MoveRangeSelectionExtent, instance, &extent); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgSetSelectionBounds(PP_Instance instance, | |
| const PP_FloatPoint& base, | |
| const PP_FloatPoint& extent) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->SetSelectionBounds, instance, &base, &extent); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgCanEditText(PP_Instance instance, | |
| PP_Bool* result) { | |
| *result = PP_FromBool(ppp_pdf_ && | |
| CallWhileUnlocked(ppp_pdf_->CanEditText, instance)); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgHasEditableText(PP_Instance instance, | |
| PP_Bool* result) { | |
| *result = PP_FromBool(ppp_pdf_ && | |
| CallWhileUnlocked(ppp_pdf_->HasEditableText, instance)); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgReplaceSelection(PP_Instance instance, | |
| const std::string& text) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->ReplaceSelection, instance, text.c_str()); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgCanUndo(PP_Instance instance, PP_Bool* result) { | |
| *result = | |
| PP_FromBool(ppp_pdf_ && CallWhileUnlocked(ppp_pdf_->CanUndo, instance)); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgCanRedo(PP_Instance instance, PP_Bool* result) { | |
| *result = | |
| PP_FromBool(ppp_pdf_ && CallWhileUnlocked(ppp_pdf_->CanRedo, instance)); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgUndo(PP_Instance instance) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->Undo, instance); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgRedo(PP_Instance instance) { | |
| if (ppp_pdf_) | |
| CallWhileUnlocked(ppp_pdf_->Redo, instance); | |
| } | |
| void PPP_Pdf_Proxy::OnPluginMsgPrintBegin( | |
| PP_Instance instance, | |
| const PP_PrintSettings_Dev& print_settings, | |
| const PP_PdfPrintSettings_Dev& pdf_print_settings, | |
| int32_t* result) { | |
| if (!ppp_pdf_) { | |
| *result = 0; | |
| return; | |
| } | |
| *result = CallWhileUnlocked(ppp_pdf_->PrintBegin, instance, &print_settings, | |
| &pdf_print_settings); | |
| } | |
| } // namespace proxy | |
| } // namespace ppapi |