diff options
Diffstat (limited to 'webkit/plugins')
-rw-r--r-- | webkit/plugins/ppapi/mock_plugin_delegate.cc | 14 | ||||
-rw-r--r-- | webkit/plugins/ppapi/mock_plugin_delegate.h | 7 | ||||
-rw-r--r-- | webkit/plugins/ppapi/plugin_delegate.h | 12 | ||||
-rw-r--r-- | webkit/plugins/ppapi/plugin_module.cc | 5 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_flash_impl.cc | 191 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_flash_impl.h | 54 | ||||
-rw-r--r-- | webkit/plugins/ppapi/resource.h | 1 |
7 files changed, 278 insertions, 6 deletions
diff --git a/webkit/plugins/ppapi/mock_plugin_delegate.cc b/webkit/plugins/ppapi/mock_plugin_delegate.cc index 93ace2c..2a96571 100644 --- a/webkit/plugins/ppapi/mock_plugin_delegate.cc +++ b/webkit/plugins/ppapi/mock_plugin_delegate.cc @@ -5,6 +5,7 @@ #include "webkit/plugins/ppapi/mock_plugin_delegate.h" #include "base/message_loop_proxy.h" +#include "ppapi/c/pp_errors.h" namespace webkit { namespace ppapi { @@ -159,6 +160,19 @@ MockPluginDelegate::GetFileThreadMessageLoopProxy() { return scoped_refptr<base::MessageLoopProxy>(); } +int32_t MockPluginDelegate::ConnectTcp( + webkit::ppapi::PPB_Flash_NetConnector_Impl* connector, + const char* host, + uint16_t port) { + return PP_ERROR_FAILED; +} + +int32_t MockPluginDelegate::ConnectTcpAddress( + webkit::ppapi::PPB_Flash_NetConnector_Impl* connector, + const struct PP_Flash_NetAddress* addr) { + return PP_ERROR_FAILED; +} + FullscreenContainer* MockPluginDelegate::CreateFullscreenContainer( PluginInstance* instance) { return NULL; diff --git a/webkit/plugins/ppapi/mock_plugin_delegate.h b/webkit/plugins/ppapi/mock_plugin_delegate.h index 4f83a80..7037a96 100644 --- a/webkit/plugins/ppapi/mock_plugin_delegate.h +++ b/webkit/plugins/ppapi/mock_plugin_delegate.h @@ -83,6 +83,13 @@ class MockPluginDelegate : public PluginDelegate { DirContents* contents); virtual scoped_refptr<base::MessageLoopProxy> GetFileThreadMessageLoopProxy(); + virtual int32_t ConnectTcp( + webkit::ppapi::PPB_Flash_NetConnector_Impl* connector, + const char* host, + uint16_t port); + virtual int32_t ConnectTcpAddress( + webkit::ppapi::PPB_Flash_NetConnector_Impl* connector, + const struct PP_Flash_NetAddress* addr); virtual FullscreenContainer* CreateFullscreenContainer( PluginInstance* instance); virtual std::string GetDefaultEncoding(); diff --git a/webkit/plugins/ppapi/plugin_delegate.h b/webkit/plugins/ppapi/plugin_delegate.h index 9feff6d..fd73c3a 100644 --- a/webkit/plugins/ppapi/plugin_delegate.h +++ b/webkit/plugins/ppapi/plugin_delegate.h @@ -52,6 +52,7 @@ class WebFileChooserCompletion; struct WebFileChooserParams; } +struct PP_Flash_NetAddress; struct PP_VideoCompressedDataBuffer_Dev; struct PP_VideoDecoderConfig_Dev; struct PP_VideoUncompressedDataBuffer_Dev; @@ -62,9 +63,10 @@ namespace webkit { namespace ppapi { class FileIO; +class FullscreenContainer; class PluginInstance; class PluginModule; -class FullscreenContainer; +class PPB_Flash_NetConnector_Impl; // Virtual interface that the browser implements to implement features for // PPAPI plugins. @@ -303,6 +305,14 @@ class PluginDelegate { virtual scoped_refptr<base::MessageLoopProxy> GetFileThreadMessageLoopProxy() = 0; + virtual int32_t ConnectTcp( + webkit::ppapi::PPB_Flash_NetConnector_Impl* connector, + const char* host, + uint16_t port) = 0; + virtual int32_t ConnectTcpAddress( + webkit::ppapi::PPB_Flash_NetConnector_Impl* connector, + const struct PP_Flash_NetAddress* addr) = 0; + // Create a fullscreen container for a plugin instance. This effectively // switches the plugin to fullscreen. virtual FullscreenContainer* CreateFullscreenContainer( diff --git a/webkit/plugins/ppapi/plugin_module.cc b/webkit/plugins/ppapi/plugin_module.cc index 11d0593..620fff6 100644 --- a/webkit/plugins/ppapi/plugin_module.cc +++ b/webkit/plugins/ppapi/plugin_module.cc @@ -296,6 +296,11 @@ const void* GetInterface(const char* name) { } #endif // ENABLE_GPU +#ifdef ENABLE_FLAPPER_HACKS + if (strcmp(name, PPB_FLASH_NETCONNECTOR_INTERFACE) == 0) + return PPB_Flash_NetConnector_Impl::GetInterface(); +#endif // ENABLE_FLAPPER_HACKS + // Only support the testing interface when the command line switch is // specified. This allows us to prevent people from (ab)using this interface // in production code. diff --git a/webkit/plugins/ppapi/ppb_flash_impl.cc b/webkit/plugins/ppapi/ppb_flash_impl.cc index f48a71b..8b1ff6c 100644 --- a/webkit/plugins/ppapi/ppb_flash_impl.cc +++ b/webkit/plugins/ppapi/ppb_flash_impl.cc @@ -12,7 +12,9 @@ #include "googleurl/src/gurl.h" #include "ppapi/c/dev/pp_file_info_dev.h" #include "ppapi/c/dev/ppb_file_io_dev.h" +#include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/private/ppb_flash.h" +#include "webkit/plugins/ppapi/common.h" #include "webkit/plugins/ppapi/error_util.h" #include "webkit/plugins/ppapi/plugin_delegate.h" #include "webkit/plugins/ppapi/plugin_module.h" @@ -22,6 +24,8 @@ namespace webkit { namespace ppapi { +// PPB_Flash_Impl -------------------------------------------------------------- + namespace { PluginInstance* GetSomeInstance(PP_Module pp_module) { @@ -241,6 +245,191 @@ const PPB_Flash* PPB_Flash_Impl::GetInterface() { return &ppb_flash; } +// PPB_Flash_NetConnector_Impl ------------------------------------------------- + +namespace { + +PP_Resource Create(PP_Instance instance_id) { + PluginInstance* instance = ResourceTracker::Get()->GetInstance(instance_id); + if (!instance) + return 0; + + scoped_refptr<PPB_Flash_NetConnector_Impl> connector( + new PPB_Flash_NetConnector_Impl(instance)); + return connector->GetReference(); +} + +PP_Bool IsFlashNetConnector(PP_Resource resource) { + return BoolToPPBool(!!Resource::GetAs<PPB_Flash_NetConnector_Impl>(resource)); +} + +int32_t ConnectTcp(PP_Resource connector_id, + const char* host, + uint16_t port, + PP_FileHandle* socket_out, + PP_Flash_NetAddress* local_addr_out, + PP_Flash_NetAddress* remote_addr_out, + PP_CompletionCallback callback) { + scoped_refptr<PPB_Flash_NetConnector_Impl> connector( + Resource::GetAs<PPB_Flash_NetConnector_Impl>(connector_id)); + if (!connector.get()) + return PP_ERROR_BADRESOURCE; + + return connector->ConnectTcp( + host, port, socket_out, local_addr_out, remote_addr_out, callback); +} + +int32_t ConnectTcpAddress(PP_Resource connector_id, + const PP_Flash_NetAddress* addr, + PP_FileHandle* socket_out, + PP_Flash_NetAddress* local_addr_out, + PP_Flash_NetAddress* remote_addr_out, + PP_CompletionCallback callback) { + scoped_refptr<PPB_Flash_NetConnector_Impl> connector( + Resource::GetAs<PPB_Flash_NetConnector_Impl>(connector_id)); + if (!connector.get()) + return PP_ERROR_BADRESOURCE; + + return connector->ConnectTcpAddress( + addr, socket_out, local_addr_out, remote_addr_out, callback); +} + +const PPB_Flash_NetConnector ppb_flash_netconnector = { + &Create, + &IsFlashNetConnector, + &ConnectTcp, + &ConnectTcpAddress, +}; + +} // namespace + +PPB_Flash_NetConnector_Impl::PPB_Flash_NetConnector_Impl( + PluginInstance* instance) + : Resource(instance->module()), + instance_(instance) { +} + +PPB_Flash_NetConnector_Impl::~PPB_Flash_NetConnector_Impl() { +} + +// static +const PPB_Flash_NetConnector* PPB_Flash_NetConnector_Impl::GetInterface() { + return &ppb_flash_netconnector; +} + +PPB_Flash_NetConnector_Impl* + PPB_Flash_NetConnector_Impl::AsPPB_Flash_NetConnector_Impl() { + return this; +} + +int32_t PPB_Flash_NetConnector_Impl::ConnectTcp( + const char* host, + uint16_t port, + PP_FileHandle* socket_out, + PP_Flash_NetAddress* local_addr_out, + PP_Flash_NetAddress* remote_addr_out, + PP_CompletionCallback callback) { + // |socket_out| is not optional. + if (!socket_out) + return PP_ERROR_BADARGUMENT; + + if (!callback.func) { + NOTIMPLEMENTED(); + return PP_ERROR_BADARGUMENT; + } + + if (callback_.get() && !callback_->completed()) + return PP_ERROR_INPROGRESS; + + PP_Resource resource_id = GetReferenceNoAddRef(); + if (!resource_id) { + NOTREACHED(); + return PP_ERROR_FAILED; + } + + int32_t rv = instance()->delegate()->ConnectTcp(this, host, port); + if (rv == PP_ERROR_WOULDBLOCK) { + // Record callback and output buffers. + callback_ = new TrackedCompletionCallback( + instance()->module()->GetCallbackTracker(), resource_id, callback); + socket_out_ = socket_out; + local_addr_out_ = local_addr_out; + remote_addr_out_ = remote_addr_out; + } else { + // This should never be completed synchronously successfully. + DCHECK_NE(rv, PP_OK); + } + return rv; +} + +int32_t PPB_Flash_NetConnector_Impl::ConnectTcpAddress( + const PP_Flash_NetAddress* addr, + PP_FileHandle* socket_out, + PP_Flash_NetAddress* local_addr_out, + PP_Flash_NetAddress* remote_addr_out, + PP_CompletionCallback callback) { + // |socket_out| is not optional. + if (!socket_out) + return PP_ERROR_BADARGUMENT; + + if (!callback.func) { + NOTIMPLEMENTED(); + return PP_ERROR_BADARGUMENT; + } + + if (callback_.get() && !callback_->completed()) + return PP_ERROR_INPROGRESS; + + PP_Resource resource_id = GetReferenceNoAddRef(); + if (!resource_id) { + NOTREACHED(); + return PP_ERROR_FAILED; + } + + int32_t rv = instance()->delegate()->ConnectTcpAddress(this, addr); + if (rv == PP_ERROR_WOULDBLOCK) { + // Record callback and output buffers. + callback_ = new TrackedCompletionCallback( + instance()->module()->GetCallbackTracker(), resource_id, callback); + socket_out_ = socket_out; + local_addr_out_ = local_addr_out; + remote_addr_out_ = remote_addr_out; + } else { + // This should never be completed synchronously successfully. + DCHECK_NE(rv, PP_OK); + } + return rv; +} + +void PPB_Flash_NetConnector_Impl::CompleteConnectTcp( + PP_FileHandle socket, + const PP_Flash_NetAddress& local_addr, + const PP_Flash_NetAddress& remote_addr) { + int32_t rv = PP_ERROR_ABORTED; + if (!callback_->aborted()) { + CHECK(!callback_->completed()); + + // Write output data. + *socket_out_ = socket; + if (socket != PP_kInvalidFileHandle) { + if (local_addr_out_) + *local_addr_out_ = local_addr; + if (remote_addr_out_) + *remote_addr_out_ = remote_addr; + rv = PP_OK; + } else { + rv = PP_ERROR_FAILED; + } + } + + callback_->Run(rv); // Will complete abortively if necessary. + + // Wipe everything out for safety. + callback_ = NULL; + socket_out_ = NULL; + local_addr_out_ = NULL; + remote_addr_out_ = NULL; +} + } // namespace ppapi } // namespace webkit - diff --git a/webkit/plugins/ppapi/ppb_flash_impl.h b/webkit/plugins/ppapi/ppb_flash_impl.h index 44ed224..25b20d0 100644 --- a/webkit/plugins/ppapi/ppb_flash_impl.h +++ b/webkit/plugins/ppapi/ppb_flash_impl.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// 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. @@ -6,14 +6,14 @@ #define WEBKIT_PLUGINS_PPAPI_PPB_FLASH_IMPL_H_ #include "base/basictypes.h" +#include "base/ref_counted.h" #include "build/build_config.h" #include "ppapi/c/pp_point.h" #include "ppapi/c/pp_rect.h" +#include "ppapi/c/private/ppb_flash.h" +#include "webkit/plugins/ppapi/callbacks.h" #include "webkit/plugins/ppapi/resource.h" -struct PP_FontDescription_Dev; -struct PPB_Flash; - namespace webkit { namespace ppapi { @@ -42,6 +42,52 @@ class PPB_Flash_Impl { DISALLOW_COPY_AND_ASSIGN(PPB_Flash_Impl); }; +class PPB_Flash_NetConnector_Impl : public Resource { + public: + explicit PPB_Flash_NetConnector_Impl(PluginInstance* instance); + virtual ~PPB_Flash_NetConnector_Impl(); + + static const PPB_Flash_NetConnector* GetInterface(); + + // Resource override. + virtual PPB_Flash_NetConnector_Impl* AsPPB_Flash_NetConnector_Impl(); + + PluginInstance* instance() { return instance_; } + + // PPB_Flash_NetConnector implementation. + int32_t ConnectTcp(const char* host, + uint16_t port, + PP_FileHandle* socket_out, + PP_Flash_NetAddress* local_addr_out, + PP_Flash_NetAddress* remote_addr_out, + PP_CompletionCallback callback); + int32_t ConnectTcpAddress(const PP_Flash_NetAddress* addr, + PP_FileHandle* socket_out, + PP_Flash_NetAddress* local_addr_out, + PP_Flash_NetAddress* remote_addr_out, + PP_CompletionCallback callback); + + // Called to complete |ConnectTcp()| and |ConnectTcpAddress()|. + void CompleteConnectTcp(PP_FileHandle socket, + const PP_Flash_NetAddress& local_addr, + const PP_Flash_NetAddress& remote_addr); + + private: + // Plugin instance this connector with which is associated. + PluginInstance* instance_; + + // Any pending callback (for |ConnectTcp()| or |ConnectTcpAddress()|). + scoped_refptr<TrackedCompletionCallback> callback_; + + // Output buffers to be filled in when the callback is completed successfully + // (|{local,remote}_addr_out| are optional and may be null). + PP_FileHandle* socket_out_; + PP_Flash_NetAddress* local_addr_out_; + PP_Flash_NetAddress* remote_addr_out_; + + DISALLOW_COPY_AND_ASSIGN(PPB_Flash_NetConnector_Impl); +}; + } // namespace ppapi } // namespace webkit diff --git a/webkit/plugins/ppapi/resource.h b/webkit/plugins/ppapi/resource.h index 28f19e3..d8114d0 100644 --- a/webkit/plugins/ppapi/resource.h +++ b/webkit/plugins/ppapi/resource.h @@ -26,6 +26,7 @@ namespace ppapi { F(PPB_FileIO_Impl) \ F(PPB_FileRef_Impl) \ F(PPB_FileSystem_Impl) \ + F(PPB_Flash_NetConnector_Impl) \ F(PPB_Font_Impl) \ F(PPB_Graphics2D_Impl) \ F(PPB_Graphics3D_Impl) \ |