| 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 <cmath> | 5 #include <cmath> |
| 6 | 6 |
| 7 #include "chrome/renderer/pepper_plugin_delegate_impl.h" | 7 #include "chrome/renderer/pepper_plugin_delegate_impl.h" |
| 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" |
| 11 #include "base/callback.h" |
| 11 #include "base/file_path.h" | 12 #include "base/file_path.h" |
| 12 #include "base/logging.h" | 13 #include "base/logging.h" |
| 13 #include "base/scoped_ptr.h" | 14 #include "base/scoped_ptr.h" |
| 14 #include "base/string_split.h" | 15 #include "base/string_split.h" |
| 15 #include "base/task.h" | 16 #include "base/task.h" |
| 16 #include "base/time.h" | 17 #include "base/time.h" |
| 17 #include "base/utf_string_conversions.h" | 18 #include "base/utf_string_conversions.h" |
| 18 #include "chrome/common/child_thread.h" | 19 #include "chrome/common/child_thread.h" |
| 19 #include "chrome/common/file_system/file_system_dispatcher.h" | 20 #include "chrome/common/file_system/file_system_dispatcher.h" |
| 20 #include "chrome/common/render_messages.h" | 21 #include "chrome/common/render_messages.h" |
| 21 #include "chrome/common/render_messages_params.h" | 22 #include "chrome/common/render_messages_params.h" |
| 22 #include "chrome/renderer/audio_message_filter.h" | 23 #include "chrome/renderer/audio_message_filter.h" |
| 23 #include "chrome/renderer/command_buffer_proxy.h" | 24 #include "chrome/renderer/command_buffer_proxy.h" |
| 25 #include "chrome/renderer/ggl/ggl.h" |
| 26 #include "chrome/renderer/gpu_channel_host.h" |
| 24 #include "chrome/renderer/render_thread.h" | 27 #include "chrome/renderer/render_thread.h" |
| 25 #include "chrome/renderer/render_view.h" | 28 #include "chrome/renderer/render_view.h" |
| 29 #include "chrome/renderer/webgraphicscontext3d_command_buffer_impl.h" |
| 26 #include "chrome/renderer/webplugin_delegate_proxy.h" | 30 #include "chrome/renderer/webplugin_delegate_proxy.h" |
| 31 #include "gfx/size.h" |
| 27 #include "grit/locale_settings.h" | 32 #include "grit/locale_settings.h" |
| 28 #include "ppapi/c/dev/pp_video_dev.h" | 33 #include "ppapi/c/dev/pp_video_dev.h" |
| 29 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserCompletion.h" | 34 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserCompletion.h" |
| 30 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserParams.h" | 35 #include "third_party/WebKit/WebKit/chromium/public/WebFileChooserParams.h" |
| 31 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" | 36 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" |
| 32 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" | 37 #include "third_party/WebKit/WebKit/chromium/public/WebView.h" |
| 33 #include "webkit/fileapi/file_system_callback_dispatcher.h" | 38 #include "webkit/fileapi/file_system_callback_dispatcher.h" |
| 34 #include "webkit/glue/plugins/pepper_file_io.h" | 39 #include "webkit/glue/plugins/pepper_file_io.h" |
| 35 #include "webkit/glue/plugins/pepper_plugin_instance.h" | 40 #include "webkit/glue/plugins/pepper_plugin_instance.h" |
| 36 #include "webkit/glue/plugins/webplugin.h" | 41 #include "webkit/glue/plugins/webplugin.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 int height_; | 78 int height_; |
| 74 scoped_ptr<TransportDIB> dib_; | 79 scoped_ptr<TransportDIB> dib_; |
| 75 | 80 |
| 76 DISALLOW_COPY_AND_ASSIGN(PlatformImage2DImpl); | 81 DISALLOW_COPY_AND_ASSIGN(PlatformImage2DImpl); |
| 77 }; | 82 }; |
| 78 | 83 |
| 79 #ifdef ENABLE_GPU | 84 #ifdef ENABLE_GPU |
| 80 | 85 |
| 81 class PlatformContext3DImpl : public pepper::PluginDelegate::PlatformContext3D { | 86 class PlatformContext3DImpl : public pepper::PluginDelegate::PlatformContext3D { |
| 82 public: | 87 public: |
| 83 explicit PlatformContext3DImpl(RenderView* render_view) | 88 explicit PlatformContext3DImpl(WebKit::WebView* web_view) |
| 84 : render_view_(render_view), | 89 : web_view_(web_view), |
| 85 nested_delegate_(NULL), | 90 context_(NULL) { |
| 86 command_buffer_(NULL), | 91 } |
| 87 renderview_to_webplugin_adapter_(render_view) {} | |
| 88 | 92 |
| 89 virtual ~PlatformContext3DImpl() { | 93 virtual ~PlatformContext3DImpl() { |
| 90 if (nested_delegate_) { | 94 if (context_) { |
| 91 nested_delegate_->DestroyCommandBuffer(command_buffer_); | 95 ggl::DestroyContext(context_); |
| 92 nested_delegate_->PluginDestroyed(); | 96 context_ = NULL; |
| 93 } | 97 } |
| 94 } | 98 } |
| 95 | 99 |
| 96 virtual bool Init(const gfx::Rect& position, const gfx::Rect& clip); | 100 virtual bool Init(); |
| 97 | 101 virtual bool SwapBuffers(); |
| 98 virtual gpu::CommandBuffer* GetCommandBuffer() { | 102 virtual unsigned GetError(); |
| 99 return command_buffer_; | 103 virtual void SetSwapBuffersCallback(Callback0::Type* callback); |
| 100 } | 104 void ResizeBackingTexture(const gfx::Size& size); |
| 101 | 105 virtual unsigned GetBackingTextureId(); |
| 102 virtual void SetNotifyRepaintTask(Task* task) { | 106 virtual gpu::gles2::GLES2Implementation* GetGLES2Implementation(); |
| 103 command_buffer_->SetNotifyRepaintTask(task); | |
| 104 } | |
| 105 | 107 |
| 106 private: | 108 private: |
| 107 | 109 WebKit::WebView* web_view_; |
| 108 class WebPluginAdapter : public webkit_glue::WebPlugin { | 110 ggl::Context* context_; |
| 109 public: | |
| 110 explicit WebPluginAdapter(RenderView* render_view) | |
| 111 : render_view_(render_view) {} | |
| 112 | |
| 113 virtual void SetWindow(gfx::PluginWindowHandle window) { | |
| 114 render_view_->CreatedPluginWindow(window); | |
| 115 } | |
| 116 | |
| 117 virtual void WillDestroyWindow(gfx::PluginWindowHandle window) { | |
| 118 render_view_->WillDestroyPluginWindow(window); | |
| 119 } | |
| 120 | |
| 121 virtual void SetAcceptsInputEvents(bool accepts) { | |
| 122 NOTREACHED(); | |
| 123 } | |
| 124 | |
| 125 #if defined(OS_WIN) | |
| 126 virtual void SetWindowlessPumpEvent(HANDLE pump_messages_event) { | |
| 127 NOTREACHED(); | |
| 128 } | |
| 129 #endif | |
| 130 | |
| 131 virtual void CancelResource(unsigned long id) { | |
| 132 NOTREACHED(); | |
| 133 } | |
| 134 | |
| 135 virtual void Invalidate() { | |
| 136 NOTREACHED(); | |
| 137 } | |
| 138 | |
| 139 virtual void InvalidateRect(const gfx::Rect& rect) { | |
| 140 NOTREACHED(); | |
| 141 } | |
| 142 | |
| 143 virtual NPObject* GetWindowScriptNPObject() { | |
| 144 NOTREACHED(); | |
| 145 return NULL; | |
| 146 } | |
| 147 | |
| 148 virtual NPObject* GetPluginElement() { | |
| 149 NOTREACHED(); | |
| 150 return NULL; | |
| 151 } | |
| 152 | |
| 153 virtual void SetCookie(const GURL& url, | |
| 154 const GURL& first_party_for_cookies, | |
| 155 const std::string& cookie) { | |
| 156 NOTREACHED(); | |
| 157 } | |
| 158 | |
| 159 virtual std::string GetCookies(const GURL& url, | |
| 160 const GURL& first_party_for_cookies) { | |
| 161 NOTREACHED(); | |
| 162 return std::string(); | |
| 163 } | |
| 164 | |
| 165 virtual void ShowModalHTMLDialog(const GURL& url, int width, int height, | |
| 166 const std::string& json_arguments, | |
| 167 std::string* json_retval) { | |
| 168 NOTREACHED(); | |
| 169 } | |
| 170 | |
| 171 virtual void OnMissingPluginStatus(int status) { | |
| 172 NOTREACHED(); | |
| 173 } | |
| 174 | |
| 175 virtual void HandleURLRequest(const char* url, | |
| 176 const char* method, | |
| 177 const char* target, | |
| 178 const char* buf, | |
| 179 unsigned int len, | |
| 180 int notify_id, | |
| 181 bool popups_allowed) { | |
| 182 NOTREACHED(); | |
| 183 } | |
| 184 | |
| 185 virtual void CancelDocumentLoad() { | |
| 186 NOTREACHED(); | |
| 187 } | |
| 188 | |
| 189 virtual void InitiateHTTPRangeRequest(const char* url, | |
| 190 const char* range_info, | |
| 191 int range_request_id) { | |
| 192 NOTREACHED(); | |
| 193 } | |
| 194 | |
| 195 virtual bool IsOffTheRecord() { | |
| 196 NOTREACHED(); | |
| 197 return false; | |
| 198 } | |
| 199 | |
| 200 virtual void SetDeferResourceLoading(unsigned long resource_id, | |
| 201 bool defer) { | |
| 202 NOTREACHED(); | |
| 203 } | |
| 204 | |
| 205 private: | |
| 206 RenderView* render_view_; | |
| 207 }; | |
| 208 | |
| 209 void SendNestedDelegateGeometryToBrowser(const gfx::Rect& window_rect, | |
| 210 const gfx::Rect& clip_rect); | |
| 211 | |
| 212 RenderView* render_view_; | |
| 213 WebPluginDelegateProxy* nested_delegate_; | |
| 214 CommandBufferProxy* command_buffer_; | |
| 215 WebPluginAdapter renderview_to_webplugin_adapter_; | |
| 216 }; | 111 }; |
| 217 | 112 |
| 218 #endif // ENABLE_GPU | 113 #endif // ENABLE_GPU |
| 219 | 114 |
| 220 class PlatformAudioImpl | 115 class PlatformAudioImpl |
| 221 : public pepper::PluginDelegate::PlatformAudio, | 116 : public pepper::PluginDelegate::PlatformAudio, |
| 222 public AudioMessageFilter::Delegate { | 117 public AudioMessageFilter::Delegate { |
| 223 public: | 118 public: |
| 224 explicit PlatformAudioImpl(scoped_refptr<AudioMessageFilter> filter) | 119 explicit PlatformAudioImpl(scoped_refptr<AudioMessageFilter> filter) |
| 225 : client_(NULL), filter_(filter), stream_id_(0) { | 120 : client_(NULL), filter_(filter), stream_id_(0) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 // MessageFilter used to send/receive IPC. | 166 // MessageFilter used to send/receive IPC. |
| 272 scoped_refptr<AudioMessageFilter> filter_; | 167 scoped_refptr<AudioMessageFilter> filter_; |
| 273 // Our ID on the MessageFilter. | 168 // Our ID on the MessageFilter. |
| 274 int32 stream_id_; | 169 int32 stream_id_; |
| 275 | 170 |
| 276 DISALLOW_COPY_AND_ASSIGN(PlatformAudioImpl); | 171 DISALLOW_COPY_AND_ASSIGN(PlatformAudioImpl); |
| 277 }; | 172 }; |
| 278 | 173 |
| 279 #ifdef ENABLE_GPU | 174 #ifdef ENABLE_GPU |
| 280 | 175 |
| 281 bool PlatformContext3DImpl::Init(const gfx::Rect& position, | 176 bool PlatformContext3DImpl::Init() { |
| 282 const gfx::Rect& clip) { | |
| 283 #if defined(ENABLE_GPU) | |
| 284 // Ignore initializing more than once. | 177 // Ignore initializing more than once. |
| 285 if (nested_delegate_) | 178 if (context_) |
| 286 return true; | 179 return true; |
| 287 | 180 |
| 288 // Create an instance of the GPU plugin that is responsible for 3D | 181 WebGraphicsContext3DCommandBufferImpl* context = |
| 289 // rendering. | 182 static_cast<WebGraphicsContext3DCommandBufferImpl*>( |
| 290 nested_delegate_ = new WebPluginDelegateProxy( | 183 web_view_->graphicsContext3D()); |
| 291 std::string("application/vnd.google.chrome.gpu-plugin"), | 184 if (!context) |
| 292 render_view_->AsWeakPtr()); | 185 return false; |
| 293 | 186 |
| 294 if (nested_delegate_->Initialize(GURL(), std::vector<std::string>(), | 187 ggl::Context* parent_context = context->context(); |
| 295 std::vector<std::string>(), | 188 if (!parent_context) |
| 296 &renderview_to_webplugin_adapter_, | 189 return false; |
| 297 false)) { | |
| 298 // Ensure the window has the correct size before initializing the | |
| 299 // command buffer. | |
| 300 nested_delegate_->UpdateGeometry(position, clip); | |
| 301 | 190 |
| 302 // Ask the GPU plugin to create a command buffer and return a proxy. | 191 RenderThread* render_thread = RenderThread::current(); |
| 303 command_buffer_ = nested_delegate_->CreateCommandBuffer(); | 192 if (!render_thread) |
| 304 if (command_buffer_) { | 193 return false; |
| 305 // Initialize the proxy command buffer. | |
| 306 if (command_buffer_->Initialize(kDefaultCommandBufferSize)) { | |
| 307 #if defined(OS_MACOSX) | |
| 308 command_buffer_->SetWindowSize(position.size()); | |
| 309 #endif // OS_MACOSX | |
| 310 | 194 |
| 311 // Make sure the nested delegate shows up in the right place | 195 GpuChannelHost* host = render_thread->GetGpuChannel(); |
| 312 // on the page. | 196 if (!host) |
| 313 SendNestedDelegateGeometryToBrowser(position, clip); | 197 return false; |
| 314 | 198 |
| 315 return true; | 199 DCHECK(host->state() == GpuChannelHost::CONNECTED); |
| 316 } | |
| 317 } | |
| 318 | 200 |
| 319 nested_delegate_->DestroyCommandBuffer(command_buffer_); | 201 // TODO(apatrick): Let Pepper plugins configure their back buffer surface. |
| 320 command_buffer_ = NULL; | 202 static const int32 attribs[] = { |
| 321 } | 203 ggl::GGL_ALPHA_SIZE, 8, |
| 204 ggl::GGL_DEPTH_SIZE, 24, |
| 205 ggl::GGL_STENCIL_SIZE, 8, |
| 206 ggl::GGL_SAMPLES, 0, |
| 207 ggl::GGL_SAMPLE_BUFFERS, 0, |
| 208 ggl::GGL_NONE, |
| 209 }; |
| 322 | 210 |
| 323 nested_delegate_->PluginDestroyed(); | 211 // TODO(apatrick): Decide which extensions to expose to Pepper plugins. |
| 324 nested_delegate_ = NULL; | 212 // Currently they get only core GLES2. |
| 325 #endif // ENABLE_GPU | 213 context_ = ggl::CreateOffscreenContext(host, |
| 326 return false; | 214 parent_context, |
| 215 gfx::Size(1, 1), |
| 216 "", |
| 217 attribs); |
| 218 if (!context_) |
| 219 return false; |
| 220 |
| 221 return true; |
| 327 } | 222 } |
| 328 | 223 |
| 329 void PlatformContext3DImpl::SendNestedDelegateGeometryToBrowser( | 224 bool PlatformContext3DImpl::SwapBuffers() { |
| 330 const gfx::Rect& window_rect, | 225 DCHECK(context_); |
| 331 const gfx::Rect& clip_rect) { | 226 return ggl::SwapBuffers(context_); |
| 332 // Inform the browser about the location of the plugin on the page. | 227 } |
| 333 // It appears that initially the plugin does not get laid out correctly -- | |
| 334 // possibly due to lazy creation of the nested delegate. | |
| 335 if (!nested_delegate_ || | |
| 336 !nested_delegate_->GetPluginWindowHandle() || | |
| 337 !render_view_) { | |
| 338 return; | |
| 339 } | |
| 340 | 228 |
| 341 webkit_glue::WebPluginGeometry geom; | 229 unsigned PlatformContext3DImpl::GetError() { |
| 342 geom.window = nested_delegate_->GetPluginWindowHandle(); | 230 DCHECK(context_); |
| 343 geom.window_rect = window_rect; | 231 return ggl::GetError(context_); |
| 344 geom.clip_rect = clip_rect; | 232 } |
| 345 // Rects_valid must be true for this to work in the Gtk port; | 233 |
| 346 // hopefully not having the cutout rects will not cause incorrect | 234 void PlatformContext3DImpl::ResizeBackingTexture(const gfx::Size& size) { |
| 347 // clipping. | 235 DCHECK(context_); |
| 348 geom.rects_valid = true; | 236 ggl::ResizeOffscreenContext(context_, size); |
| 349 geom.visible = true; | 237 } |
| 350 render_view_->DidMovePlugin(geom); | 238 |
| 239 void PlatformContext3DImpl::SetSwapBuffersCallback(Callback0::Type* callback) { |
| 240 DCHECK(context_); |
| 241 ggl::SetSwapBuffersCallback(context_, callback); |
| 242 } |
| 243 |
| 244 unsigned PlatformContext3DImpl::GetBackingTextureId() { |
| 245 DCHECK(context_); |
| 246 return ggl::GetParentTextureId(context_); |
| 247 } |
| 248 |
| 249 gpu::gles2::GLES2Implementation* |
| 250 PlatformContext3DImpl::GetGLES2Implementation() { |
| 251 DCHECK(context_); |
| 252 return ggl::GetImplementation(context_); |
| 351 } | 253 } |
| 352 | 254 |
| 353 #endif // ENABLE_GPU | 255 #endif // ENABLE_GPU |
| 354 | 256 |
| 355 bool PlatformAudioImpl::Initialize( | 257 bool PlatformAudioImpl::Initialize( |
| 356 uint32_t sample_rate, uint32_t sample_count, | 258 uint32_t sample_rate, uint32_t sample_count, |
| 357 pepper::PluginDelegate::PlatformAudio::Client* client) { | 259 pepper::PluginDelegate::PlatformAudio::Client* client) { |
| 358 | 260 |
| 359 DCHECK(client); | 261 DCHECK(client); |
| 360 // Make sure we don't call init more than once. | 262 // Make sure we don't call init more than once. |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 if (!dib) | 499 if (!dib) |
| 598 return NULL; | 500 return NULL; |
| 599 #endif | 501 #endif |
| 600 | 502 |
| 601 return new PlatformImage2DImpl(width, height, dib); | 503 return new PlatformImage2DImpl(width, height, dib); |
| 602 } | 504 } |
| 603 | 505 |
| 604 pepper::PluginDelegate::PlatformContext3D* | 506 pepper::PluginDelegate::PlatformContext3D* |
| 605 PepperPluginDelegateImpl::CreateContext3D() { | 507 PepperPluginDelegateImpl::CreateContext3D() { |
| 606 #ifdef ENABLE_GPU | 508 #ifdef ENABLE_GPU |
| 607 return new PlatformContext3DImpl(render_view_); | 509 return new PlatformContext3DImpl(render_view_->webview()); |
| 608 #else | 510 #else |
| 609 return NULL; | 511 return NULL; |
| 610 #endif | 512 #endif |
| 611 } | 513 } |
| 612 | 514 |
| 613 pepper::PluginDelegate::PlatformVideoDecoder* | 515 pepper::PluginDelegate::PlatformVideoDecoder* |
| 614 PepperPluginDelegateImpl::CreateVideoDecoder( | 516 PepperPluginDelegateImpl::CreateVideoDecoder( |
| 615 const PP_VideoDecoderConfig_Dev& decoder_config) { | 517 const PP_VideoDecoderConfig_Dev& decoder_config) { |
| 616 scoped_ptr<PlatformVideoDecoderImpl> decoder(new PlatformVideoDecoderImpl()); | 518 scoped_ptr<PlatformVideoDecoderImpl> decoder(new PlatformVideoDecoderImpl()); |
| 617 | 519 |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 900 } | 802 } |
| 901 | 803 |
| 902 void PepperPluginDelegateImpl::DidStopLoading() { | 804 void PepperPluginDelegateImpl::DidStopLoading() { |
| 903 render_view_->DidStopLoadingForPlugin(); | 805 render_view_->DidStopLoadingForPlugin(); |
| 904 } | 806 } |
| 905 | 807 |
| 906 void PepperPluginDelegateImpl::SetContentRestriction(int restrictions) { | 808 void PepperPluginDelegateImpl::SetContentRestriction(int restrictions) { |
| 907 render_view_->Send(new ViewHostMsg_UpdateContentRestrictions( | 809 render_view_->Send(new ViewHostMsg_UpdateContentRestrictions( |
| 908 render_view_->routing_id(), restrictions)); | 810 render_view_->routing_id(), restrictions)); |
| 909 } | 811 } |
| OLD | NEW |