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

Side by Side Diff: webkit/plugins/npapi/plugin_host.cc

Issue 6722021: Be more thorough checking for NULL NPP values (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Missed one Created 9 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/plugins/npapi/plugin_host.h" 5 #include "webkit/plugins/npapi/plugin_host.h"
6 6
7 #include "app/gfx/gl/gl_context.h" 7 #include "app/gfx/gl/gl_context.h"
8 #include "app/gfx/gl/gl_implementation.h" 8 #include "app/gfx/gl/gl_implementation.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 // plug-in drawing occurs, returns HWND 686 // plug-in drawing occurs, returns HWND
687 // NPNVjavascriptEnabledBool: tells whether Javascript is enabled 687 // NPNVjavascriptEnabledBool: tells whether Javascript is enabled
688 // NPNVasdEnabledBool: tells whether SmartUpdate is enabled 688 // NPNVasdEnabledBool: tells whether SmartUpdate is enabled
689 // NPNVOfflineBool: tells whether offline-mode is enabled 689 // NPNVOfflineBool: tells whether offline-mode is enabled
690 690
691 NPError rv = NPERR_GENERIC_ERROR; 691 NPError rv = NPERR_GENERIC_ERROR;
692 692
693 switch (static_cast<int>(variable)) { 693 switch (static_cast<int>(variable)) {
694 case NPNVWindowNPObject: { 694 case NPNVWindowNPObject: {
695 scoped_refptr<PluginInstance> plugin(FindInstance(id)); 695 scoped_refptr<PluginInstance> plugin(FindInstance(id));
696 if (!plugin.get()) {
ananta 2011/03/23 18:39:26 Should we move this code outside the switch block
davidben 2011/03/23 18:51:08 Some variables don't seem to require a plugin inst
697 NOTREACHED();
698 return NPERR_INVALID_INSTANCE_ERROR;
699 }
696 NPObject *np_object = plugin->webplugin()->GetWindowScriptNPObject(); 700 NPObject *np_object = plugin->webplugin()->GetWindowScriptNPObject();
697 // Return value is expected to be retained, as 701 // Return value is expected to be retained, as
698 // described here: 702 // described here:
699 // <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess> 703 // <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess>
700 if (np_object) { 704 if (np_object) {
701 WebBindings::retainObject(np_object); 705 WebBindings::retainObject(np_object);
702 void **v = (void **)value; 706 void **v = (void **)value;
703 *v = np_object; 707 *v = np_object;
704 rv = NPERR_NO_ERROR; 708 rv = NPERR_NO_ERROR;
705 } else { 709 } else {
706 NOTREACHED(); 710 NOTREACHED();
707 } 711 }
708 break; 712 break;
709 } 713 }
710 case NPNVPluginElementNPObject: { 714 case NPNVPluginElementNPObject: {
711 scoped_refptr<PluginInstance> plugin(FindInstance(id)); 715 scoped_refptr<PluginInstance> plugin(FindInstance(id));
716 if (!plugin.get()) {
717 NOTREACHED();
718 return NPERR_INVALID_INSTANCE_ERROR;
719 }
712 NPObject *np_object = plugin->webplugin()->GetPluginElement(); 720 NPObject *np_object = plugin->webplugin()->GetPluginElement();
713 // Return value is expected to be retained, as 721 // Return value is expected to be retained, as
714 // described here: 722 // described here:
715 // <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess> 723 // <http://www.mozilla.org/projects/plugins/npruntime.html#browseraccess>
716 if (np_object) { 724 if (np_object) {
717 WebBindings::retainObject(np_object); 725 WebBindings::retainObject(np_object);
718 void** v = static_cast<void**>(value); 726 void** v = static_cast<void**>(value);
719 *v = np_object; 727 *v = np_object;
720 rv = NPERR_NO_ERROR; 728 rv = NPERR_NO_ERROR;
721 } else { 729 } else {
722 NOTREACHED(); 730 NOTREACHED();
723 } 731 }
724 break; 732 break;
725 } 733 }
726 #if !defined(OS_MACOSX) // OS X doesn't have windowed plugins. 734 #if !defined(OS_MACOSX) // OS X doesn't have windowed plugins.
727 case NPNVnetscapeWindow: { 735 case NPNVnetscapeWindow: {
728 scoped_refptr<PluginInstance> plugin = FindInstance(id); 736 scoped_refptr<PluginInstance> plugin = FindInstance(id);
729 if (!plugin.get()) { 737 if (!plugin.get()) {
730 NOTREACHED(); 738 NOTREACHED();
731 return NPERR_GENERIC_ERROR; 739 return NPERR_INVALID_INSTANCE_ERROR;
732 } 740 }
733 gfx::PluginWindowHandle handle = plugin->window_handle(); 741 gfx::PluginWindowHandle handle = plugin->window_handle();
734 *((void**)value) = (void*)handle; 742 *((void**)value) = (void*)handle;
735 rv = NPERR_NO_ERROR; 743 rv = NPERR_NO_ERROR;
736 break; 744 break;
737 } 745 }
738 #endif 746 #endif
739 case NPNVjavascriptEnabledBool: { 747 case NPNVjavascriptEnabledBool: {
740 // yes, JS is enabled. 748 // yes, JS is enabled.
741 *((void**)value) = (void*)1; 749 *((void**)value) = (void*)1;
(...skipping 14 matching lines...) Expand all
756 #endif 764 #endif
757 case NPNVSupportsWindowless: { 765 case NPNVSupportsWindowless: {
758 NPBool* supports_windowless = reinterpret_cast<NPBool*>(value); 766 NPBool* supports_windowless = reinterpret_cast<NPBool*>(value);
759 *supports_windowless = true; 767 *supports_windowless = true;
760 rv = NPERR_NO_ERROR; 768 rv = NPERR_NO_ERROR;
761 break; 769 break;
762 } 770 }
763 case NPNVprivateModeBool: { 771 case NPNVprivateModeBool: {
764 NPBool* private_mode = reinterpret_cast<NPBool*>(value); 772 NPBool* private_mode = reinterpret_cast<NPBool*>(value);
765 scoped_refptr<PluginInstance> plugin(FindInstance(id)); 773 scoped_refptr<PluginInstance> plugin(FindInstance(id));
774 if (!plugin.get()) {
775 NOTREACHED();
776 return NPERR_INVALID_INSTANCE_ERROR;
777 }
766 *private_mode = plugin->webplugin()->IsOffTheRecord(); 778 *private_mode = plugin->webplugin()->IsOffTheRecord();
767 rv = NPERR_NO_ERROR; 779 rv = NPERR_NO_ERROR;
768 break; 780 break;
769 } 781 }
770 case webkit::npapi::default_plugin::kMissingPluginStatusStart + 782 case webkit::npapi::default_plugin::kMissingPluginStatusStart +
771 webkit::npapi::default_plugin::MISSING_PLUGIN_AVAILABLE: 783 webkit::npapi::default_plugin::MISSING_PLUGIN_AVAILABLE:
772 // fall through 784 // fall through
773 case webkit::npapi::default_plugin::kMissingPluginStatusStart + 785 case webkit::npapi::default_plugin::kMissingPluginStatusStart +
774 webkit::npapi::default_plugin::MISSING_PLUGIN_USER_STARTED_DOWNLOAD: { 786 webkit::npapi::default_plugin::MISSING_PLUGIN_USER_STARTED_DOWNLOAD: {
775 // This is a hack for the default plugin to send notification to 787 // This is a hack for the default plugin to send notification to
776 // renderer. Even though we check if the plugin is the default plugin, 788 // renderer. Even though we check if the plugin is the default plugin,
777 // we still need to worry about future standard change that may conflict 789 // we still need to worry about future standard change that may conflict
778 // with the variable definition, in order to avoid duplicate case clauses 790 // with the variable definition, in order to avoid duplicate case clauses
779 // in this big switch statement. 791 // in this big switch statement.
780 scoped_refptr<PluginInstance> plugin(FindInstance(id)); 792 scoped_refptr<PluginInstance> plugin(FindInstance(id));
793 if (!plugin.get()) {
794 NOTREACHED();
795 return NPERR_INVALID_INSTANCE_ERROR;
796 }
781 if (plugin->plugin_lib()->plugin_info().path.value() == 797 if (plugin->plugin_lib()->plugin_info().path.value() ==
782 webkit::npapi::kDefaultPluginLibraryName) { 798 webkit::npapi::kDefaultPluginLibraryName) {
783 plugin->webplugin()->OnMissingPluginStatus(variable - 799 plugin->webplugin()->OnMissingPluginStatus(variable -
784 webkit::npapi::default_plugin::kMissingPluginStatusStart); 800 webkit::npapi::default_plugin::kMissingPluginStatusStart);
785 } 801 }
786 break; 802 break;
787 } 803 }
788 #if defined(OS_MACOSX) 804 #if defined(OS_MACOSX)
789 case NPNVpluginDrawingModel: { 805 case NPNVpluginDrawingModel: {
790 // return the drawing model that was negotiated when we initialized. 806 // return the drawing model that was negotiated when we initialized.
791 scoped_refptr<PluginInstance> plugin(FindInstance(id)); 807 scoped_refptr<PluginInstance> plugin(FindInstance(id));
808 if (!plugin.get()) {
809 NOTREACHED();
810 return NPERR_INVALID_INSTANCE_ERROR;
811 }
792 *reinterpret_cast<int*>(value) = plugin->drawing_model(); 812 *reinterpret_cast<int*>(value) = plugin->drawing_model();
793 rv = NPERR_NO_ERROR; 813 rv = NPERR_NO_ERROR;
794 break; 814 break;
795 } 815 }
796 #ifndef NP_NO_QUICKDRAW 816 #ifndef NP_NO_QUICKDRAW
797 case NPNVsupportsQuickDrawBool: { 817 case NPNVsupportsQuickDrawBool: {
798 // We do not admit to supporting the QuickDraw drawing model. The logic 818 // We do not admit to supporting the QuickDraw drawing model. The logic
799 // here is that our QuickDraw plugin support is so rudimentary that we 819 // here is that our QuickDraw plugin support is so rudimentary that we
800 // only want to use it as a fallback to keep plugins from crashing: if a 820 // only want to use it as a fallback to keep plugins from crashing: if a
801 // plugin knows enough to ask, we want them to use CoreGraphics. 821 // plugin knows enough to ask, we want them to use CoreGraphics.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 DVLOG(1) << "NPN_GetValue(" << variable << ") is not implemented yet."; 882 DVLOG(1) << "NPN_GetValue(" << variable << ") is not implemented yet.";
863 break; 883 break;
864 } 884 }
865 return rv; 885 return rv;
866 } 886 }
867 887
868 NPError NPN_SetValue(NPP id, NPPVariable variable, void* value) { 888 NPError NPN_SetValue(NPP id, NPPVariable variable, void* value) {
869 // Allows the plugin to set various modes 889 // Allows the plugin to set various modes
870 890
871 scoped_refptr<PluginInstance> plugin(FindInstance(id)); 891 scoped_refptr<PluginInstance> plugin(FindInstance(id));
892 if (!plugin.get()) {
893 NOTREACHED();
894 return NPERR_INVALID_INSTANCE_ERROR;
895 }
872 switch(variable) { 896 switch(variable) {
873 case NPPVpluginWindowBool: { 897 case NPPVpluginWindowBool: {
874 // Sets windowless mode for display of the plugin 898 // Sets windowless mode for display of the plugin
875 // Note: the documentation at 899 // Note: the documentation at
876 // http://developer.mozilla.org/en/docs/NPN_SetValue is wrong. When 900 // http://developer.mozilla.org/en/docs/NPN_SetValue is wrong. When
877 // value is NULL, the mode is set to true. This is the same way Mozilla 901 // value is NULL, the mode is set to true. This is the same way Mozilla
878 // works. 902 // works.
879 plugin->set_windowless(value == 0); 903 plugin->set_windowless(value == 0);
880 return NPERR_NO_ERROR; 904 return NPERR_NO_ERROR;
881 } 905 }
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 } 1156 }
1133 1157
1134 void NPN_URLRedirectResponse(NPP instance, void* notify_data, NPBool allow) { 1158 void NPN_URLRedirectResponse(NPP instance, void* notify_data, NPBool allow) {
1135 scoped_refptr<PluginInstance> plugin(FindInstance(instance)); 1159 scoped_refptr<PluginInstance> plugin(FindInstance(instance));
1136 if (plugin.get()) { 1160 if (plugin.get()) {
1137 plugin->URLRedirectResponse(!!allow, notify_data); 1161 plugin->URLRedirectResponse(!!allow, notify_data);
1138 } 1162 }
1139 } 1163 }
1140 1164
1141 } // extern "C" 1165 } // extern "C"
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698