Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: webkit/glue/plugins/pepper_plugin_instance.cc

Issue 3352019: Add fullscreen support to Pepper. (Closed) Base URL: git://git.chromium.org/chromium.git
Patch Set: git cl tree Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "webkit/glue/plugins/pepper_plugin_instance.h" 5 #include "webkit/glue/plugins/pepper_plugin_instance.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/histogram.h" 8 #include "base/histogram.h"
9 #if defined(OS_MACOSX) 9 #if defined(OS_MACOSX)
10 #include "base/mac_util.h" 10 #include "base/mac_util.h"
11 #include "base/scoped_cftyperef.h" 11 #include "base/scoped_cftyperef.h"
12 #endif 12 #endif
13 #include "base/scoped_ptr.h" 13 #include "base/scoped_ptr.h"
14 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
15 #include "gfx/rect.h" 15 #include "gfx/rect.h"
16 #if defined(OS_WIN) 16 #if defined(OS_WIN)
17 #include "gfx/codec/jpeg_codec.h" 17 #include "gfx/codec/jpeg_codec.h"
18 #include "gfx/gdi_util.h" 18 #include "gfx/gdi_util.h"
19 #endif 19 #endif
20 #include "gfx/skia_util.h" 20 #include "gfx/skia_util.h"
21 #include "printing/native_metafile.h" 21 #include "printing/native_metafile.h"
22 #include "printing/units.h" 22 #include "printing/units.h"
23 #include "skia/ext/vector_platform_device.h" 23 #include "skia/ext/vector_platform_device.h"
24 #include "skia/ext/platform_canvas.h" 24 #include "skia/ext/platform_canvas.h"
25 #include "third_party/ppapi/c/dev/ppb_find_dev.h" 25 #include "third_party/ppapi/c/dev/ppb_find_dev.h"
26 #include "third_party/ppapi/c/dev/ppb_fullscreen_dev.h"
26 #include "third_party/ppapi/c/dev/ppp_find_dev.h" 27 #include "third_party/ppapi/c/dev/ppp_find_dev.h"
27 #include "third_party/ppapi/c/dev/ppp_zoom_dev.h" 28 #include "third_party/ppapi/c/dev/ppp_zoom_dev.h"
28 #include "third_party/ppapi/c/pp_event.h" 29 #include "third_party/ppapi/c/pp_event.h"
29 #include "third_party/ppapi/c/pp_instance.h" 30 #include "third_party/ppapi/c/pp_instance.h"
30 #include "third_party/ppapi/c/pp_rect.h" 31 #include "third_party/ppapi/c/pp_rect.h"
31 #include "third_party/ppapi/c/pp_resource.h" 32 #include "third_party/ppapi/c/pp_resource.h"
32 #include "third_party/ppapi/c/pp_var.h" 33 #include "third_party/ppapi/c/pp_var.h"
33 #include "third_party/ppapi/c/ppb_core.h" 34 #include "third_party/ppapi/c/ppb_core.h"
34 #include "third_party/ppapi/c/ppb_instance.h" 35 #include "third_party/ppapi/c/ppb_instance.h"
35 #include "third_party/ppapi/c/ppp_instance.h" 36 #include "third_party/ppapi/c/ppp_instance.h"
36 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h" 37 #include "third_party/WebKit/WebKit/chromium/public/WebBindings.h"
37 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h" 38 #include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h"
38 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" 39 #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h"
39 #include "third_party/WebKit/WebKit/chromium/public/WebElement.h" 40 #include "third_party/WebKit/WebKit/chromium/public/WebElement.h"
40 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" 41 #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h"
41 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" 42 #include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h"
42 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h" 43 #include "third_party/WebKit/WebKit/chromium/public/WebPluginContainer.h"
43 #include "third_party/WebKit/WebKit/chromium/public/WebRect.h" 44 #include "third_party/WebKit/WebKit/chromium/public/WebRect.h"
44 #include "webkit/glue/plugins/pepper_buffer.h" 45 #include "webkit/glue/plugins/pepper_buffer.h"
45 #include "webkit/glue/plugins/pepper_graphics_2d.h" 46 #include "webkit/glue/plugins/pepper_graphics_2d.h"
46 #include "webkit/glue/plugins/pepper_event_conversion.h" 47 #include "webkit/glue/plugins/pepper_event_conversion.h"
48 #include "webkit/glue/plugins/pepper_fullscreen_container.h"
47 #include "webkit/glue/plugins/pepper_image_data.h" 49 #include "webkit/glue/plugins/pepper_image_data.h"
48 #include "webkit/glue/plugins/pepper_plugin_delegate.h" 50 #include "webkit/glue/plugins/pepper_plugin_delegate.h"
49 #include "webkit/glue/plugins/pepper_plugin_module.h" 51 #include "webkit/glue/plugins/pepper_plugin_module.h"
50 #include "webkit/glue/plugins/pepper_string.h" 52 #include "webkit/glue/plugins/pepper_string.h"
51 #include "webkit/glue/plugins/pepper_url_loader.h" 53 #include "webkit/glue/plugins/pepper_url_loader.h"
52 #include "webkit/glue/plugins/pepper_var.h" 54 #include "webkit/glue/plugins/pepper_var.h"
53 55
54 using WebKit::WebBindings; 56 using WebKit::WebBindings;
55 using WebKit::WebCanvas; 57 using WebKit::WebCanvas;
56 using WebKit::WebCursorInfo; 58 using WebKit::WebCursorInfo;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 DCHECK_NE(instance->find_identifier(), -1); 202 DCHECK_NE(instance->find_identifier(), -1);
201 instance->delegate()->DidChangeSelectedFindResult( 203 instance->delegate()->DidChangeSelectedFindResult(
202 instance->find_identifier(), index); 204 instance->find_identifier(), index);
203 } 205 }
204 206
205 const PPB_Find_Dev ppb_find = { 207 const PPB_Find_Dev ppb_find = {
206 &NumberOfFindResultsChanged, 208 &NumberOfFindResultsChanged,
207 &SelectedFindResultChanged, 209 &SelectedFindResultChanged,
208 }; 210 };
209 211
212 bool IsFullscreen(PP_Instance instance_id) {
213 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id);
214 if (!instance)
215 return false;
216 return instance->IsFullscreen();
217 }
218
219 bool SetFullscreen(PP_Instance instance_id, bool fullscreen) {
220 PluginInstance* instance = PluginInstance::FromPPInstance(instance_id);
221 if (!instance)
222 return false;
223 return instance->SetFullscreen(fullscreen);
224 }
225
226 const PPB_Fullscreen_Dev ppb_fullscreen = {
227 &IsFullscreen,
228 &SetFullscreen,
229 };
230
210 } // namespace 231 } // namespace
211 232
212 PluginInstance::PluginInstance(PluginDelegate* delegate, 233 PluginInstance::PluginInstance(PluginDelegate* delegate,
213 PluginModule* module, 234 PluginModule* module,
214 const PPP_Instance* instance_interface) 235 const PPP_Instance* instance_interface)
215 : delegate_(delegate), 236 : delegate_(delegate),
216 module_(module), 237 module_(module),
217 instance_interface_(instance_interface), 238 instance_interface_(instance_interface),
218 container_(NULL), 239 container_(NULL),
219 full_frame_(false), 240 full_frame_(false),
220 find_identifier_(-1), 241 find_identifier_(-1),
221 plugin_find_interface_(NULL), 242 plugin_find_interface_(NULL),
222 plugin_zoom_interface_(NULL), 243 plugin_zoom_interface_(NULL),
223 #if defined (OS_LINUX) 244 #if defined (OS_LINUX)
224 num_pages_(0), 245 num_pages_(0),
225 pdf_output_done_(false), 246 pdf_output_done_(false),
226 #endif // defined (OS_LINUX) 247 #endif // defined (OS_LINUX)
227 plugin_print_interface_(NULL), 248 plugin_print_interface_(NULL),
228 plugin_graphics_3d_interface_(NULL) { 249 plugin_graphics_3d_interface_(NULL),
250 fullscreen_container_(NULL) {
229 memset(&current_print_settings_, 0, sizeof(current_print_settings_)); 251 memset(&current_print_settings_, 0, sizeof(current_print_settings_));
230 DCHECK(delegate); 252 DCHECK(delegate);
231 module_->InstanceCreated(this); 253 module_->InstanceCreated(this);
232 delegate_->InstanceCreated(this); 254 delegate_->InstanceCreated(this);
233 } 255 }
234 256
235 PluginInstance::~PluginInstance() { 257 PluginInstance::~PluginInstance() {
236 delegate_->InstanceDeleted(this); 258 delegate_->InstanceDeleted(this);
237 module_->InstanceDeleted(this); 259 module_->InstanceDeleted(this);
238 } 260 }
239 261
240 // static 262 // static
241 const PPB_Instance* PluginInstance::GetInterface() { 263 const PPB_Instance* PluginInstance::GetInterface() {
242 return &ppb_instance; 264 return &ppb_instance;
243 } 265 }
244 266
245 // static 267 // static
246 PluginInstance* PluginInstance::FromPPInstance(PP_Instance instance) { 268 PluginInstance* PluginInstance::FromPPInstance(PP_Instance instance) {
247 return reinterpret_cast<PluginInstance*>(instance); 269 return reinterpret_cast<PluginInstance*>(instance);
248 } 270 }
249 271
250 // static 272 // static
251 const PPB_Find_Dev* PluginInstance::GetFindInterface() { 273 const PPB_Find_Dev* PluginInstance::GetFindInterface() {
252 return &ppb_find; 274 return &ppb_find;
253 } 275 }
254 276
277 // static
278 const PPB_Fullscreen_Dev* PluginInstance::GetFullscreenInterface() {
279 return &ppb_fullscreen;
280 }
281
255 PP_Instance PluginInstance::GetPPInstance() { 282 PP_Instance PluginInstance::GetPPInstance() {
256 return reinterpret_cast<intptr_t>(this); 283 return reinterpret_cast<intptr_t>(this);
257 } 284 }
258 285
259 void PluginInstance::Paint(WebCanvas* canvas, 286 void PluginInstance::Paint(WebCanvas* canvas,
260 const gfx::Rect& plugin_rect, 287 const gfx::Rect& plugin_rect,
261 const gfx::Rect& paint_rect) { 288 const gfx::Rect& paint_rect) {
262 if (bound_graphics_2d_) 289 if (bound_graphics_2d_)
263 bound_graphics_2d_->Paint(canvas, plugin_rect, paint_rect); 290 bound_graphics_2d_->Paint(canvas, plugin_rect, paint_rect);
264 } 291 }
265 292
266 void PluginInstance::InvalidateRect(const gfx::Rect& rect) { 293 void PluginInstance::InvalidateRect(const gfx::Rect& rect) {
267 if (!container_ || position_.IsEmpty()) 294 if (fullscreen_container_) {
268 return; // Nothing to do. 295 if (rect.IsEmpty())
269 if (rect.IsEmpty()) 296 fullscreen_container_->Invalidate();
270 container_->invalidate(); 297 else
271 else 298 fullscreen_container_->InvalidateRect(rect);
272 container_->invalidateRect(rect); 299 } else {
300 if (!container_ || position_.IsEmpty())
301 return; // Nothing to do.
302 if (rect.IsEmpty())
303 container_->invalidate();
304 else
305 container_->invalidateRect(rect);
306 }
273 } 307 }
274 308
275 PP_Var PluginInstance::GetWindowObject() { 309 PP_Var PluginInstance::GetWindowObject() {
276 if (!container_) 310 if (!container_)
277 return PP_MakeVoid(); 311 return PP_MakeVoid();
278 312
279 WebFrame* frame = container_->element().document().frame(); 313 WebFrame* frame = container_->element().document().frame();
280 if (!frame) 314 if (!frame)
281 return PP_MakeVoid(); 315 return PP_MakeVoid();
282 316
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 } 406 }
373 407
374 PP_Var ret = Var::NPVariantToPPVar(module_, &result); 408 PP_Var ret = Var::NPVariantToPPVar(module_, &result);
375 WebBindings::releaseVariantValue(&result); 409 WebBindings::releaseVariantValue(&result);
376 return ret; 410 return ret;
377 } 411 }
378 412
379 void PluginInstance::Delete() { 413 void PluginInstance::Delete() {
380 instance_interface_->Delete(GetPPInstance()); 414 instance_interface_->Delete(GetPPInstance());
381 415
416 if (fullscreen_container_) {
417 fullscreen_container_->Destroy();
418 fullscreen_container_ = NULL;
419 }
382 container_ = NULL; 420 container_ = NULL;
383 } 421 }
384 422
385 bool PluginInstance::Initialize(WebPluginContainer* container, 423 bool PluginInstance::Initialize(WebPluginContainer* container,
386 const std::vector<std::string>& arg_names, 424 const std::vector<std::string>& arg_names,
387 const std::vector<std::string>& arg_values, 425 const std::vector<std::string>& arg_values,
388 bool full_frame) { 426 bool full_frame) {
389 container_ = container; 427 container_ = container;
390 full_frame_ = full_frame; 428 full_frame_ = full_frame;
391 429
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 void PluginInstance::Graphics3DContextLost() { 671 void PluginInstance::Graphics3DContextLost() {
634 if (!plugin_graphics_3d_interface_) { 672 if (!plugin_graphics_3d_interface_) {
635 plugin_graphics_3d_interface_ = 673 plugin_graphics_3d_interface_ =
636 reinterpret_cast<const PPP_Graphics3D_Dev*>(module_->GetPluginInterface( 674 reinterpret_cast<const PPP_Graphics3D_Dev*>(module_->GetPluginInterface(
637 PPP_GRAPHICS_3D_DEV_INTERFACE)); 675 PPP_GRAPHICS_3D_DEV_INTERFACE));
638 } 676 }
639 if (plugin_graphics_3d_interface_) 677 if (plugin_graphics_3d_interface_)
640 plugin_graphics_3d_interface_->Graphics3DContextLost(GetPPInstance()); 678 plugin_graphics_3d_interface_->Graphics3DContextLost(GetPPInstance());
641 } 679 }
642 680
681 bool PluginInstance::IsFullscreen() {
682 return fullscreen_container_ != NULL;
683 }
684
685 bool PluginInstance::SetFullscreen(bool fullscreen) {
686 bool is_fullscreen = (fullscreen_container_ != NULL);
687 if (fullscreen == is_fullscreen)
688 return true;
689 LOG(INFO) << "Setting fullscreen to " << (fullscreen ? "on" : "off");
690 if (fullscreen) {
691 fullscreen_container_ = delegate_->CreateFullscreenContainer(this);
692 } else {
693 fullscreen_container_->Destroy();
694 fullscreen_container_ = NULL;
695 // TODO(piman): currently the fullscreen container resizes the plugin to the
696 // fullscreen size so we need to reset the size here. Eventually it will
697 // transparently scale and this won't be necessary.
698 if (container_) {
699 container_->reportGeometry();
700 container_->invalidate();
701 }
702 }
703 return true;
704 }
705
643 bool PluginInstance::PrintPDFOutput(PP_Resource print_output, 706 bool PluginInstance::PrintPDFOutput(PP_Resource print_output,
644 WebKit::WebCanvas* canvas) { 707 WebKit::WebCanvas* canvas) {
645 scoped_refptr<Buffer> buffer(Resource::GetAs<Buffer>(print_output)); 708 scoped_refptr<Buffer> buffer(Resource::GetAs<Buffer>(print_output));
646 if (!buffer.get() || !buffer->is_mapped() || !buffer->size()) { 709 if (!buffer.get() || !buffer->is_mapped() || !buffer->size()) {
647 NOTREACHED(); 710 NOTREACHED();
648 return false; 711 return false;
649 } 712 }
650 #if defined(OS_WIN) 713 #if defined(OS_WIN)
651 // For Windows, we need the PDF DLL to render the output PDF to a DC. 714 // For Windows, we need the PDF DLL to render the output PDF to a DC.
652 HMODULE pdf_module = GetModuleHandle(L"pdf.dll"); 715 HMODULE pdf_module = GetModuleHandle(L"pdf.dll");
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 bounds.size.width = dest_rect.width(); 923 bounds.size.width = dest_rect.width();
861 bounds.size.height = dest_rect.height(); 924 bounds.size.height = dest_rect.height();
862 925
863 CGContextDrawImage(canvas, bounds, image); 926 CGContextDrawImage(canvas, bounds, image);
864 CGContextRestoreGState(canvas); 927 CGContextRestoreGState(canvas);
865 } 928 }
866 #endif // defined(OS_MACOSX) 929 #endif // defined(OS_MACOSX)
867 930
868 931
869 } // namespace pepper 932 } // namespace pepper
OLDNEW
« no previous file with comments | « webkit/glue/plugins/pepper_plugin_instance.h ('k') | webkit/glue/plugins/pepper_plugin_module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698