| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/renderer/pepper_plugin_delegate_impl.h" | 5 #include "chrome/renderer/pepper_plugin_delegate_impl.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
| 10 #include "app/surface/transport_dib.h" | 10 #include "app/surface/transport_dib.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 #include "gfx/size.h" | 32 #include "gfx/size.h" |
| 33 #include "grit/locale_settings.h" | 33 #include "grit/locale_settings.h" |
| 34 #include "ipc/ipc_channel_handle.h" | 34 #include "ipc/ipc_channel_handle.h" |
| 35 #include "ppapi/c/dev/pp_video_dev.h" | 35 #include "ppapi/c/dev/pp_video_dev.h" |
| 36 #include "ppapi/proxy/host_dispatcher.h" | 36 #include "ppapi/proxy/host_dispatcher.h" |
| 37 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserCompletion.h" | 37 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserCompletion.h" |
| 38 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserParams.h" | 38 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserParams.h" |
| 39 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" | 39 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" |
| 40 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" | 40 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" |
| 41 #include "webkit/fileapi/file_system_callback_dispatcher.h" | 41 #include "webkit/fileapi/file_system_callback_dispatcher.h" |
| 42 #include "webkit/glue/plugins/pepper_file_io.h" | |
| 43 #include "webkit/glue/plugins/pepper_plugin_instance.h" | |
| 44 #include "webkit/glue/plugins/pepper_plugin_module.h" | |
| 45 #include "webkit/glue/plugins/webplugin.h" | 42 #include "webkit/glue/plugins/webplugin.h" |
| 43 #include "webkit/plugins/ppapi/ppb_file_io_impl.h" |
| 44 #include "webkit/plugins/ppapi/plugin_instance.h" |
| 45 #include "webkit/plugins/ppapi/plugin_module.h" |
| 46 | 46 |
| 47 #if defined(OS_MACOSX) | 47 #if defined(OS_MACOSX) |
| 48 #include "chrome/common/render_messages.h" | 48 #include "chrome/common/render_messages.h" |
| 49 #include "chrome/renderer/render_thread.h" | 49 #include "chrome/renderer/render_thread.h" |
| 50 #endif | 50 #endif |
| 51 | 51 |
| 52 #if defined(OS_POSIX) | 52 #if defined(OS_POSIX) |
| 53 #include "ipc/ipc_channel_posix.h" | 53 #include "ipc/ipc_channel_posix.h" |
| 54 #endif | 54 #endif |
| 55 | 55 |
| 56 using WebKit::WebView; | 56 using WebKit::WebView; |
| 57 | 57 |
| 58 namespace { | 58 namespace { |
| 59 | 59 |
| 60 const int32 kDefaultCommandBufferSize = 1024 * 1024; | 60 const int32 kDefaultCommandBufferSize = 1024 * 1024; |
| 61 | 61 |
| 62 // Implements the Image2D using a TransportDIB. | 62 // Implements the Image2D using a TransportDIB. |
| 63 class PlatformImage2DImpl : public pepper::PluginDelegate::PlatformImage2D { | 63 class PlatformImage2DImpl |
| 64 : public webkit::plugins::ppapi::PluginDelegate::PlatformImage2D { |
| 64 public: | 65 public: |
| 65 // This constructor will take ownership of the dib pointer. | 66 // This constructor will take ownership of the dib pointer. |
| 66 PlatformImage2DImpl(int width, int height, TransportDIB* dib) | 67 PlatformImage2DImpl(int width, int height, TransportDIB* dib) |
| 67 : width_(width), | 68 : width_(width), |
| 68 height_(height), | 69 height_(height), |
| 69 dib_(dib) { | 70 dib_(dib) { |
| 70 } | 71 } |
| 71 | 72 |
| 72 virtual skia::PlatformCanvas* Map() { | 73 virtual skia::PlatformCanvas* Map() { |
| 73 return dib_->GetPlatformCanvas(width_, height_); | 74 return dib_->GetPlatformCanvas(width_, height_); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 91 private: | 92 private: |
| 92 int width_; | 93 int width_; |
| 93 int height_; | 94 int height_; |
| 94 scoped_ptr<TransportDIB> dib_; | 95 scoped_ptr<TransportDIB> dib_; |
| 95 | 96 |
| 96 DISALLOW_COPY_AND_ASSIGN(PlatformImage2DImpl); | 97 DISALLOW_COPY_AND_ASSIGN(PlatformImage2DImpl); |
| 97 }; | 98 }; |
| 98 | 99 |
| 99 #ifdef ENABLE_GPU | 100 #ifdef ENABLE_GPU |
| 100 | 101 |
| 101 class PlatformContext3DImpl : public pepper::PluginDelegate::PlatformContext3D { | 102 class PlatformContext3DImpl |
| 103 : public webkit::plugins::ppapi::PluginDelegate::PlatformContext3D { |
| 102 public: | 104 public: |
| 103 explicit PlatformContext3DImpl(WebKit::WebView* web_view) | 105 explicit PlatformContext3DImpl(WebKit::WebView* web_view) |
| 104 : web_view_(web_view), | 106 : web_view_(web_view), |
| 105 context_(NULL) { | 107 context_(NULL) { |
| 106 } | 108 } |
| 107 | 109 |
| 108 virtual ~PlatformContext3DImpl() { | 110 virtual ~PlatformContext3DImpl() { |
| 109 if (context_) { | 111 if (context_) { |
| 110 ggl::DestroyContext(context_); | 112 ggl::DestroyContext(context_); |
| 111 context_ = NULL; | 113 context_ = NULL; |
| 112 } | 114 } |
| 113 } | 115 } |
| 114 | 116 |
| 115 virtual bool Init(); | 117 virtual bool Init(); |
| 116 virtual bool SwapBuffers(); | 118 virtual bool SwapBuffers(); |
| 117 virtual unsigned GetError(); | 119 virtual unsigned GetError(); |
| 118 virtual void SetSwapBuffersCallback(Callback0::Type* callback); | 120 virtual void SetSwapBuffersCallback(Callback0::Type* callback); |
| 119 void ResizeBackingTexture(const gfx::Size& size); | 121 void ResizeBackingTexture(const gfx::Size& size); |
| 120 virtual unsigned GetBackingTextureId(); | 122 virtual unsigned GetBackingTextureId(); |
| 121 virtual gpu::gles2::GLES2Implementation* GetGLES2Implementation(); | 123 virtual gpu::gles2::GLES2Implementation* GetGLES2Implementation(); |
| 122 | 124 |
| 123 private: | 125 private: |
| 124 WebKit::WebView* web_view_; | 126 WebKit::WebView* web_view_; |
| 125 ggl::Context* context_; | 127 ggl::Context* context_; |
| 126 }; | 128 }; |
| 127 | 129 |
| 128 #endif // ENABLE_GPU | 130 #endif // ENABLE_GPU |
| 129 | 131 |
| 130 class PlatformAudioImpl | 132 class PlatformAudioImpl |
| 131 : public pepper::PluginDelegate::PlatformAudio, | 133 : public webkit::plugins::ppapi::PluginDelegate::PlatformAudio, |
| 132 public AudioMessageFilter::Delegate, | 134 public AudioMessageFilter::Delegate, |
| 133 public base::RefCountedThreadSafe<PlatformAudioImpl> { | 135 public base::RefCountedThreadSafe<PlatformAudioImpl> { |
| 134 public: | 136 public: |
| 135 explicit PlatformAudioImpl(scoped_refptr<AudioMessageFilter> filter) | 137 explicit PlatformAudioImpl(scoped_refptr<AudioMessageFilter> filter) |
| 136 : client_(NULL), filter_(filter), stream_id_(0), | 138 : client_(NULL), filter_(filter), stream_id_(0), |
| 137 main_message_loop_(MessageLoop::current()) { | 139 main_message_loop_(MessageLoop::current()) { |
| 138 DCHECK(filter_); | 140 DCHECK(filter_); |
| 139 } | 141 } |
| 140 | 142 |
| 141 virtual ~PlatformAudioImpl() { | 143 virtual ~PlatformAudioImpl() { |
| 142 // Make sure we have been shut down. | 144 // Make sure we have been shut down. |
| 143 DCHECK_EQ(0, stream_id_); | 145 DCHECK_EQ(0, stream_id_); |
| 144 DCHECK(!client_); | 146 DCHECK(!client_); |
| 145 } | 147 } |
| 146 | 148 |
| 147 // Initialize this audio context. StreamCreated() will be called when the | 149 // Initialize this audio context. StreamCreated() will be called when the |
| 148 // stream is created. | 150 // stream is created. |
| 149 bool Initialize(uint32_t sample_rate, uint32_t sample_count, | 151 bool Initialize(uint32_t sample_rate, uint32_t sample_count, |
| 150 pepper::PluginDelegate::PlatformAudio::Client* client); | 152 webkit::plugins::ppapi::PluginDelegate::PlatformAudio::Client* client); |
| 151 | 153 |
| 152 virtual bool StartPlayback() { | 154 virtual bool StartPlayback() { |
| 153 return filter_ && filter_->Send( | 155 return filter_ && filter_->Send( |
| 154 new ViewHostMsg_PlayAudioStream(0, stream_id_)); | 156 new ViewHostMsg_PlayAudioStream(0, stream_id_)); |
| 155 } | 157 } |
| 156 | 158 |
| 157 virtual bool StopPlayback() { | 159 virtual bool StopPlayback() { |
| 158 return filter_ && filter_->Send( | 160 return filter_ && filter_->Send( |
| 159 new ViewHostMsg_PauseAudioStream(0, stream_id_)); | 161 new ViewHostMsg_PauseAudioStream(0, stream_id_)); |
| 160 } | 162 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 172 LOG(FATAL) << "Should never get OnCreated in PlatformAudioImpl"; | 174 LOG(FATAL) << "Should never get OnCreated in PlatformAudioImpl"; |
| 173 } | 175 } |
| 174 | 176 |
| 175 virtual void OnLowLatencyCreated(base::SharedMemoryHandle handle, | 177 virtual void OnLowLatencyCreated(base::SharedMemoryHandle handle, |
| 176 base::SyncSocket::Handle socket_handle, | 178 base::SyncSocket::Handle socket_handle, |
| 177 uint32 length); | 179 uint32 length); |
| 178 | 180 |
| 179 virtual void OnVolume(double volume) { } | 181 virtual void OnVolume(double volume) { } |
| 180 | 182 |
| 181 // The client to notify when the stream is created. | 183 // The client to notify when the stream is created. |
| 182 pepper::PluginDelegate::PlatformAudio::Client* client_; | 184 webkit::plugins::ppapi::PluginDelegate::PlatformAudio::Client* client_; |
| 183 // MessageFilter used to send/receive IPC. | 185 // MessageFilter used to send/receive IPC. |
| 184 scoped_refptr<AudioMessageFilter> filter_; | 186 scoped_refptr<AudioMessageFilter> filter_; |
| 185 // Our ID on the MessageFilter. | 187 // Our ID on the MessageFilter. |
| 186 int32 stream_id_; | 188 int32 stream_id_; |
| 187 | 189 |
| 188 MessageLoop* main_message_loop_; | 190 MessageLoop* main_message_loop_; |
| 189 | 191 |
| 190 DISALLOW_COPY_AND_ASSIGN(PlatformAudioImpl); | 192 DISALLOW_COPY_AND_ASSIGN(PlatformAudioImpl); |
| 191 }; | 193 }; |
| 192 | 194 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 gpu::gles2::GLES2Implementation* | 270 gpu::gles2::GLES2Implementation* |
| 269 PlatformContext3DImpl::GetGLES2Implementation() { | 271 PlatformContext3DImpl::GetGLES2Implementation() { |
| 270 DCHECK(context_); | 272 DCHECK(context_); |
| 271 return ggl::GetImplementation(context_); | 273 return ggl::GetImplementation(context_); |
| 272 } | 274 } |
| 273 | 275 |
| 274 #endif // ENABLE_GPU | 276 #endif // ENABLE_GPU |
| 275 | 277 |
| 276 bool PlatformAudioImpl::Initialize( | 278 bool PlatformAudioImpl::Initialize( |
| 277 uint32_t sample_rate, uint32_t sample_count, | 279 uint32_t sample_rate, uint32_t sample_count, |
| 278 pepper::PluginDelegate::PlatformAudio::Client* client) { | 280 webkit::plugins::ppapi::PluginDelegate::PlatformAudio::Client* client) { |
| 279 | 281 |
| 280 DCHECK(client); | 282 DCHECK(client); |
| 281 // Make sure we don't call init more than once. | 283 // Make sure we don't call init more than once. |
| 282 DCHECK_EQ(0, stream_id_); | 284 DCHECK_EQ(0, stream_id_); |
| 283 | 285 |
| 284 client_ = client; | 286 client_ = client; |
| 285 | 287 |
| 286 ViewHostMsg_Audio_CreateStream_Params params; | 288 ViewHostMsg_Audio_CreateStream_Params params; |
| 287 params.params.format = AudioParameters::AUDIO_PCM_LINEAR; | 289 params.params.format = AudioParameters::AUDIO_PCM_LINEAR; |
| 288 params.params.channels = 2; | 290 params.params.channels = 2; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 stream_id_ = 0; | 330 stream_id_ = 0; |
| 329 client_ = NULL; | 331 client_ = NULL; |
| 330 | 332 |
| 331 // Release on the IO thread so that we avoid race problems with | 333 // Release on the IO thread so that we avoid race problems with |
| 332 // OnLowLatencyCreated. | 334 // OnLowLatencyCreated. |
| 333 filter_->message_loop()->ReleaseSoon(FROM_HERE, this); | 335 filter_->message_loop()->ReleaseSoon(FROM_HERE, this); |
| 334 } | 336 } |
| 335 | 337 |
| 336 // Implements the VideoDecoder. | 338 // Implements the VideoDecoder. |
| 337 class PlatformVideoDecoderImpl | 339 class PlatformVideoDecoderImpl |
| 338 : public pepper::PluginDelegate::PlatformVideoDecoder { | 340 : public webkit::plugins::ppapi::PluginDelegate::PlatformVideoDecoder { |
| 339 public: | 341 public: |
| 340 PlatformVideoDecoderImpl() | 342 PlatformVideoDecoderImpl() |
| 341 : input_buffer_size_(0), | 343 : input_buffer_size_(0), |
| 342 next_dib_id_(0), | 344 next_dib_id_(0), |
| 343 dib_(NULL) { | 345 dib_(NULL) { |
| 344 memset(&decoder_config_, 0, sizeof(decoder_config_)); | 346 memset(&decoder_config_, 0, sizeof(decoder_config_)); |
| 345 memset(&flush_callback_, 0, sizeof(flush_callback_)); | 347 memset(&flush_callback_, 0, sizeof(flush_callback_)); |
| 346 } | 348 } |
| 347 | 349 |
| 348 virtual bool Init(const PP_VideoDecoderConfig_Dev& decoder_config) { | 350 virtual bool Init(const PP_VideoDecoderConfig_Dev& decoder_config) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 size_t input_buffer_size_; | 414 size_t input_buffer_size_; |
| 413 int next_dib_id_; | 415 int next_dib_id_; |
| 414 scoped_ptr<TransportDIB> dib_; | 416 scoped_ptr<TransportDIB> dib_; |
| 415 PP_VideoDecoderConfig_Dev decoder_config_; | 417 PP_VideoDecoderConfig_Dev decoder_config_; |
| 416 std::queue<PP_VideoCompressedDataBuffer_Dev*> input_buffers_; | 418 std::queue<PP_VideoCompressedDataBuffer_Dev*> input_buffers_; |
| 417 PP_CompletionCallback flush_callback_; | 419 PP_CompletionCallback flush_callback_; |
| 418 | 420 |
| 419 DISALLOW_COPY_AND_ASSIGN(PlatformVideoDecoderImpl); | 421 DISALLOW_COPY_AND_ASSIGN(PlatformVideoDecoderImpl); |
| 420 }; | 422 }; |
| 421 | 423 |
| 422 class DispatcherWrapper : public pepper::PluginDelegate::OutOfProcessProxy { | 424 class DispatcherWrapper |
| 425 : public webkit::plugins::ppapi::PluginDelegate::OutOfProcessProxy { |
| 423 public: | 426 public: |
| 424 DispatcherWrapper() {} | 427 DispatcherWrapper() {} |
| 425 virtual ~DispatcherWrapper() {} | 428 virtual ~DispatcherWrapper() {} |
| 426 | 429 |
| 427 bool Init(base::ProcessHandle plugin_process_handle, | 430 bool Init(base::ProcessHandle plugin_process_handle, |
| 428 IPC::ChannelHandle channel_handle, | 431 IPC::ChannelHandle channel_handle, |
| 429 PP_Module pp_module, | 432 PP_Module pp_module, |
| 430 pp::proxy::Dispatcher::GetInterfaceFunc local_get_interface); | 433 pp::proxy::Dispatcher::GetInterfaceFunc local_get_interface); |
| 431 | 434 |
| 432 // OutOfProcessProxy implementation. | 435 // OutOfProcessProxy implementation. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 } // namespace | 473 } // namespace |
| 471 | 474 |
| 472 PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderView* render_view) | 475 PepperPluginDelegateImpl::PepperPluginDelegateImpl(RenderView* render_view) |
| 473 : render_view_(render_view), | 476 : render_view_(render_view), |
| 474 id_generator_(0) { | 477 id_generator_(0) { |
| 475 } | 478 } |
| 476 | 479 |
| 477 PepperPluginDelegateImpl::~PepperPluginDelegateImpl() { | 480 PepperPluginDelegateImpl::~PepperPluginDelegateImpl() { |
| 478 } | 481 } |
| 479 | 482 |
| 480 scoped_refptr<pepper::PluginModule> | 483 scoped_refptr<webkit::plugins::ppapi::PluginModule> |
| 481 PepperPluginDelegateImpl::CreatePepperPlugin(const FilePath& path) { | 484 PepperPluginDelegateImpl::CreatePepperPlugin(const FilePath& path) { |
| 482 // Easy case is in-process plugins. | 485 // Easy case is in-process plugins. |
| 483 if (!PepperPluginRegistry::GetInstance()->RunOutOfProcessForPlugin(path)) | 486 if (!PepperPluginRegistry::GetInstance()->RunOutOfProcessForPlugin(path)) |
| 484 return PepperPluginRegistry::GetInstance()->GetModule(path); | 487 return PepperPluginRegistry::GetInstance()->GetModule(path); |
| 485 | 488 |
| 486 // Out of process: have the browser start the plugin process for us. | 489 // Out of process: have the browser start the plugin process for us. |
| 487 base::ProcessHandle plugin_process_handle = NULL; | 490 base::ProcessHandle plugin_process_handle = NULL; |
| 488 IPC::ChannelHandle channel_handle; | 491 IPC::ChannelHandle channel_handle; |
| 489 render_view_->Send(new ViewHostMsg_OpenChannelToPepperPlugin( | 492 render_view_->Send(new ViewHostMsg_OpenChannelToPepperPlugin( |
| 490 path, &plugin_process_handle, &channel_handle)); | 493 path, &plugin_process_handle, &channel_handle)); |
| 491 if (channel_handle.name.empty()) | 494 if (channel_handle.name.empty()) |
| 492 return scoped_refptr<pepper::PluginModule>(); // Couldn't be initialized. | 495 return scoped_refptr<webkit::plugins::ppapi::PluginModule>(); // Couldn't b
e initialized. |
| 493 | 496 |
| 494 // Create a new HostDispatcher for the proxying, and hook it to a new | 497 // Create a new HostDispatcher for the proxying, and hook it to a new |
| 495 // PluginModule. | 498 // PluginModule. |
| 496 scoped_refptr<pepper::PluginModule> module(new pepper::PluginModule); | 499 scoped_refptr<webkit::plugins::ppapi::PluginModule> module( |
| 500 new webkit::plugins::ppapi::PluginModule); |
| 497 scoped_ptr<DispatcherWrapper> dispatcher(new DispatcherWrapper); | 501 scoped_ptr<DispatcherWrapper> dispatcher(new DispatcherWrapper); |
| 498 if (!dispatcher->Init(plugin_process_handle, channel_handle, | 502 if (!dispatcher->Init( |
| 499 module->pp_module(), | 503 plugin_process_handle, channel_handle, |
| 500 pepper::PluginModule::GetLocalGetInterfaceFunc())) | 504 module->pp_module(), |
| 501 return scoped_refptr<pepper::PluginModule>(); | 505 webkit::plugins::ppapi::PluginModule::GetLocalGetInterfaceFunc())) |
| 506 return scoped_refptr<webkit::plugins::ppapi::PluginModule>(); |
| 502 module->InitAsProxied(dispatcher.release()); | 507 module->InitAsProxied(dispatcher.release()); |
| 503 return module; | 508 return module; |
| 504 } | 509 } |
| 505 | 510 |
| 506 void PepperPluginDelegateImpl::ViewInitiatedPaint() { | 511 void PepperPluginDelegateImpl::ViewInitiatedPaint() { |
| 507 // Notify all of our instances that we started painting. This is used for | 512 // Notify all of our instances that we started painting. This is used for |
| 508 // internal bookkeeping only, so we know that the set can not change under | 513 // internal bookkeeping only, so we know that the set can not change under |
| 509 // us. | 514 // us. |
| 510 for (std::set<pepper::PluginInstance*>::iterator i = | 515 for (std::set<webkit::plugins::ppapi::PluginInstance*>::iterator i = |
| 511 active_instances_.begin(); | 516 active_instances_.begin(); |
| 512 i != active_instances_.end(); ++i) | 517 i != active_instances_.end(); ++i) |
| 513 (*i)->ViewInitiatedPaint(); | 518 (*i)->ViewInitiatedPaint(); |
| 514 } | 519 } |
| 515 | 520 |
| 516 void PepperPluginDelegateImpl::ViewFlushedPaint() { | 521 void PepperPluginDelegateImpl::ViewFlushedPaint() { |
| 517 // Notify all instances that we painted. This will call into the plugin, and | 522 // Notify all instances that we painted. This will call into the plugin, and |
| 518 // we it may ask to close itself as a result. This will, in turn, modify our | 523 // we it may ask to close itself as a result. This will, in turn, modify our |
| 519 // set, possibly invalidating the iterator. So we iterate on a copy that | 524 // set, possibly invalidating the iterator. So we iterate on a copy that |
| 520 // won't change out from under us. | 525 // won't change out from under us. |
| 521 std::set<pepper::PluginInstance*> plugins = active_instances_; | 526 std::set<webkit::plugins::ppapi::PluginInstance*> plugins = active_instances_; |
| 522 for (std::set<pepper::PluginInstance*>::iterator i = plugins.begin(); | 527 for (std::set<webkit::plugins::ppapi::PluginInstance*>::iterator i = plugins.b
egin(); |
| 523 i != plugins.end(); ++i) { | 528 i != plugins.end(); ++i) { |
| 524 // The copy above makes sure our iterator is never invalid if some plugins | 529 // The copy above makes sure our iterator is never invalid if some plugins |
| 525 // are destroyed. But some plugin may decide to close all of its views in | 530 // are destroyed. But some plugin may decide to close all of its views in |
| 526 // response to a paint in one of them, so we need to make sure each one is | 531 // response to a paint in one of them, so we need to make sure each one is |
| 527 // still "current" before using it. | 532 // still "current" before using it. |
| 528 // | 533 // |
| 529 // It's possible that a plugin was destroyed, but another one was created | 534 // It's possible that a plugin was destroyed, but another one was created |
| 530 // with the same address. In this case, we'll call ViewFlushedPaint on that | 535 // with the same address. In this case, we'll call ViewFlushedPaint on that |
| 531 // new plugin. But that's OK for this particular case since we're just | 536 // new plugin. But that's OK for this particular case since we're just |
| 532 // notifying all of our instances that the view flushed, and the new one is | 537 // notifying all of our instances that the view flushed, and the new one is |
| 533 // one of our instances. | 538 // one of our instances. |
| 534 // | 539 // |
| 535 // What about the case where a new one is created in a callback at a new | 540 // What about the case where a new one is created in a callback at a new |
| 536 // address and we don't issue the callback? We're still OK since this | 541 // address and we don't issue the callback? We're still OK since this |
| 537 // callback is used for flush callbacks and we could not have possibly | 542 // callback is used for flush callbacks and we could not have possibly |
| 538 // started a new paint (ViewInitiatedPaint) for the new plugin while | 543 // started a new paint (ViewInitiatedPaint) for the new plugin while |
| 539 // processing a previous paint for an existing one. | 544 // processing a previous paint for an existing one. |
| 540 if (active_instances_.find(*i) != active_instances_.end()) | 545 if (active_instances_.find(*i) != active_instances_.end()) |
| 541 (*i)->ViewFlushedPaint(); | 546 (*i)->ViewFlushedPaint(); |
| 542 } | 547 } |
| 543 } | 548 } |
| 544 | 549 |
| 545 bool PepperPluginDelegateImpl::GetBitmapForOptimizedPluginPaint( | 550 bool PepperPluginDelegateImpl::GetBitmapForOptimizedPluginPaint( |
| 546 const gfx::Rect& paint_bounds, | 551 const gfx::Rect& paint_bounds, |
| 547 TransportDIB** dib, | 552 TransportDIB** dib, |
| 548 gfx::Rect* location, | 553 gfx::Rect* location, |
| 549 gfx::Rect* clip) { | 554 gfx::Rect* clip) { |
| 550 for (std::set<pepper::PluginInstance*>::iterator i = | 555 for (std::set<webkit::plugins::ppapi::PluginInstance*>::iterator i = |
| 551 active_instances_.begin(); | 556 active_instances_.begin(); |
| 552 i != active_instances_.end(); ++i) { | 557 i != active_instances_.end(); ++i) { |
| 553 pepper::PluginInstance* instance = *i; | 558 webkit::plugins::ppapi::PluginInstance* instance = *i; |
| 554 if (instance->GetBitmapForOptimizedPluginPaint( | 559 if (instance->GetBitmapForOptimizedPluginPaint( |
| 555 paint_bounds, dib, location, clip)) | 560 paint_bounds, dib, location, clip)) |
| 556 return true; | 561 return true; |
| 557 } | 562 } |
| 558 return false; | 563 return false; |
| 559 } | 564 } |
| 560 | 565 |
| 561 void PepperPluginDelegateImpl::InstanceCreated( | 566 void PepperPluginDelegateImpl::InstanceCreated( |
| 562 pepper::PluginInstance* instance) { | 567 webkit::plugins::ppapi::PluginInstance* instance) { |
| 563 active_instances_.insert(instance); | 568 active_instances_.insert(instance); |
| 564 | 569 |
| 565 // Set the initial focus. | 570 // Set the initial focus. |
| 566 instance->SetContentAreaFocus(render_view_->has_focus()); | 571 instance->SetContentAreaFocus(render_view_->has_focus()); |
| 567 } | 572 } |
| 568 | 573 |
| 569 void PepperPluginDelegateImpl::InstanceDeleted( | 574 void PepperPluginDelegateImpl::InstanceDeleted( |
| 570 pepper::PluginInstance* instance) { | 575 webkit::plugins::ppapi::PluginInstance* instance) { |
| 571 active_instances_.erase(instance); | 576 active_instances_.erase(instance); |
| 572 } | 577 } |
| 573 | 578 |
| 574 pepper::PluginDelegate::PlatformImage2D* | 579 webkit::plugins::ppapi::PluginDelegate::PlatformImage2D* |
| 575 PepperPluginDelegateImpl::CreateImage2D(int width, int height) { | 580 PepperPluginDelegateImpl::CreateImage2D(int width, int height) { |
| 576 uint32 buffer_size = width * height * 4; | 581 uint32 buffer_size = width * height * 4; |
| 577 | 582 |
| 578 // Allocate the transport DIB and the PlatformCanvas pointing to it. | 583 // Allocate the transport DIB and the PlatformCanvas pointing to it. |
| 579 #if defined(OS_MACOSX) | 584 #if defined(OS_MACOSX) |
| 580 // On the Mac, shared memory has to be created in the browser in order to | 585 // On the Mac, shared memory has to be created in the browser in order to |
| 581 // work in the sandbox. Do this by sending a message to the browser | 586 // work in the sandbox. Do this by sending a message to the browser |
| 582 // requesting a TransportDIB (see also | 587 // requesting a TransportDIB (see also |
| 583 // chrome/renderer/webplugin_delegate_proxy.cc, method | 588 // chrome/renderer/webplugin_delegate_proxy.cc, method |
| 584 // WebPluginDelegateProxy::CreateBitmap() for similar code). Note that the | 589 // WebPluginDelegateProxy::CreateBitmap() for similar code). Note that the |
| (...skipping 15 matching lines...) Expand all Loading... |
| 600 #else | 605 #else |
| 601 static int next_dib_id = 0; | 606 static int next_dib_id = 0; |
| 602 TransportDIB* dib = TransportDIB::Create(buffer_size, next_dib_id++); | 607 TransportDIB* dib = TransportDIB::Create(buffer_size, next_dib_id++); |
| 603 if (!dib) | 608 if (!dib) |
| 604 return NULL; | 609 return NULL; |
| 605 #endif | 610 #endif |
| 606 | 611 |
| 607 return new PlatformImage2DImpl(width, height, dib); | 612 return new PlatformImage2DImpl(width, height, dib); |
| 608 } | 613 } |
| 609 | 614 |
| 610 pepper::PluginDelegate::PlatformContext3D* | 615 webkit::plugins::ppapi::PluginDelegate::PlatformContext3D* |
| 611 PepperPluginDelegateImpl::CreateContext3D() { | 616 PepperPluginDelegateImpl::CreateContext3D() { |
| 612 #ifdef ENABLE_GPU | 617 #ifdef ENABLE_GPU |
| 613 return new PlatformContext3DImpl(render_view_->webview()); | 618 return new PlatformContext3DImpl(render_view_->webview()); |
| 614 #else | 619 #else |
| 615 return NULL; | 620 return NULL; |
| 616 #endif | 621 #endif |
| 617 } | 622 } |
| 618 | 623 |
| 619 pepper::PluginDelegate::PlatformVideoDecoder* | 624 webkit::plugins::ppapi::PluginDelegate::PlatformVideoDecoder* |
| 620 PepperPluginDelegateImpl::CreateVideoDecoder( | 625 PepperPluginDelegateImpl::CreateVideoDecoder( |
| 621 const PP_VideoDecoderConfig_Dev& decoder_config) { | 626 const PP_VideoDecoderConfig_Dev& decoder_config) { |
| 622 scoped_ptr<PlatformVideoDecoderImpl> decoder(new PlatformVideoDecoderImpl()); | 627 scoped_ptr<PlatformVideoDecoderImpl> decoder(new PlatformVideoDecoderImpl()); |
| 623 | 628 |
| 624 if (!decoder->Init(decoder_config)) | 629 if (!decoder->Init(decoder_config)) |
| 625 return NULL; | 630 return NULL; |
| 626 | 631 |
| 627 return decoder.release(); | 632 return decoder.release(); |
| 628 } | 633 } |
| 629 | 634 |
| 630 void PepperPluginDelegateImpl::NumberOfFindResultsChanged(int identifier, | 635 void PepperPluginDelegateImpl::NumberOfFindResultsChanged(int identifier, |
| 631 int total, | 636 int total, |
| 632 bool final_result) { | 637 bool final_result) { |
| 633 render_view_->reportFindInPageMatchCount(identifier, total, final_result); | 638 render_view_->reportFindInPageMatchCount(identifier, total, final_result); |
| 634 } | 639 } |
| 635 | 640 |
| 636 void PepperPluginDelegateImpl::SelectedFindResultChanged(int identifier, | 641 void PepperPluginDelegateImpl::SelectedFindResultChanged(int identifier, |
| 637 int index) { | 642 int index) { |
| 638 render_view_->reportFindInPageSelection( | 643 render_view_->reportFindInPageSelection( |
| 639 identifier, index + 1, WebKit::WebRect()); | 644 identifier, index + 1, WebKit::WebRect()); |
| 640 } | 645 } |
| 641 | 646 |
| 642 pepper::PluginDelegate::PlatformAudio* PepperPluginDelegateImpl::CreateAudio( | 647 webkit::plugins::ppapi::PluginDelegate::PlatformAudio* |
| 648 PepperPluginDelegateImpl::CreateAudio( |
| 643 uint32_t sample_rate, uint32_t sample_count, | 649 uint32_t sample_rate, uint32_t sample_count, |
| 644 pepper::PluginDelegate::PlatformAudio::Client* client) { | 650 webkit::plugins::ppapi::PluginDelegate::PlatformAudio::Client* client) { |
| 645 scoped_refptr<PlatformAudioImpl> audio( | 651 scoped_refptr<PlatformAudioImpl> audio( |
| 646 new PlatformAudioImpl(render_view_->audio_message_filter())); | 652 new PlatformAudioImpl(render_view_->audio_message_filter())); |
| 647 if (audio->Initialize(sample_rate, sample_count, client)) { | 653 if (audio->Initialize(sample_rate, sample_count, client)) { |
| 648 | 654 |
| 649 // Also note ReleaseSoon invoked in PlatformAudioImpl::ShutDown(). | 655 // Also note ReleaseSoon invoked in PlatformAudioImpl::ShutDown(). |
| 650 return audio.release(); | 656 return audio.release(); |
| 651 } else { | 657 } else { |
| 652 return NULL; | 658 return NULL; |
| 653 } | 659 } |
| 654 } | 660 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 676 int message_id) { | 682 int message_id) { |
| 677 AsyncOpenFileCallback* callback = | 683 AsyncOpenFileCallback* callback = |
| 678 messages_waiting_replies_.Lookup(message_id); | 684 messages_waiting_replies_.Lookup(message_id); |
| 679 DCHECK(callback); | 685 DCHECK(callback); |
| 680 messages_waiting_replies_.Remove(message_id); | 686 messages_waiting_replies_.Remove(message_id); |
| 681 callback->Run(error_code, file); | 687 callback->Run(error_code, file); |
| 682 delete callback; | 688 delete callback; |
| 683 } | 689 } |
| 684 | 690 |
| 685 void PepperPluginDelegateImpl::OnSetFocus(bool has_focus) { | 691 void PepperPluginDelegateImpl::OnSetFocus(bool has_focus) { |
| 686 for (std::set<pepper::PluginInstance*>::iterator i = | 692 for (std::set<webkit::plugins::ppapi::PluginInstance*>::iterator i = |
| 687 active_instances_.begin(); | 693 active_instances_.begin(); |
| 688 i != active_instances_.end(); ++i) | 694 i != active_instances_.end(); ++i) |
| 689 (*i)->SetContentAreaFocus(has_focus); | 695 (*i)->SetContentAreaFocus(has_focus); |
| 690 } | 696 } |
| 691 | 697 |
| 692 bool PepperPluginDelegateImpl::OpenFileSystem( | 698 bool PepperPluginDelegateImpl::OpenFileSystem( |
| 693 const GURL& url, | 699 const GURL& url, |
| 694 fileapi::FileSystemType type, | 700 fileapi::FileSystemType type, |
| 695 long long size, | 701 long long size, |
| 696 fileapi::FileSystemCallbackDispatcher* dispatcher) { | 702 fileapi::FileSystemCallbackDispatcher* dispatcher) { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 849 base::PlatformFileError error; | 855 base::PlatformFileError error; |
| 850 IPC::Message* msg = new ViewHostMsg_PepperQueryFile(full_path, info, &error); | 856 IPC::Message* msg = new ViewHostMsg_PepperQueryFile(full_path, info, &error); |
| 851 if (!render_view_->Send(msg)) { | 857 if (!render_view_->Send(msg)) { |
| 852 return base::PLATFORM_FILE_ERROR_FAILED; | 858 return base::PLATFORM_FILE_ERROR_FAILED; |
| 853 } | 859 } |
| 854 return error; | 860 return error; |
| 855 } | 861 } |
| 856 base::PlatformFileError PepperPluginDelegateImpl::GetModuleLocalDirContents( | 862 base::PlatformFileError PepperPluginDelegateImpl::GetModuleLocalDirContents( |
| 857 const std::string& module_name, | 863 const std::string& module_name, |
| 858 const FilePath& path, | 864 const FilePath& path, |
| 859 PepperDirContents* contents) { | 865 webkit::plugins::ppapi::DirContents* contents) { |
| 860 FilePath full_path = GetModuleLocalFilePath(module_name, path); | 866 FilePath full_path = GetModuleLocalFilePath(module_name, path); |
| 861 if (full_path.empty()) { | 867 if (full_path.empty()) { |
| 862 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED; | 868 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED; |
| 863 } | 869 } |
| 864 base::PlatformFileError error; | 870 base::PlatformFileError error; |
| 865 IPC::Message* msg = | 871 IPC::Message* msg = |
| 866 new ViewHostMsg_PepperGetDirContents(full_path, contents, &error); | 872 new ViewHostMsg_PepperGetDirContents(full_path, contents, &error); |
| 867 if (!render_view_->Send(msg)) { | 873 if (!render_view_->Send(msg)) { |
| 868 return base::PLATFORM_FILE_ERROR_FAILED; | 874 return base::PLATFORM_FILE_ERROR_FAILED; |
| 869 } | 875 } |
| 870 return error; | 876 return error; |
| 871 } | 877 } |
| 872 | 878 |
| 873 scoped_refptr<base::MessageLoopProxy> | 879 scoped_refptr<base::MessageLoopProxy> |
| 874 PepperPluginDelegateImpl::GetFileThreadMessageLoopProxy() { | 880 PepperPluginDelegateImpl::GetFileThreadMessageLoopProxy() { |
| 875 return RenderThread::current()->GetFileThreadMessageLoopProxy(); | 881 return RenderThread::current()->GetFileThreadMessageLoopProxy(); |
| 876 } | 882 } |
| 877 | 883 |
| 878 pepper::FullscreenContainer* | 884 webkit::plugins::ppapi::FullscreenContainer* |
| 879 PepperPluginDelegateImpl::CreateFullscreenContainer( | 885 PepperPluginDelegateImpl::CreateFullscreenContainer( |
| 880 pepper::PluginInstance* instance) { | 886 webkit::plugins::ppapi::PluginInstance* instance) { |
| 881 return render_view_->CreatePepperFullscreenContainer(instance); | 887 return render_view_->CreatePepperFullscreenContainer(instance); |
| 882 } | 888 } |
| 883 | 889 |
| 884 std::string PepperPluginDelegateImpl::GetDefaultEncoding() { | 890 std::string PepperPluginDelegateImpl::GetDefaultEncoding() { |
| 885 // TODO(brettw) bug 56615: Somehow get the preference for the default | 891 // TODO(brettw) bug 56615: Somehow get the preference for the default |
| 886 // encoding here rather than using the global default for the UI language. | 892 // encoding here rather than using the global default for the UI language. |
| 887 return l10n_util::GetStringUTF8(IDS_DEFAULT_ENCODING); | 893 return l10n_util::GetStringUTF8(IDS_DEFAULT_ENCODING); |
| 888 } | 894 } |
| 889 | 895 |
| 890 void PepperPluginDelegateImpl::ZoomLimitsChanged(double minimum_factor, | 896 void PepperPluginDelegateImpl::ZoomLimitsChanged(double minimum_factor, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 908 } | 914 } |
| 909 | 915 |
| 910 void PepperPluginDelegateImpl::DidStopLoading() { | 916 void PepperPluginDelegateImpl::DidStopLoading() { |
| 911 render_view_->DidStopLoadingForPlugin(); | 917 render_view_->DidStopLoadingForPlugin(); |
| 912 } | 918 } |
| 913 | 919 |
| 914 void PepperPluginDelegateImpl::SetContentRestriction(int restrictions) { | 920 void PepperPluginDelegateImpl::SetContentRestriction(int restrictions) { |
| 915 render_view_->Send(new ViewHostMsg_UpdateContentRestrictions( | 921 render_view_->Send(new ViewHostMsg_UpdateContentRestrictions( |
| 916 render_view_->routing_id(), restrictions)); | 922 render_view_->routing_id(), restrictions)); |
| 917 } | 923 } |
| OLD | NEW |