Back to index

lightning-sunbird  0.9+nobinonly
nsPluginSafety.h
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is mozilla.org code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #ifndef nsPluginSafety_h__
00039 #define nsPluginSafety_h__
00040 
00041 #include "npapi.h"
00042 #include "nsIPluginHost.h"
00043 #include "nsIPrefBranch.h"
00044 #include "nsIPrefService.h"
00045 
00046 #if defined(XP_WIN) && !defined(WINCE)
00047 #define CALL_SAFETY_ON
00048 #endif
00049 
00050 #ifdef CALL_SAFETY_ON
00051 
00052 extern PRBool gSkipPluginSafeCalls;
00053 
00054 #define NS_INIT_PLUGIN_SAFE_CALLS                               \
00055 PR_BEGIN_MACRO                                                  \
00056   nsresult res;                                                 \
00057   nsCOMPtr<nsIPrefBranch> pref(do_GetService(NS_PREFSERVICE_CONTRACTID, &res)); \
00058   if(NS_SUCCEEDED(res) && pref)                                 \
00059     res = pref->GetBoolPref("plugin.dont_try_safe_calls", &gSkipPluginSafeCalls);\
00060 PR_END_MACRO
00061 
00062 #define NS_TRY_SAFE_CALL_RETURN(ret, fun, library, pluginInst) \
00063 PR_BEGIN_MACRO                                     \
00064   if(gSkipPluginSafeCalls)                         \
00065     ret = fun;                                     \
00066   else                                             \
00067   {                                                \
00068     try                                            \
00069     {                                              \
00070       ret = fun;                                   \
00071     }                                              \
00072     catch(...)                                     \
00073     {                                              \
00074       nsresult res;                                \
00075       nsCOMPtr<nsIPluginHost> host(do_GetService(kCPluginManagerCID, &res));\
00076       if(NS_SUCCEEDED(res) && (host != nsnull))    \
00077         host->HandleBadPlugin(library, pluginInst);\
00078       ret = (NPError)NS_ERROR_FAILURE;             \
00079     }                                              \
00080   }                                                \
00081 PR_END_MACRO
00082 
00083 #define NS_TRY_SAFE_CALL_VOID(fun, library, pluginInst) \
00084 PR_BEGIN_MACRO                              \
00085   if(gSkipPluginSafeCalls)                  \
00086     fun;                                    \
00087   else                                      \
00088   {                                         \
00089     try                                     \
00090     {                                       \
00091       fun;                                  \
00092     }                                       \
00093     catch(...)                              \
00094     {                                       \
00095       nsresult res;                         \
00096       nsCOMPtr<nsIPluginHost> host(do_GetService(kCPluginManagerCID, &res));\
00097       if(NS_SUCCEEDED(res) && (host != nsnull))\
00098         host->HandleBadPlugin(library, pluginInst);\
00099     }                                       \
00100   }                                         \
00101 PR_END_MACRO
00102 
00103 #else // vanilla calls
00104 
00105 #define NS_TRY_SAFE_CALL_RETURN(ret, fun, library, pluginInst) \
00106 PR_BEGIN_MACRO                                     \
00107   ret = fun;                                       \
00108 PR_END_MACRO
00109 
00110 #define NS_TRY_SAFE_CALL_VOID(fun, library, pluginInst) \
00111 PR_BEGIN_MACRO                              \
00112   fun;                                      \
00113 PR_END_MACRO
00114 
00115 #endif // CALL_SAFETY_ON
00116 
00117 #endif //nsPluginSafety_h__
00118