diff --git a/extensions/layout-debug/plugin/createIDL.bat b/extensions/layout-debug/plugin/createIDL.bat new file mode 100755 index 00000000000..e69de29bb2d diff --git a/extensions/layout-debug/plugin/makefile.win b/extensions/layout-debug/plugin/makefile.win new file mode 100644 index 00000000000..56cc5f68dfd --- /dev/null +++ b/extensions/layout-debug/plugin/makefile.win @@ -0,0 +1,83 @@ +#!nmake +# +# The contents of this file are subject to the Netscape Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/NPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): + +DEPTH=..\..\.. +MODULE = npdebug +REQUIRES= xpcom \ + dom \ + necko\ + string \ + widget \ + locale \ + view \ + pref \ + gfx2 \ + imglib2 \ + unicharutil \ + java \ + debug \ + $(NULL) + +include <$(DEPTH)\config\config.mak> + + + + +XPIDLSRCS = \ + .\nsIDebugPlugin.idl \ + $(NULL) + +MAKE_OBJ_TYPE = DLL +DLLNAME = npdebug +RESFILE = npdebug.res +DEFFILE = npdebug.def +DLL=.\$(OBJDIR)\$(DLLNAME).dll + +CFLAGS = $(CFLAGS) -I.\include + +OBJS = \ + .\$(OBJDIR)\plugin.obj \ + .\$(OBJDIR)\nsScriptablePeer.obj \ + $(NULL) + +LLIBS = \ + .\common\$(OBJDIR)\plugingate.lib \ + $(DIST)\lib\xpcom.lib \ + $(NULL) + +WIN_LIBS = version.lib + +include <$(DEPTH)\config\rules.mak> + +# don't forget to remove files exported by default +libs:: $(DLL) + $(RM) $(XPDIST)\idl\nsIDebugPlugin.idl + $(RM) $(XPDIST)\include\nsIDebugPlugin.h +# $(RM) $(DIST)\bin\components\$(DLLNAME).xpt + $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin\plugins + + +clobber:: + $(RM) *.sbr + $(RM) $(XPDIST)\idl\nsIDebugPlugin.idl + $(RM) $(XPDIST)\include\nsIDebugPlugin.h + $(RM) $(DIST)\bin\components\$(DLLNAME).xpt + $(RM) $(DIST)\bin\plugins\$(DLLNAME).dll diff --git a/extensions/layout-debug/plugin/nsIDebugPlugin.h b/extensions/layout-debug/plugin/nsIDebugPlugin.h new file mode 100644 index 00000000000..01c7dbac824 --- /dev/null +++ b/extensions/layout-debug/plugin/nsIDebugPlugin.h @@ -0,0 +1,122 @@ +/* + * DO NOT EDIT. THIS FILE IS GENERATED FROM nsIDebugPlugin.idl + */ + +#ifndef __gen_nsIDebugPlugin_h__ +#define __gen_nsIDebugPlugin_h__ + + +#ifndef __gen_nsISupports_h__ +#include "nsISupports.h" +#endif + +/* For IDL files that don't want to include root IDL files. */ +#ifndef NS_NO_VTABLE +#define NS_NO_VTABLE +#endif + +/* starting interface: nsIDebugPlugin */ +#define NS_IDEBUGPLUGIN_IID_STR "482e1890-1fe5-11d5-9cf8-0060b0fbd8ac" + +#define NS_IDEBUGPLUGIN_IID \ + {0x482e1890, 0x1fe5, 0x11d5, \ + { 0x9c, 0xf8, 0x00, 0x60, 0xb0, 0xfb, 0xd8, 0xac }} + +class NS_NO_VTABLE nsIDebugPlugin : public nsISupports { + public: + + NS_DEFINE_STATIC_IID_ACCESSOR(NS_IDEBUGPLUGIN_IID) + + /* readonly attribute string version; */ + NS_IMETHOD GetVersion(char * *aVersion) = 0; + + /* void DumpLayout (in nsISupports aWindow, in wstring aFilePath, in wstring aFileName); */ + NS_IMETHOD DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName) = 0; + + /* void StartDirectorySearch (in string aFilePath); */ + NS_IMETHOD StartDirectorySearch(const char *aFilePath) = 0; + + /* void GetNextFileInDirectory ([retval] out string aFileName); */ + NS_IMETHOD GetNextFileInDirectory(char **aFileName) = 0; + +}; + +/* Use this macro when declaring classes that implement this interface. */ +#define NS_DECL_NSIDEBUGPLUGIN \ + NS_IMETHOD GetVersion(char * *aVersion); \ + NS_IMETHOD DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName); \ + NS_IMETHOD StartDirectorySearch(const char *aFilePath); \ + NS_IMETHOD GetNextFileInDirectory(char **aFileName); + +/* Use this macro to declare functions that forward the behavior of this interface to another object. */ +#define NS_FORWARD_NSIDEBUGPLUGIN(_to) \ + NS_IMETHOD GetVersion(char * *aVersion) { return _to GetVersion(aVersion); } \ + NS_IMETHOD DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName) { return _to DumpLayout(aWindow, aFilePath, aFileName); } \ + NS_IMETHOD StartDirectorySearch(const char *aFilePath) { return _to StartDirectorySearch(aFilePath); } \ + NS_IMETHOD GetNextFileInDirectory(char **aFileName) { return _to GetNextFileInDirectory(aFileName); } + +/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */ +#define NS_FORWARD_SAFE_NSIDEBUGPLUGIN(_to) \ + NS_IMETHOD GetVersion(char * *aVersion) { return !_to ? NS_ERROR_NULL_POINTER : _to->GetVersion(aVersion); } \ + NS_IMETHOD DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName) { return !_to ? NS_ERROR_NULL_POINTER : _to->DumpLayout(aWindow, aFilePath, aFileName); } \ + NS_IMETHOD StartDirectorySearch(const char *aFilePath) { return !_to ? NS_ERROR_NULL_POINTER : _to->StartDirectorySearch(aFilePath); } \ + NS_IMETHOD GetNextFileInDirectory(char **aFileName) { return !_to ? NS_ERROR_NULL_POINTER : _to->GetNextFileInDirectory(aFileName); } + +#if 0 +/* Use the code below as a template for the implementation class for this interface. */ + +/* Header file */ +class nsDebugPlugin : public nsIDebugPlugin +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIDEBUGPLUGIN + + nsDebugPlugin(); + virtual ~nsDebugPlugin(); + /* additional members */ +}; + +/* Implementation file */ +NS_IMPL_ISUPPORTS1(nsDebugPlugin, nsIDebugPlugin) + +nsDebugPlugin::nsDebugPlugin() +{ + NS_INIT_ISUPPORTS(); + /* member initializers and constructor code */ +} + +nsDebugPlugin::~nsDebugPlugin() +{ + /* destructor code */ +} + +/* readonly attribute string version; */ +NS_IMETHODIMP nsDebugPlugin::GetVersion(char * *aVersion) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +/* void DumpLayout (in nsISupports aWindow, in wstring aFilePath, in wstring aFileName); */ +NS_IMETHODIMP nsDebugPlugin::DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +/* void StartDirectorySearch (in string aFilePath); */ +NS_IMETHODIMP nsDebugPlugin::StartDirectorySearch(const char *aFilePath) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +/* void GetNextFileInDirectory ([retval] out string aFileName); */ +NS_IMETHODIMP nsDebugPlugin::GetNextFileInDirectory(char **aFileName) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + +/* End of implementation class template. */ +#endif + + +#endif /* __gen_nsIDebugPlugin_h__ */ diff --git a/extensions/layout-debug/plugin/nsIDebugPlugin.idl b/extensions/layout-debug/plugin/nsIDebugPlugin.idl new file mode 100644 index 00000000000..9895d78d551 --- /dev/null +++ b/extensions/layout-debug/plugin/nsIDebugPlugin.idl @@ -0,0 +1,32 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 2001 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ + +#include "nsISupports.idl" + +[scriptable, uuid(482e1890-1fe5-11d5-9cf8-0060b0fbd8ac)] +interface nsIDebugPlugin : nsISupports { + readonly attribute string version; + void DumpLayout(in nsISupports aWindow,in wstring aFilePath,in wstring aFileName); + void StartDirectorySearch(in string aFilePath); + void GetNextFileInDirectory([retval] out string aFileName); + +}; diff --git a/extensions/layout-debug/plugin/nsScriptablePeer.cpp b/extensions/layout-debug/plugin/nsScriptablePeer.cpp new file mode 100644 index 00000000000..34e80b729ab --- /dev/null +++ b/extensions/layout-debug/plugin/nsScriptablePeer.cpp @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// ============================== +// ! Scriptability related code ! +// ============================== + +///////////////////////////////////////////////////// +// +// This file implements the nsScriptablePeer object +// The native methods of this class are supposed to +// be callable from JavaScript +// +#include "plugin.h" + +static NS_DEFINE_IID(kIDebugPluginIID, NS_IDEBUGPLUGIN_IID); +static NS_DEFINE_IID(kIClassInfoIID, NS_ICLASSINFO_IID); +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); + +nsScriptablePeer::nsScriptablePeer(nsPluginInstance* aPlugin) +{ + mPlugin = aPlugin; + mRefCnt = 0; +} + +nsScriptablePeer::~nsScriptablePeer() +{ +} + +// AddRef, Release and QueryInterface are common methods and must +// be implemented for any interface +NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::AddRef() +{ + ++mRefCnt; + return mRefCnt; +} + +NS_IMETHODIMP_(nsrefcnt) nsScriptablePeer::Release() +{ + --mRefCnt; + if (mRefCnt == 0) { + delete this; + return 0; + } + return mRefCnt; +} + +// here nsScriptablePeer should return three interfaces it can be asked for by their iid's +// static casts are necessary to ensure that correct pointer is returned +NS_IMETHODIMP nsScriptablePeer::QueryInterface(const nsIID& aIID, void** aInstancePtr) +{ + if(!aInstancePtr) + return NS_ERROR_NULL_POINTER; + + if(aIID.Equals(kIDebugPluginIID)) { + *aInstancePtr = static_cast(this); + AddRef(); + return NS_OK; + } + + if(aIID.Equals(kIClassInfoIID)) { + *aInstancePtr = static_cast(this); + AddRef(); + return NS_OK; + } + + if(aIID.Equals(kISupportsIID)) { + *aInstancePtr = static_cast(static_cast(this)); + AddRef(); + return NS_OK; + } + + return NS_NOINTERFACE; +} + +// +// the following method will be callable from JavaScript +// +NS_IMETHODIMP nsScriptablePeer::GetVersion(char * *aVersion) +{ + if (mPlugin) + mPlugin->getVersion(aVersion); + return NS_OK; +} + + +NS_IMETHODIMP nsScriptablePeer::DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName) +{ + + if (mPlugin) + mPlugin->DumpLayout(aWindow,aFilePath,aFileName); + + + return NS_OK; +} + + +// +// the following method will be callable from JavaScript +// +NS_IMETHODIMP nsScriptablePeer::StartDirectorySearch(const char *aFilePath) +{ + + if (mPlugin) + mPlugin->StartDirectorySearch(aFilePath); + + return NS_OK; +} + + +NS_IMETHODIMP nsScriptablePeer::GetNextFileInDirectory(char **aFilePath) +{ + + if (mPlugin) + mPlugin->GetNextFileInDirectory(aFilePath); + + + return NS_OK; +} diff --git a/extensions/layout-debug/plugin/nsScriptablePeer.h b/extensions/layout-debug/plugin/nsScriptablePeer.h new file mode 100644 index 00000000000..fac4a713ea4 --- /dev/null +++ b/extensions/layout-debug/plugin/nsScriptablePeer.h @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +// ============================== +// ! Scriptability related code ! +// ============================== +// +// nsScriptablePeer - xpconnect scriptable peer +// + +#ifndef __nsScriptablePeer_h__ +#define __nsScriptablePeer_h__ + +#include "nsIDebugPlugin.h" +#include "nsIClassInfo.h" + +class nsPluginInstance; + +// We must implement nsIClassInfo because it signals the +// Mozilla Security Manager to allow calls from JavaScript. + +class nsClassInfoMixin : public nsIClassInfo +{ + // These flags are used by the DOM and security systems to signal that + // JavaScript callers are allowed to call this object's scritable methods. + NS_IMETHOD GetFlags(PRUint32 *aFlags) + {*aFlags = nsIClassInfo::PLUGIN_OBJECT | nsIClassInfo::DOM_OBJECT; + return NS_OK;} + NS_IMETHOD GetImplementationLanguage(PRUint32 *aImplementationLanguage) + {*aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; + return NS_OK;} + // The rest of the methods can safely return error codes... + NS_IMETHOD GetInterfaces(PRUint32 *count, nsIID * **array) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetHelperForLanguage(PRUint32 language, nsISupports **_retval) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetContractID(char * *aContractID) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetClassDescription(char * *aClassDescription) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetClassID(nsCID * *aClassID) + {return NS_ERROR_NOT_IMPLEMENTED;} + NS_IMETHOD GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) + {return NS_ERROR_NOT_IMPLEMENTED;} +}; + +class nsScriptablePeer : public nsIDebugPlugin, + public nsClassInfoMixin +{ +public: + nsScriptablePeer(nsPluginInstance* plugin); + ~nsScriptablePeer(); + +public: + // methods from nsISupports + NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr); + NS_IMETHOD_(nsrefcnt) AddRef(); + NS_IMETHOD_(nsrefcnt) Release(); + +protected: + nsrefcnt mRefCnt; + +public: + // native methods callable from JavaScript + NS_DECL_NSIDEBUGPLUGIN + +protected: + nsPluginInstance* mPlugin; +}; + +#endif \ No newline at end of file diff --git a/extensions/layout-debug/plugin/plugin.cpp b/extensions/layout-debug/plugin/plugin.cpp new file mode 100644 index 00000000000..4fbc9ef2146 --- /dev/null +++ b/extensions/layout-debug/plugin/plugin.cpp @@ -0,0 +1,330 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "plugin.h" +#include "nsIServiceManager.h" +#include "nsIMemory.h" +#include "nsIDebugObject.h" +#include "nsXPIDLString.h" +#include "nsIFile.h" +#include "nsILocalFile.h" +#include "nsISimpleEnumerator.h" +#include "nsMemory.h" +#include "nsNetUtil.h" + +// service manager which will give the access to all public browser services +// we will use memory service as an illustration +nsIServiceManager * gServiceManager = NULL; + +//static NS_DEFINE_IID(kMemoryCID, NS_MEMORY_CID); + +// Unix needs this +#ifdef XP_UNIX +#define MIME_TYPES_HANDLED "application/debug-plugin" +#define PLUGIN_NAME "Debug Plugin" +#define PLUGIN_DESCRIPTION "Debug Plugin" + +char* NPP_GetMIMEDescription(void) +{ + return(MIME_TYPES_HANDLED); +} +#endif //XP_UNIX + +////////////////////////////////////// +// +// general initialization and shutdown +// +NPError NS_PluginInitialize() +{ + // this is probably a good place to get the service manager + // note that Mozilla will add reference, so do not forget to release + nsISupports * sm = NULL; + + NPN_GetValue(NULL, NPNVserviceManager, &sm); + + // Mozilla returns nsIServiceManagerObsolete which can be queried for nsIServiceManager + if(sm) { + sm->QueryInterface(NS_GET_IID(nsIServiceManager), (void**)&gServiceManager); + NS_RELEASE(sm); + } + + return NPERR_NO_ERROR; +} + +void NS_PluginShutdown() +{ + // we should release the service manager + NS_IF_RELEASE(gServiceManager); + gServiceManager = NULL; +} + +///////////////////////////////////////////////////////////// +// +// construction and destruction of our plugin instance object +// +nsPluginInstanceBase * NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct) +{ + if(!aCreateDataStruct) + return NULL; + + nsPluginInstance * plugin = new nsPluginInstance(aCreateDataStruct->instance); + return plugin; +} + +void NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin) +{ + if(aPlugin) + delete aPlugin; +} + +//////////////////////////////////////// +// +// nsPluginInstance class implementation +// +nsPluginInstance::nsPluginInstance(NPP aInstance) : nsPluginInstanceBase(), + mInstance(aInstance), + mInitialized(FALSE), + mScriptablePeer(NULL) +{ + mString[0] = '\0'; +} + +nsPluginInstance::~nsPluginInstance() +{ + NS_IF_RELEASE(mScriptablePeer); +} + +NPBool nsPluginInstance::init(NPWindow* aWindow) +{ + if(aWindow == NULL) + return FALSE; + + mInitialized = TRUE; + return TRUE; +} + +void nsPluginInstance::shut() +{ + mInitialized = FALSE; +} + +NPBool nsPluginInstance::isInitialized() +{ + return mInitialized; +} + +void nsPluginInstance::getVersion(char* *aVersion) +{ + const char *ua = NPN_UserAgent(mInstance); + char*& version = *aVersion; + + // although we can use NPAPI NPN_MemAlloc call to allocate memory: + // version = (char*)NPN_MemAlloc(strlen(ua) + 1); + // for illustration purposed we use the service manager to access + // the memory service provided by Mozilla + nsIMemory * nsMemoryService = NULL; + + if (gServiceManager) { + // get service using its contract id and use it to allocate the memory + gServiceManager->GetServiceByContractID("@mozilla.org/xpcom/memory-service;1", NS_GET_IID(nsIMemory), (void **)&nsMemoryService); + if(nsMemoryService) + version = (char *)nsMemoryService->Alloc(strlen(ua) + 1); + } + + if (version) + strcpy(version, ua); + + // release service + NS_IF_RELEASE(nsMemoryService); +} + +//----------------------------------------------------- + +void +nsPluginInstance::DumpLayout(nsISupports *aWindow, const PRUnichar *aFilePath, const PRUnichar *aFileName) +{ + + nsIDebugObject *theDebugObject=NULL; + + if (gServiceManager) { + // get service using its contract id and use it to allocate the memory + gServiceManager->GetServiceByContractID("@mozilla.org/debug/debugobject;1", NS_GET_IID(nsIDebugObject), (void **)&theDebugObject); + if(theDebugObject){ + theDebugObject->DumpContent(aWindow,aFilePath,aFileName); + } + } +} + +//----------------------------------------------------- + +void +nsPluginInstance::StartDirectorySearch(const char *aFilePath) +{ +nsXPIDLCString dirPath; +nsresult rv; + + nsCOMPtr theDir = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID); + rv = NS_InitFileFromURLSpec(theDir, aFilePath); + + if (NS_FAILED(rv)){ + mIter = 0; + return; + } + + rv = theDir->GetDirectoryEntries(getter_AddRefs(mIter)); + if (NS_FAILED(rv)){ + mIter = 0; + return; + } +} + +//----------------------------------------------------- + +void +nsPluginInstance::GetNextFileInDirectory(char **aDirName) +{ +PRBool hasMore; +nsresult rv; +nsCOMPtr supports; +char* URLName; + + *aDirName = 0; + if ( 0 ==mIter ){ + return; + } + + while ( NS_SUCCEEDED(mIter->HasMoreElements(&hasMore)) ){ + rv = mIter->GetNext(getter_AddRefs(supports)); + if (NS_FAILED(rv)) + break; + nsCOMPtr dirEntry(do_QueryInterface(supports, &rv)); + if (NS_FAILED(rv)) + break; + nsXPIDLCString filePath; + char* afilepath; + rv = dirEntry->GetPath(&afilepath); + if (NS_FAILED(rv)) + continue; + + if( strstr(afilepath,".html") != 0 ) { + *aDirName = afilepath; + NS_GetURLSpecFromFile(dirEntry,&URLName); + *aDirName = URLName; + break; + } else { + nsMemory::Free(afilepath); + } + } +} + + +//----------------------------------------------------- + + +// ============================== +// ! Scriptability related code ! +// ============================== +// +// here the plugin is asked by Mozilla to tell if it is scriptable +// we should return a valid interface id and a pointer to +// nsScriptablePeer interface which we should have implemented +// and which should be defined in the corressponding *.xpt file +// in the bin/components folder +NPError nsPluginInstance::GetValue(NPPVariable aVariable, void *aValue) +{ + NPError rv = NPERR_NO_ERROR; + + switch (aVariable) { + case NPPVpluginScriptableInstance: { + // addref happens in getter, so we don't addref here + nsIDebugPlugin * scriptablePeer = getScriptablePeer(); + if (scriptablePeer) { + *(nsISupports **)aValue = scriptablePeer; + } else + rv = NPERR_OUT_OF_MEMORY_ERROR; + } + break; + + case NPPVpluginScriptableIID: { + static nsIID scriptableIID = NS_IDEBUGPLUGIN_IID; + nsIID* ptr = (nsIID *)NPN_MemAlloc(sizeof(nsIID)); + if (ptr) { + *ptr = scriptableIID; + *(nsIID **)aValue = ptr; + } else + rv = NPERR_OUT_OF_MEMORY_ERROR; + } + break; + +#ifdef XP_UNIX + // Unix needs some additional cases + case NPPVpluginNameString: + *((char **)aValue) = PLUGIN_NAME; + break; + case NPPVpluginDescriptionString: + *((char **)aValue) = PLUGIN_DESCRIPTION; + break; +#endif //XP_UNIX + + default: + break; + } + + return rv; +} + +// ============================== +// ! Scriptability related code ! +// ============================== +// +// this method will return the scriptable object (and create it if necessary) +nsIDebugPlugin* nsPluginInstance::getScriptablePeer() +{ + if (!mScriptablePeer) { + mScriptablePeer = new nsScriptablePeer(this); + if(!mScriptablePeer) + return NULL; + + NS_ADDREF(mScriptablePeer); + } + + // add reference for the caller requesting the object + NS_ADDREF(mScriptablePeer); + return mScriptablePeer; + + return NULL; +} diff --git a/extensions/layout-debug/plugin/plugin.h b/extensions/layout-debug/plugin/plugin.h new file mode 100644 index 00000000000..592f43a07bc --- /dev/null +++ b/extensions/layout-debug/plugin/plugin.h @@ -0,0 +1,80 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: NPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Netscape Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * Netscape Communications Corporation. + * Portions created by the Initial Developer are Copyright (C) 1998 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __PLUGIN_H__ +#define __PLUGIN_H__ + +#include "pluginbase.h" +#include "nsScriptablePeer.h" +#include "nsIFile.h" +#include "nsILocalFile.h" +#include "nsISimpleEnumerator.h" + +class nsPluginInstance : public nsPluginInstanceBase +{ +public: + nsPluginInstance(NPP aInstance); + ~nsPluginInstance(); + + NPBool init(NPWindow* aWindow); + void shut(); + NPBool isInitialized(); + + // we need to provide implementation of this method as it will be + // used by Mozilla to retrive the scriptable peer + // and couple of other things on Unix + NPError GetValue(NPPVariable variable, void *value); + + // locals + void getVersion(char* *aVersion); + void DumpLayout(nsISupports *aWindow,const PRUnichar *aFilePath, const PRUnichar *aFileName); + void StartDirectorySearch(const char *aFilePath); + void GetNextFileInDirectory(char **aFilePath); + nsIDebugPlugin* getScriptablePeer(); + +private: + NPP mInstance; + NPBool mInitialized; + nsIDebugPlugin * mScriptablePeer; + nsCOMPtr mIter; + + +public: + char mString[128]; +}; + +#endif // __PLUGIN_H__ diff --git a/extensions/layout-debug/plugin/resource.h b/extensions/layout-debug/plugin/resource.h new file mode 100644 index 00000000000..864d18674f5 --- /dev/null +++ b/extensions/layout-debug/plugin/resource.h @@ -0,0 +1,20 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by npDebug.rc +// +#define IDD_MAIN 101 +#define IDC_BUTTON_GO 1002 +#define IDC_STATIC_UA 1003 +#define IDC_BUTTON1 1005 +#define IDC_BUTTON_DONT 1005 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1006 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/extensions/layout-debug/plugin/test.html b/extensions/layout-debug/plugin/test.html new file mode 100644 index 00000000000..195c1908325 --- /dev/null +++ b/extensions/layout-debug/plugin/test.html @@ -0,0 +1,54 @@ + + +Debug Plug-in Test + + + +
+

XPConnect Scriptable Debug Plug-in

+
+ +This page contains a testcase which demonstrates the work of scriptable +plug-in with Mozilla. This example plug-in has no native GUI and does not +draw anything in the plugin window. Clicking on the button will result in calling +native plugin method from JavaScript. Show Version will instruct the plug-in +to retrieve the Mozilla user agent string and return it to JavaScript to show +in the alert box. + +

+ +
+ +
+ + + +
+
+ +
+ +
+ + +