| 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 #define PEPPER_APIS_ENABLED 1 | 5 #define PEPPER_APIS_ENABLED 1 |
| 6 | 6 |
| 7 #include "chrome/renderer/webplugin_delegate_pepper.h" | 7 #include "chrome/renderer/webplugin_delegate_pepper.h" |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | 57 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| 58 #include "webkit/glue/webcursor.h" | 58 #include "webkit/glue/webcursor.h" |
| 59 #include "webkit/glue/webkit_glue.h" | 59 #include "webkit/glue/webkit_glue.h" |
| 60 #include "webkit/plugins/npapi/plugin_constants_win.h" | 60 #include "webkit/plugins/npapi/plugin_constants_win.h" |
| 61 #include "webkit/plugins/npapi/plugin_instance.h" | 61 #include "webkit/plugins/npapi/plugin_instance.h" |
| 62 #include "webkit/plugins/npapi/plugin_lib.h" | 62 #include "webkit/plugins/npapi/plugin_lib.h" |
| 63 #include "webkit/plugins/npapi/plugin_list.h" | 63 #include "webkit/plugins/npapi/plugin_list.h" |
| 64 #include "webkit/plugins/npapi/plugin_host.h" | 64 #include "webkit/plugins/npapi/plugin_host.h" |
| 65 #include "webkit/plugins/npapi/plugin_stream_url.h" | 65 #include "webkit/plugins/npapi/plugin_stream_url.h" |
| 66 | 66 |
| 67 #if defined(ENABLE_GPU) | |
| 68 #include "webkit/plugins/npapi/plugin_constants_win.h" | |
| 69 #endif | |
| 70 | |
| 71 #if defined(ENABLE_GPU) | |
| 72 using gpu::Buffer; | |
| 73 #endif | |
| 74 | |
| 75 using webkit::npapi::WebPlugin; | 67 using webkit::npapi::WebPlugin; |
| 76 using webkit::npapi::WebPluginDelegate; | 68 using webkit::npapi::WebPluginDelegate; |
| 77 using webkit::npapi::WebPluginResourceClient; | 69 using webkit::npapi::WebPluginResourceClient; |
| 78 using WebKit::WebCursorInfo; | 70 using WebKit::WebCursorInfo; |
| 79 using WebKit::WebKeyboardEvent; | 71 using WebKit::WebKeyboardEvent; |
| 80 using WebKit::WebInputEvent; | 72 using WebKit::WebInputEvent; |
| 81 using WebKit::WebMouseEvent; | 73 using WebKit::WebMouseEvent; |
| 82 using WebKit::WebMouseWheelEvent; | 74 using WebKit::WebMouseWheelEvent; |
| 83 | 75 |
| 84 namespace { | 76 namespace { |
| 85 | 77 |
| 86 // Implementation artifacts for a context | 78 // Implementation artifacts for a context |
| 87 struct Device2DImpl { | 79 struct Device2DImpl { |
| 88 TransportDIB* dib; | 80 TransportDIB* dib; |
| 89 }; | 81 }; |
| 90 | 82 |
| 91 struct Device3DImpl { | |
| 92 #if defined(ENABLE_GPU) | |
| 93 gpu::CommandBuffer* command_buffer; | |
| 94 #endif | |
| 95 bool dynamically_created; | |
| 96 }; | |
| 97 | |
| 98 const int32 kDefaultCommandBufferSize = 1024 * 1024; | |
| 99 | |
| 100 } // namespace | 83 } // namespace |
| 101 | 84 |
| 102 static const float kPointsPerInch = 72.0; | 85 static const float kPointsPerInch = 72.0; |
| 103 | 86 |
| 104 #if defined(OS_WIN) | 87 #if defined(OS_WIN) |
| 105 // Exported by pdf.dll | 88 // Exported by pdf.dll |
| 106 typedef bool (*RenderPDFPageToDCProc)( | 89 typedef bool (*RenderPDFPageToDCProc)( |
| 107 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, | 90 const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, |
| 108 int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, | 91 int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, |
| 109 int bounds_width, int bounds_height, bool fit_to_bounds, | 92 int bounds_width, int bounds_height, bool fit_to_bounds, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 | 174 |
| 192 window_.window = NULL; | 175 window_.window = NULL; |
| 193 instance_->NPP_SetWindow(&window_); | 176 instance_->NPP_SetWindow(&window_); |
| 194 | 177 |
| 195 instance_->NPP_Destroy(); | 178 instance_->NPP_Destroy(); |
| 196 | 179 |
| 197 instance_->set_web_plugin(NULL); | 180 instance_->set_web_plugin(NULL); |
| 198 | 181 |
| 199 instance_ = 0; | 182 instance_ = 0; |
| 200 } | 183 } |
| 201 | |
| 202 // Destroy the nested GPU plugin only after first destroying the underlying | |
| 203 // Pepper plugin. This is so the Pepper plugin does not attempt to issue | |
| 204 // rendering commands after the GPU plugin has stopped processing them and | |
| 205 // responding to them. | |
| 206 if (nested_delegate_) { | |
| 207 #if defined(ENABLE_GPU) | |
| 208 if (command_buffer_) { | |
| 209 nested_delegate_->DestroyCommandBuffer(command_buffer_); | |
| 210 command_buffer_ = NULL; | |
| 211 } | |
| 212 #endif | |
| 213 | |
| 214 nested_delegate_->PluginDestroyed(); | |
| 215 nested_delegate_ = NULL; | |
| 216 } | |
| 217 } | 184 } |
| 218 | 185 |
| 219 void WebPluginDelegatePepper::UpdateGeometry( | 186 void WebPluginDelegatePepper::UpdateGeometry( |
| 220 const gfx::Rect& window_rect, | 187 const gfx::Rect& window_rect, |
| 221 const gfx::Rect& clip_rect) { | 188 const gfx::Rect& clip_rect) { |
| 222 // Only resend to the instance if the geometry has changed. | 189 // Only resend to the instance if the geometry has changed. |
| 223 if (window_rect == window_rect_ && clip_rect == clip_rect_) | 190 if (window_rect == window_rect_ && clip_rect == clip_rect_) |
| 224 return; | 191 return; |
| 225 | 192 |
| 226 clip_rect_ = clip_rect; | 193 clip_rect_ = clip_rect; |
| 227 cutout_rects_.clear(); | 194 cutout_rects_.clear(); |
| 228 | 195 |
| 229 if (window_rect_ == window_rect) | 196 if (window_rect_ == window_rect) |
| 230 return; | 197 return; |
| 231 window_rect_ = window_rect; | 198 window_rect_ = window_rect; |
| 232 | 199 |
| 233 // TODO(brettw) figure out how to tell the plugin that the size changed and it | 200 // TODO(brettw) figure out how to tell the plugin that the size changed and it |
| 234 // needs to repaint? | 201 // needs to repaint? |
| 235 SkBitmap new_committed; | 202 SkBitmap new_committed; |
| 236 new_committed.setConfig(SkBitmap::kARGB_8888_Config, | 203 new_committed.setConfig(SkBitmap::kARGB_8888_Config, |
| 237 window_rect_.width(), window_rect_.height()); | 204 window_rect_.width(), window_rect_.height()); |
| 238 new_committed.allocPixels(); | 205 new_committed.allocPixels(); |
| 239 committed_bitmap_ = new_committed; | 206 committed_bitmap_ = new_committed; |
| 240 | 207 |
| 241 // Forward the new geometry to the nested plugin instance. | |
| 242 if (nested_delegate_) | |
| 243 nested_delegate_->UpdateGeometry(window_rect, clip_rect); | |
| 244 | |
| 245 #if defined(ENABLE_GPU) | |
| 246 #if defined(OS_MACOSX) | |
| 247 // Send the new window size to the command buffer service code so it | |
| 248 // can allocate a new backing store. The handle to the new backing | |
| 249 // store is sent back to the browser asynchronously. | |
| 250 if (command_buffer_) { | |
| 251 command_buffer_->SetWindowSize(window_rect_.size()); | |
| 252 } | |
| 253 #endif // OS_MACOSX | |
| 254 #endif // ENABLE_GPU | |
| 255 | |
| 256 if (!instance()) | 208 if (!instance()) |
| 257 return; | 209 return; |
| 258 | 210 |
| 259 ForwardSetWindow(); | 211 ForwardSetWindow(); |
| 260 } | 212 } |
| 261 | 213 |
| 262 NPObject* WebPluginDelegatePepper::GetPluginScriptableObject() { | 214 NPObject* WebPluginDelegatePepper::GetPluginScriptableObject() { |
| 263 return instance_->GetPluginScriptableObject(); | 215 return instance_->GetPluginScriptableObject(); |
| 264 } | 216 } |
| 265 | 217 |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 | 513 |
| 562 NPError WebPluginDelegatePepper::Device2DInitializeContext( | 514 NPError WebPluginDelegatePepper::Device2DInitializeContext( |
| 563 const NPDeviceContext2DConfig* config, | 515 const NPDeviceContext2DConfig* config, |
| 564 NPDeviceContext2D* context) { | 516 NPDeviceContext2D* context) { |
| 565 | 517 |
| 566 if (!render_view_) { | 518 if (!render_view_) { |
| 567 return NPERR_GENERIC_ERROR; | 519 return NPERR_GENERIC_ERROR; |
| 568 } | 520 } |
| 569 | 521 |
| 570 // This is a windowless plugin, so set it to have no handle. Defer this | 522 // This is a windowless plugin, so set it to have no handle. Defer this |
| 571 // until we know the plugin will use the 2D device. If it uses the 3D device | 523 // until we know the plugin will use the 2D device. |
| 572 // it will have a window handle. | |
| 573 plugin_->SetWindow(gfx::kNullPluginWindow); | 524 plugin_->SetWindow(gfx::kNullPluginWindow); |
| 574 | 525 |
| 575 scoped_ptr<Graphics2DDeviceContext> g2d(new Graphics2DDeviceContext(this)); | 526 scoped_ptr<Graphics2DDeviceContext> g2d(new Graphics2DDeviceContext(this)); |
| 576 NPError status = g2d->Initialize(window_rect_, config, context); | 527 NPError status = g2d->Initialize(window_rect_, config, context); |
| 577 if (NPERR_NO_ERROR == status) { | 528 if (NPERR_NO_ERROR == status) { |
| 578 context->reserved = reinterpret_cast<void *>( | 529 context->reserved = reinterpret_cast<void *>( |
| 579 graphic2d_contexts_.Add(g2d.release())); | 530 graphic2d_contexts_.Add(g2d.release())); |
| 580 } | 531 } |
| 581 return status; | 532 return status; |
| 582 } | 533 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 | 614 |
| 664 NPError WebPluginDelegatePepper::Device3DQueryConfig( | 615 NPError WebPluginDelegatePepper::Device3DQueryConfig( |
| 665 const NPDeviceContext3DConfig* request, | 616 const NPDeviceContext3DConfig* request, |
| 666 NPDeviceContext3DConfig* obtain) { | 617 NPDeviceContext3DConfig* obtain) { |
| 667 return NPERR_GENERIC_ERROR; | 618 return NPERR_GENERIC_ERROR; |
| 668 } | 619 } |
| 669 | 620 |
| 670 NPError WebPluginDelegatePepper::Device3DInitializeContext( | 621 NPError WebPluginDelegatePepper::Device3DInitializeContext( |
| 671 const NPDeviceContext3DConfig* config, | 622 const NPDeviceContext3DConfig* config, |
| 672 NPDeviceContext3D* context) { | 623 NPDeviceContext3D* context) { |
| 673 if (!context) | |
| 674 return NPERR_GENERIC_ERROR; | |
| 675 | |
| 676 #if defined(ENABLE_GPU) | |
| 677 // Check to see if the GPU plugin is already initialized and fail if so. | |
| 678 if (nested_delegate_) | |
| 679 return NPERR_GENERIC_ERROR; | |
| 680 | |
| 681 // Create an instance of the GPU plugin that is responsible for 3D | |
| 682 // rendering. | |
| 683 nested_delegate_ = new WebPluginDelegateProxy( | |
| 684 "application/vnd.google.chrome.gpu-plugin", render_view_); | |
| 685 | |
| 686 // TODO(apatrick): should the GPU plugin be attached to plugin_? | |
| 687 if (nested_delegate_->Initialize(GURL(), | |
| 688 std::vector<std::string>(), | |
| 689 std::vector<std::string>(), | |
| 690 plugin_, | |
| 691 false)) { | |
| 692 plugin_->SetAcceptsInputEvents(true); | |
| 693 | |
| 694 // Ensure the window has the correct size before initializing the | |
| 695 // command buffer. | |
| 696 nested_delegate_->UpdateGeometry(window_rect_, clip_rect_); | |
| 697 | |
| 698 // Ask the GPU plugin to create a command buffer and return a proxy. | |
| 699 command_buffer_ = nested_delegate_->CreateCommandBuffer(); | |
| 700 if (command_buffer_) { | |
| 701 // Initialize the proxy command buffer. | |
| 702 if (command_buffer_->Initialize(config->commandBufferSize)) { | |
| 703 // Get the initial command buffer state. | |
| 704 gpu::CommandBuffer::State state = command_buffer_->GetState(); | |
| 705 | |
| 706 // Initialize the 3D context. | |
| 707 context->reserved = NULL; | |
| 708 context->waitForProgress = true; | |
| 709 Buffer ring_buffer = command_buffer_->GetRingBuffer(); | |
| 710 context->commandBuffer = ring_buffer.ptr; | |
| 711 context->commandBufferSize = state.num_entries; | |
| 712 context->repaintCallback = NULL; | |
| 713 Synchronize3DContext(context, state); | |
| 714 | |
| 715 ScheduleHandleRepaint(instance_->npp(), context); | |
| 716 | |
| 717 #if defined(OS_MACOSX) | |
| 718 command_buffer_->SetWindowSize(window_rect_.size()); | |
| 719 #endif // OS_MACOSX | |
| 720 | |
| 721 // Make sure the nested delegate shows up in the right place | |
| 722 // on the page. | |
| 723 SendNestedDelegateGeometryToBrowser(window_rect_, clip_rect_); | |
| 724 | |
| 725 // Save the implementation information (the CommandBuffer). | |
| 726 Device3DImpl* impl = new Device3DImpl; | |
| 727 impl->command_buffer = command_buffer_; | |
| 728 impl->dynamically_created = false; | |
| 729 context->reserved = impl; | |
| 730 | |
| 731 return NPERR_NO_ERROR; | |
| 732 } | |
| 733 | |
| 734 nested_delegate_->DestroyCommandBuffer(command_buffer_); | |
| 735 command_buffer_ = NULL; | |
| 736 } | |
| 737 } | |
| 738 | |
| 739 nested_delegate_->PluginDestroyed(); | |
| 740 nested_delegate_ = NULL; | |
| 741 #endif // ENABLE_GPU | |
| 742 | |
| 743 return NPERR_GENERIC_ERROR; | 624 return NPERR_GENERIC_ERROR; |
| 744 } | 625 } |
| 745 | 626 |
| 746 NPError WebPluginDelegatePepper::Device3DSetStateContext( | 627 NPError WebPluginDelegatePepper::Device3DSetStateContext( |
| 747 NPDeviceContext3D* context, | 628 NPDeviceContext3D* context, |
| 748 int32 state, | 629 int32 state, |
| 749 intptr_t value) { | 630 intptr_t value) { |
| 750 return NPERR_GENERIC_ERROR; | 631 return NPERR_GENERIC_ERROR; |
| 751 } | 632 } |
| 752 | 633 |
| 753 NPError WebPluginDelegatePepper::Device3DGetStateContext( | 634 NPError WebPluginDelegatePepper::Device3DGetStateContext( |
| 754 NPDeviceContext3D* context, | 635 NPDeviceContext3D* context, |
| 755 int32 state, | 636 int32 state, |
| 756 intptr_t* value) { | 637 intptr_t* value) { |
| 757 return NPERR_GENERIC_ERROR; | 638 return NPERR_GENERIC_ERROR; |
| 758 } | 639 } |
| 759 | 640 |
| 760 NPError WebPluginDelegatePepper::Device3DFlushContext( | 641 NPError WebPluginDelegatePepper::Device3DFlushContext( |
| 761 NPP id, | 642 NPP id, |
| 762 NPDeviceContext3D* context, | 643 NPDeviceContext3D* context, |
| 763 NPDeviceFlushContextCallbackPtr callback, | 644 NPDeviceFlushContextCallbackPtr callback, |
| 764 void* user_data) { | 645 void* user_data) { |
| 765 if (!context) | 646 return NPERR_GENERIC_ERROR; |
| 766 return NPERR_GENERIC_ERROR; | |
| 767 | |
| 768 #if defined(ENABLE_GPU) | |
| 769 gpu::CommandBuffer::State state; | |
| 770 | |
| 771 if (context->waitForProgress) { | |
| 772 if (callback) { | |
| 773 command_buffer_->AsyncFlush( | |
| 774 context->putOffset, | |
| 775 method_factory3d_.NewRunnableMethod( | |
| 776 &WebPluginDelegatePepper::Device3DUpdateState, | |
| 777 id, | |
| 778 context, | |
| 779 callback, | |
| 780 user_data)); | |
| 781 } else { | |
| 782 state = command_buffer_->FlushSync(context->putOffset); | |
| 783 Synchronize3DContext(context, state); | |
| 784 } | |
| 785 } else { | |
| 786 if (callback) { | |
| 787 command_buffer_->AsyncGetState( | |
| 788 method_factory3d_.NewRunnableMethod( | |
| 789 &WebPluginDelegatePepper::Device3DUpdateState, | |
| 790 id, | |
| 791 context, | |
| 792 callback, | |
| 793 user_data)); | |
| 794 } else { | |
| 795 state = command_buffer_->GetState(); | |
| 796 Synchronize3DContext(context, state); | |
| 797 } | |
| 798 } | |
| 799 #endif // ENABLE_GPU | |
| 800 return NPERR_NO_ERROR; | |
| 801 } | 647 } |
| 802 | 648 |
| 803 NPError WebPluginDelegatePepper::Device3DDestroyContext( | 649 NPError WebPluginDelegatePepper::Device3DDestroyContext( |
| 804 NPDeviceContext3D* context) { | 650 NPDeviceContext3D* context) { |
| 805 if (!context) | 651 return NPERR_GENERIC_ERROR; |
| 806 return NPERR_GENERIC_ERROR; | |
| 807 | |
| 808 #if defined(ENABLE_GPU) | |
| 809 // Prevent any async flush callbacks from being invoked after the context | |
| 810 // has been destroyed. | |
| 811 method_factory3d_.RevokeAll(); | |
| 812 | |
| 813 // TODO(apatrick): this will be much simpler when we switch to the new device | |
| 814 // API. There should be no need for the Device3DImpl and the context will | |
| 815 // always be destroyed dynamically. | |
| 816 Device3DImpl* impl = static_cast<Device3DImpl*>(context->reserved); | |
| 817 bool dynamically_created = impl->dynamically_created; | |
| 818 delete impl; | |
| 819 context->reserved = NULL; | |
| 820 if (dynamically_created) { | |
| 821 delete context; | |
| 822 } | |
| 823 | |
| 824 if (nested_delegate_) { | |
| 825 if (command_buffer_) { | |
| 826 nested_delegate_->DestroyCommandBuffer(command_buffer_); | |
| 827 command_buffer_ = NULL; | |
| 828 } | |
| 829 | |
| 830 nested_delegate_->PluginDestroyed(); | |
| 831 nested_delegate_ = NULL; | |
| 832 } | |
| 833 #endif // ENABLE_GPU | |
| 834 | |
| 835 return NPERR_NO_ERROR; | |
| 836 } | 652 } |
| 837 | 653 |
| 838 NPError WebPluginDelegatePepper::Device3DCreateBuffer( | 654 NPError WebPluginDelegatePepper::Device3DCreateBuffer( |
| 839 NPDeviceContext3D* context, | 655 NPDeviceContext3D* context, |
| 840 size_t size, | 656 size_t size, |
| 841 int32* id) { | 657 int32* id) { |
| 842 if (!context) | 658 return NPERR_GENERIC_ERROR; |
| 843 return NPERR_GENERIC_ERROR; | |
| 844 | |
| 845 #if defined(ENABLE_GPU) | |
| 846 *id = command_buffer_->CreateTransferBuffer(size); | |
| 847 if (*id < 0) | |
| 848 return NPERR_GENERIC_ERROR; | |
| 849 #endif // ENABLE_GPU | |
| 850 | |
| 851 return NPERR_NO_ERROR; | |
| 852 } | 659 } |
| 853 | 660 |
| 854 NPError WebPluginDelegatePepper::Device3DDestroyBuffer( | 661 NPError WebPluginDelegatePepper::Device3DDestroyBuffer( |
| 855 NPDeviceContext3D* context, | 662 NPDeviceContext3D* context, |
| 856 int32 id) { | 663 int32 id) { |
| 857 if (!context) | 664 return NPERR_GENERIC_ERROR; |
| 858 return NPERR_GENERIC_ERROR; | |
| 859 | |
| 860 #if defined(ENABLE_GPU) | |
| 861 command_buffer_->DestroyTransferBuffer(id); | |
| 862 #endif // ENABLE_GPU | |
| 863 return NPERR_NO_ERROR; | |
| 864 } | 665 } |
| 865 | 666 |
| 866 NPError WebPluginDelegatePepper::Device3DMapBuffer( | 667 NPError WebPluginDelegatePepper::Device3DMapBuffer( |
| 867 NPDeviceContext3D* context, | 668 NPDeviceContext3D* context, |
| 868 int32 id, | 669 int32 id, |
| 869 NPDeviceBuffer* np_buffer) { | 670 NPDeviceBuffer* np_buffer) { |
| 870 if (!context) | 671 return NPERR_GENERIC_ERROR; |
| 871 return NPERR_GENERIC_ERROR; | |
| 872 | |
| 873 #if defined(ENABLE_GPU) | |
| 874 Buffer gpu_buffer; | |
| 875 if (id == NP3DCommandBufferId) { | |
| 876 gpu_buffer = command_buffer_->GetRingBuffer(); | |
| 877 } else { | |
| 878 gpu_buffer = command_buffer_->GetTransferBuffer(id); | |
| 879 } | |
| 880 | |
| 881 np_buffer->ptr = gpu_buffer.ptr; | |
| 882 np_buffer->size = gpu_buffer.size; | |
| 883 if (!np_buffer->ptr) | |
| 884 return NPERR_GENERIC_ERROR; | |
| 885 #endif // ENABLE_GPU | |
| 886 | |
| 887 return NPERR_NO_ERROR; | |
| 888 } | 672 } |
| 889 | 673 |
| 890 NPError WebPluginDelegatePepper::Device3DGetNumConfigs(int32* num_configs) { | 674 NPError WebPluginDelegatePepper::Device3DGetNumConfigs(int32* num_configs) { |
| 891 if (!num_configs) | 675 return NPERR_GENERIC_ERROR; |
| 892 return NPERR_GENERIC_ERROR; | |
| 893 | |
| 894 *num_configs = 1; | |
| 895 return NPERR_NO_ERROR; | |
| 896 } | 676 } |
| 897 | 677 |
| 898 NPError WebPluginDelegatePepper::Device3DGetConfigAttribs( | 678 NPError WebPluginDelegatePepper::Device3DGetConfigAttribs( |
| 899 int32 config, | 679 int32 config, |
| 900 int32* attrib_list) { | 680 int32* attrib_list) { |
| 901 // Only one config available currently. | 681 return NPERR_GENERIC_ERROR; |
| 902 if (config != 0) | |
| 903 return NPERR_GENERIC_ERROR; | |
| 904 | |
| 905 if (attrib_list) { | |
| 906 for (int32* attrib_pair = attrib_list; *attrib_pair; attrib_pair += 2) { | |
| 907 switch (attrib_pair[0]) { | |
| 908 case NP3DAttrib_BufferSize: | |
| 909 attrib_pair[1] = 32; | |
| 910 break; | |
| 911 case NP3DAttrib_AlphaSize: | |
| 912 case NP3DAttrib_BlueSize: | |
| 913 case NP3DAttrib_GreenSize: | |
| 914 case NP3DAttrib_RedSize: | |
| 915 attrib_pair[1] = 8; | |
| 916 break; | |
| 917 case NP3DAttrib_DepthSize: | |
| 918 attrib_pair[1] = 24; | |
| 919 break; | |
| 920 case NP3DAttrib_StencilSize: | |
| 921 attrib_pair[1] = 8; | |
| 922 break; | |
| 923 case NP3DAttrib_SurfaceType: | |
| 924 attrib_pair[1] = 0; | |
| 925 break; | |
| 926 default: | |
| 927 return NPERR_GENERIC_ERROR; | |
| 928 } | |
| 929 } | |
| 930 } | |
| 931 | |
| 932 return NPERR_NO_ERROR; | |
| 933 } | 682 } |
| 934 | 683 |
| 935 NPError WebPluginDelegatePepper::Device3DCreateContext( | 684 NPError WebPluginDelegatePepper::Device3DCreateContext( |
| 936 int32 config, | 685 int32 config, |
| 937 const int32* attrib_list, | 686 const int32* attrib_list, |
| 938 NPDeviceContext3D** context) { | 687 NPDeviceContext3D** context) { |
| 939 if (!context) | 688 return NPERR_GENERIC_ERROR; |
| 940 return NPERR_GENERIC_ERROR; | |
| 941 | |
| 942 // Only one config available currently. | |
| 943 if (config != 0) | |
| 944 return NPERR_GENERIC_ERROR; | |
| 945 | |
| 946 // For now, just use the old API to initialize the context. | |
| 947 NPDeviceContext3DConfig old_config; | |
| 948 old_config.commandBufferSize = kDefaultCommandBufferSize; | |
| 949 if (attrib_list) { | |
| 950 for (const int32* attrib_pair = attrib_list; *attrib_pair; | |
| 951 attrib_pair += 2) { | |
| 952 switch (attrib_pair[0]) { | |
| 953 case NP3DAttrib_CommandBufferSize: | |
| 954 old_config.commandBufferSize = attrib_pair[1]; | |
| 955 break; | |
| 956 default: | |
| 957 return NPERR_GENERIC_ERROR; | |
| 958 } | |
| 959 } | |
| 960 } | |
| 961 | |
| 962 *context = new NPDeviceContext3D; | |
| 963 Device3DInitializeContext(&old_config, *context); | |
| 964 | |
| 965 // Flag the context as dynamically created by the browser. TODO(apatrick): | |
| 966 // take this out when all contexts are dynamically created. | |
| 967 Device3DImpl* impl = static_cast<Device3DImpl*>((*context)->reserved); | |
| 968 impl->dynamically_created = true; | |
| 969 | |
| 970 return NPERR_NO_ERROR; | |
| 971 } | 689 } |
| 972 | 690 |
| 973 NPError WebPluginDelegatePepper::Device3DRegisterCallback( | 691 NPError WebPluginDelegatePepper::Device3DRegisterCallback( |
| 974 NPP id, | 692 NPP id, |
| 975 NPDeviceContext3D* context, | 693 NPDeviceContext3D* context, |
| 976 int32 callback_type, | 694 int32 callback_type, |
| 977 NPDeviceGenericCallbackPtr callback, | 695 NPDeviceGenericCallbackPtr callback, |
| 978 void* callback_data) { | 696 void* callback_data) { |
| 979 if (!context) | 697 return NPERR_GENERIC_ERROR; |
| 980 return NPERR_GENERIC_ERROR; | |
| 981 | |
| 982 switch (callback_type) { | |
| 983 case NP3DCallback_Repaint: | |
| 984 context->repaintCallback = reinterpret_cast<NPDeviceContext3DRepaintPtr>( | |
| 985 callback); | |
| 986 break; | |
| 987 default: | |
| 988 return NPERR_GENERIC_ERROR; | |
| 989 } | |
| 990 | |
| 991 return NPERR_NO_ERROR; | |
| 992 } | 698 } |
| 993 | 699 |
| 994 NPError WebPluginDelegatePepper::Device3DSynchronizeContext( | 700 NPError WebPluginDelegatePepper::Device3DSynchronizeContext( |
| 995 NPP id, | 701 NPP id, |
| 996 NPDeviceContext3D* context, | 702 NPDeviceContext3D* context, |
| 997 NPDeviceSynchronizationMode mode, | 703 NPDeviceSynchronizationMode mode, |
| 998 const int32* input_attrib_list, | 704 const int32* input_attrib_list, |
| 999 int32* output_attrib_list, | 705 int32* output_attrib_list, |
| 1000 NPDeviceSynchronizeContextCallbackPtr callback, | 706 NPDeviceSynchronizeContextCallbackPtr callback, |
| 1001 void* callback_data) { | 707 void* callback_data) { |
| 1002 if (!context) | 708 return NPERR_GENERIC_ERROR; |
| 1003 return NPERR_GENERIC_ERROR; | |
| 1004 | |
| 1005 // Copy input attributes into context. | |
| 1006 if (input_attrib_list) { | |
| 1007 for (const int32* attrib_pair = input_attrib_list; | |
| 1008 *attrib_pair; | |
| 1009 attrib_pair += 2) { | |
| 1010 switch (attrib_pair[0]) { | |
| 1011 case NP3DAttrib_PutOffset: | |
| 1012 context->putOffset = attrib_pair[1]; | |
| 1013 break; | |
| 1014 default: | |
| 1015 return NPERR_GENERIC_ERROR; | |
| 1016 } | |
| 1017 } | |
| 1018 } | |
| 1019 | |
| 1020 // Use existing flush mechanism for now. | |
| 1021 if (mode != NPDeviceSynchronizationMode_Cached) { | |
| 1022 context->waitForProgress = mode == NPDeviceSynchronizationMode_Flush; | |
| 1023 Device3DFlushContext(id, context, callback, callback_data); | |
| 1024 } | |
| 1025 | |
| 1026 // Copy most recent output attributes from context. | |
| 1027 // To read output attributes after the completion of an asynchronous flush, | |
| 1028 // invoke SynchronizeContext again with mode | |
| 1029 // NPDeviceSynchronizationMode_Cached from the callback function. | |
| 1030 if (output_attrib_list) { | |
| 1031 for (int32* attrib_pair = output_attrib_list; | |
| 1032 *attrib_pair; | |
| 1033 attrib_pair += 2) { | |
| 1034 switch (attrib_pair[0]) { | |
| 1035 case NP3DAttrib_CommandBufferSize: | |
| 1036 attrib_pair[1] = context->commandBufferSize; | |
| 1037 break; | |
| 1038 case NP3DAttrib_GetOffset: | |
| 1039 attrib_pair[1] = context->getOffset; | |
| 1040 break; | |
| 1041 case NP3DAttrib_PutOffset: | |
| 1042 attrib_pair[1] = context->putOffset; | |
| 1043 break; | |
| 1044 case NP3DAttrib_Token: | |
| 1045 attrib_pair[1] = context->token; | |
| 1046 break; | |
| 1047 default: | |
| 1048 return NPERR_GENERIC_ERROR; | |
| 1049 } | |
| 1050 } | |
| 1051 } | |
| 1052 | |
| 1053 return NPERR_NO_ERROR; | |
| 1054 } | 709 } |
| 1055 | 710 |
| 1056 NPError WebPluginDelegatePepper::DeviceAudioQueryCapability(int32 capability, | 711 NPError WebPluginDelegatePepper::DeviceAudioQueryCapability(int32 capability, |
| 1057 int32* value) { | 712 int32* value) { |
| 1058 // TODO(neb,cpu) implement QueryCapability | 713 // TODO(neb,cpu) implement QueryCapability |
| 1059 return NPERR_GENERIC_ERROR; | 714 return NPERR_GENERIC_ERROR; |
| 1060 } | 715 } |
| 1061 | 716 |
| 1062 NPError WebPluginDelegatePepper::DeviceAudioQueryConfig( | 717 NPError WebPluginDelegatePepper::DeviceAudioQueryConfig( |
| 1063 const NPDeviceContextAudioConfig* request, | 718 const NPDeviceContextAudioConfig* request, |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 pdf_output_done_ = false; | 1031 pdf_output_done_ = false; |
| 1377 #endif // defined(OS_LINUX) | 1032 #endif // defined(OS_LINUX) |
| 1378 } | 1033 } |
| 1379 | 1034 |
| 1380 WebPluginDelegatePepper::WebPluginDelegatePepper( | 1035 WebPluginDelegatePepper::WebPluginDelegatePepper( |
| 1381 const base::WeakPtr<RenderView>& render_view, | 1036 const base::WeakPtr<RenderView>& render_view, |
| 1382 webkit::npapi::PluginInstance *instance) | 1037 webkit::npapi::PluginInstance *instance) |
| 1383 : render_view_(render_view), | 1038 : render_view_(render_view), |
| 1384 plugin_(NULL), | 1039 plugin_(NULL), |
| 1385 instance_(instance), | 1040 instance_(instance), |
| 1386 nested_delegate_(NULL), | |
| 1387 current_printer_dpi_(-1), | 1041 current_printer_dpi_(-1), |
| 1388 #if defined (OS_LINUX) | 1042 #if defined (OS_LINUX) |
| 1389 num_pages_(0), | 1043 num_pages_(0), |
| 1390 pdf_output_done_(false), | 1044 pdf_output_done_(false), |
| 1391 #endif // (OS_LINUX) | 1045 #endif // (OS_LINUX) |
| 1392 #if defined(ENABLE_GPU) | |
| 1393 command_buffer_(NULL), | |
| 1394 method_factory3d_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | |
| 1395 #endif | |
| 1396 find_identifier_(-1), | 1046 find_identifier_(-1), |
| 1397 current_choose_file_callback_(NULL), | 1047 current_choose_file_callback_(NULL), |
| 1398 current_choose_file_user_data_(NULL) { | 1048 current_choose_file_user_data_(NULL) { |
| 1399 // For now we keep a window struct, although it isn't used. | 1049 // For now we keep a window struct, although it isn't used. |
| 1400 memset(&window_, 0, sizeof(window_)); | 1050 memset(&window_, 0, sizeof(window_)); |
| 1401 // All Pepper plugins are windowless and transparent. | 1051 // All Pepper plugins are windowless and transparent. |
| 1402 // TODO(sehr): disable resetting these NPPVs by plugins. | 1052 // TODO(sehr): disable resetting these NPPVs by plugins. |
| 1403 instance->set_windowless(true); | 1053 instance->set_windowless(true); |
| 1404 instance->set_transparent(true); | 1054 instance->set_transparent(true); |
| 1405 } | 1055 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1423 window_.type = NPWindowTypeDrawable; | 1073 window_.type = NPWindowTypeDrawable; |
| 1424 instance()->NPP_SetWindow(&window_); | 1074 instance()->NPP_SetWindow(&window_); |
| 1425 } | 1075 } |
| 1426 | 1076 |
| 1427 void WebPluginDelegatePepper::PluginDestroyed() { | 1077 void WebPluginDelegatePepper::PluginDestroyed() { |
| 1428 delete this; | 1078 delete this; |
| 1429 } | 1079 } |
| 1430 | 1080 |
| 1431 void WebPluginDelegatePepper::Paint(WebKit::WebCanvas* canvas, | 1081 void WebPluginDelegatePepper::Paint(WebKit::WebCanvas* canvas, |
| 1432 const gfx::Rect& rect) { | 1082 const gfx::Rect& rect) { |
| 1433 if (nested_delegate_) { | 1083 // Blit from background_context to context. |
| 1434 // TODO(apatrick): The GPU plugin will render to an offscreen render target. | 1084 if (!committed_bitmap_.isNull()) { |
| 1435 // Need to copy it to the screen here. | |
| 1436 } else { | |
| 1437 // Blit from background_context to context. | |
| 1438 if (!committed_bitmap_.isNull()) { | |
| 1439 #if defined(OS_MACOSX) | 1085 #if defined(OS_MACOSX) |
| 1440 DrawSkBitmapToCanvas(committed_bitmap_, canvas, window_rect_, | 1086 DrawSkBitmapToCanvas(committed_bitmap_, canvas, window_rect_, |
| 1441 static_cast<int>(CGBitmapContextGetHeight(canvas))); | 1087 static_cast<int>(CGBitmapContextGetHeight(canvas))); |
| 1442 #else | 1088 #else |
| 1443 canvas->drawBitmap(committed_bitmap_, | 1089 canvas->drawBitmap(committed_bitmap_, |
| 1444 SkIntToScalar(window_rect_.origin().x()), | 1090 SkIntToScalar(window_rect_.origin().x()), |
| 1445 SkIntToScalar(window_rect_.origin().y())); | 1091 SkIntToScalar(window_rect_.origin().y())); |
| 1446 #endif | 1092 #endif |
| 1447 } | |
| 1448 } | 1093 } |
| 1449 } | 1094 } |
| 1450 | 1095 |
| 1451 void WebPluginDelegatePepper::Print(gfx::NativeDrawingContext context) { | 1096 void WebPluginDelegatePepper::Print(gfx::NativeDrawingContext context) { |
| 1452 NOTIMPLEMENTED(); | 1097 NOTIMPLEMENTED(); |
| 1453 } | 1098 } |
| 1454 | 1099 |
| 1455 void WebPluginDelegatePepper::InstallMissingPlugin() { | 1100 void WebPluginDelegatePepper::InstallMissingPlugin() { |
| 1456 NOTIMPLEMENTED(); | 1101 NOTIMPLEMENTED(); |
| 1457 } | 1102 } |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1577 case NPEventType_Device: | 1222 case NPEventType_Device: |
| 1578 // NOTIMPLEMENTED(); | 1223 // NOTIMPLEMENTED(); |
| 1579 break; | 1224 break; |
| 1580 } | 1225 } |
| 1581 bool rv = instance()->NPP_HandleEvent(&npevent) != 0; | 1226 bool rv = instance()->NPP_HandleEvent(&npevent) != 0; |
| 1582 if (cursor_.get()) | 1227 if (cursor_.get()) |
| 1583 *cursor_info = *cursor_; | 1228 *cursor_info = *cursor_; |
| 1584 return rv; | 1229 return rv; |
| 1585 } | 1230 } |
| 1586 | 1231 |
| 1587 #if defined(ENABLE_GPU) | |
| 1588 | |
| 1589 void WebPluginDelegatePepper::ScheduleHandleRepaint( | |
| 1590 NPP npp, NPDeviceContext3D* context) { | |
| 1591 command_buffer_->SetNotifyRepaintTask(method_factory3d_.NewRunnableMethod( | |
| 1592 &WebPluginDelegatePepper::ForwardHandleRepaint, | |
| 1593 npp, | |
| 1594 context)); | |
| 1595 } | |
| 1596 | |
| 1597 void WebPluginDelegatePepper::ForwardHandleRepaint( | |
| 1598 NPP npp, NPDeviceContext3D* context) { | |
| 1599 if (context->repaintCallback) | |
| 1600 context->repaintCallback(npp, context); | |
| 1601 ScheduleHandleRepaint(npp, context); | |
| 1602 } | |
| 1603 | |
| 1604 void WebPluginDelegatePepper::Synchronize3DContext( | |
| 1605 NPDeviceContext3D* context, | |
| 1606 const gpu::CommandBuffer::State& state) { | |
| 1607 context->getOffset = state.get_offset; | |
| 1608 context->putOffset = state.put_offset; | |
| 1609 context->token = state.token; | |
| 1610 context->error = static_cast<NPDeviceContext3DError>(state.error); | |
| 1611 } | |
| 1612 | |
| 1613 void WebPluginDelegatePepper::Device3DUpdateState( | |
| 1614 NPP npp, | |
| 1615 NPDeviceContext3D* context, | |
| 1616 NPDeviceFlushContextCallbackPtr callback, | |
| 1617 void* user_data) { | |
| 1618 if (command_buffer_) { | |
| 1619 Synchronize3DContext(context, command_buffer_->GetLastState()); | |
| 1620 if (callback) | |
| 1621 callback(npp, context, NPERR_NO_ERROR, user_data); | |
| 1622 } | |
| 1623 } | |
| 1624 | |
| 1625 #endif // ENABLE_GPU | |
| 1626 | |
| 1627 void WebPluginDelegatePepper::SendNestedDelegateGeometryToBrowser( | |
| 1628 const gfx::Rect& window_rect, | |
| 1629 const gfx::Rect& clip_rect) { | |
| 1630 // Inform the browser about the location of the plugin on the page. | |
| 1631 // It appears that initially the plugin does not get laid out correctly -- | |
| 1632 // possibly due to lazy creation of the nested delegate. | |
| 1633 if (!nested_delegate_ || | |
| 1634 !nested_delegate_->GetPluginWindowHandle() || | |
| 1635 !render_view_) { | |
| 1636 return; | |
| 1637 } | |
| 1638 | |
| 1639 webkit::npapi::WebPluginGeometry geom; | |
| 1640 geom.window = nested_delegate_->GetPluginWindowHandle(); | |
| 1641 geom.window_rect = window_rect; | |
| 1642 geom.clip_rect = clip_rect; | |
| 1643 // Rects_valid must be true for this to work in the Gtk port; | |
| 1644 // hopefully not having the cutout rects will not cause incorrect | |
| 1645 // clipping. | |
| 1646 geom.rects_valid = true; | |
| 1647 geom.visible = true; | |
| 1648 render_view_->DidMovePlugin(geom); | |
| 1649 } | |
| 1650 | |
| 1651 bool WebPluginDelegatePepper::CalculatePrintedPageDimensions( | 1232 bool WebPluginDelegatePepper::CalculatePrintedPageDimensions( |
| 1652 int page_number, | 1233 int page_number, |
| 1653 NPPPrintExtensions* print_extensions, | 1234 NPPPrintExtensions* print_extensions, |
| 1654 gfx::Size* page_dimensions) { | 1235 gfx::Size* page_dimensions) { |
| 1655 int32 width_in_pixels = 0; | 1236 int32 width_in_pixels = 0; |
| 1656 int32 height_in_pixels = 0; | 1237 int32 height_in_pixels = 0; |
| 1657 NPError err = print_extensions->getRasterDimensions( | 1238 NPError err = print_extensions->getRasterDimensions( |
| 1658 instance()->npp(), page_number, &width_in_pixels, &height_in_pixels); | 1239 instance()->npp(), page_number, &width_in_pixels, &height_in_pixels); |
| 1659 if (err != NPERR_NO_ERROR) | 1240 if (err != NPERR_NO_ERROR) |
| 1660 return false; | 1241 return false; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 CGRect bounds; | 1341 CGRect bounds; |
| 1761 bounds.origin.x = dest_rect.x(); | 1342 bounds.origin.x = dest_rect.x(); |
| 1762 bounds.origin.y = canvas_height - dest_rect.y() - dest_rect.height(); | 1343 bounds.origin.y = canvas_height - dest_rect.y() - dest_rect.height(); |
| 1763 bounds.size.width = dest_rect.width(); | 1344 bounds.size.width = dest_rect.width(); |
| 1764 bounds.size.height = dest_rect.height(); | 1345 bounds.size.height = dest_rect.height(); |
| 1765 | 1346 |
| 1766 CGContextDrawImage(canvas, bounds, image); | 1347 CGContextDrawImage(canvas, bounds, image); |
| 1767 CGContextRestoreGState(canvas); | 1348 CGContextRestoreGState(canvas); |
| 1768 } | 1349 } |
| 1769 #endif // defined(OS_MACOSX) | 1350 #endif // defined(OS_MACOSX) |
| OLD | NEW |