blob: a531d639d2aaeab31a2d1eaf7175cf748e49a80a [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
#include "Debug.h"
#include "ExternalWrapper.h"
#include "nsCOMPtr.h"
#include "nsISupports.h"
#include "nsIXULAppInfo.h"
#include "nsIXULRuntime.h"
#include "nsServiceManagerUtils.h"
#include "nsXPCOMCID.h"
#if GECKO_VERSION >= 1900
#include "nsIClassInfoImpl.h"
#endif
#if GECKO_VERSION >= 2000
#include "mozilla/ModuleUtils.h"
#else
#include "nsIGenericFactory.h"
#include "nsICategoryManager.h"
#endif
// Allow a macro to be treated as a C string, ie -Dfoo=bar; QUOTE(foo) = "bar"
#define QUOTE_HELPER(x) #x
#define QUOTE(x) QUOTE_HELPER(x)
#ifdef _WINDOWS
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ulReasonForCall, LPVOID lpReserved) {
switch (ulReasonForCall) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif
// This defines ExternalWrapperConstructor, which in turn instantiates via
// ExternalWrapper::ExternalWrapper()
NS_GENERIC_FACTORY_CONSTRUCTOR(ExternalWrapper);
static nsresult Load() {
nsresult nr;
nsCOMPtr<nsIXULAppInfo> app_info
= do_GetService("@mozilla.org/xre/app-info;1", &nr);
if (NS_FAILED(nr) || !app_info) {
return NS_ERROR_FAILURE;
}
nsCString gecko_version;
app_info->GetPlatformVersion(gecko_version);
nsCString browser_version;
app_info->GetVersion(browser_version);
nsCOMPtr<nsIXULRuntime> xulRuntime
= do_GetService("@mozilla.org/xre/app-info;1", &nr);
if (NS_FAILED(nr) || !app_info) {
return NS_ERROR_FAILURE;
}
nsCString os;
xulRuntime->GetOS(os);
nsCString abi;
xulRuntime->GetXPCOMABI(abi);
Debug::log(Debug::Info) << "Initializing GWT Developer Plugin"
<< Debug::flush;
Debug::log(Debug::Info) << " gecko=" << gecko_version.BeginReading()
<< ", firefox=" << browser_version.BeginReading() << ", abi="
<< os.BeginReading() << "_" << abi.BeginReading() << ", built for "
QUOTE(BROWSER) << Debug::flush;
return NS_OK;
}
static void Unload() {
Debug::log(Debug::Debugging) << "ModuleOOPHM Unload()"
<< Debug::flush;
}
#if GECKO_VERSION >= 2000
/**
* Gecko 2.0 has a completely different initialization mechanism
*/
// This defines kOOPHM_CID variable that refers to the OOPHM_CID
NS_DEFINE_NAMED_CID(OOPHM_CID);
// Build a table of ClassIDs (CIDs) which are implemented by this module. CIDs
// should be completely unique UUIDs.
// each entry has the form { CID, service, factoryproc, constructorproc }
// where factoryproc is usually NULL.
static const mozilla::Module::CIDEntry kOOPHMCIDs[] = {
{&kOOPHM_CID, false, NULL, ExternalWrapperConstructor},
{NULL }
};
// Build a table which maps contract IDs to CIDs.
// A contract is a string which identifies a particular set of functionality. In some
// cases an extension component may override the contract ID of a builtin gecko component
// to modify or extend functionality.
static const mozilla::Module::ContractIDEntry kOOPHMContracts[] = {
{OOPHM_CONTRACTID, &kOOPHM_CID},
{NULL}
};
// Category entries are category/key/value triples which can be used
// to register contract ID as content handlers or to observe certain
// notifications.
static const mozilla::Module::CategoryEntry kOOPHMCategories[] = {
{"JavaScript-global-property", "__gwt_HostedModePlugin", OOPHM_CONTRACTID},
{NULL}
};
static const mozilla::Module kModuleOOPHM = {
mozilla::Module::kVersion,
kOOPHMCIDs,
kOOPHMContracts,
kOOPHMCategories,
NULL, /* Use the default factory */
Load,
Unload
};
NSMODULE_DEFN(ModuleOOPHM) = &kModuleOOPHM;
#else
/**
* pre-Gecko2.0 initialization
*/
NS_DECL_CLASSINFO(ExternalWrapper);
static NS_IMETHODIMP registerSelf(nsIComponentManager *aCompMgr, nsIFile *aPath,
const char *aLoaderStr, const char *aType,
const nsModuleComponentInfo *aInfo) {
Debug::log(Debug::Info)
<< " successfully registered GWT Developer Plugin"
<< Debug::flush;
nsresult rv;
nsCOMPtr<nsICategoryManager> categoryManager =
do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = categoryManager->AddCategoryEntry("JavaScript global property",
"__gwt_HostedModePlugin", OOPHM_CONTRACTID, true, true, nullptr);
if (rv != NS_OK) {
Debug::log(Debug::Error) << "ModuleOOPHM registerSelf returned " << rv
<< Debug::flush;
}
return rv;
}
static NS_IMETHODIMP factoryDestructor(void) {
Unload();
return NS_OK;
}
static NS_IMETHODIMP unregisterSelf(nsIComponentManager *aCompMgr,
nsIFile *aPath, const char *aLoaderStr,
const nsModuleComponentInfo *aInfo) {
Debug::log(Debug::Info) << "Unregistered GWT Developer Plugin"
<< Debug::flush;
return NS_OK;
}
static nsModuleComponentInfo components[] = {
{
OOPHM_CLASSNAME,
OOPHM_CID,
OOPHM_CONTRACTID,
ExternalWrapperConstructor,
registerSelf,
unregisterSelf, /* unregister self */
factoryDestructor, /* factory destructor */
NS_CI_INTERFACE_GETTER_NAME(ExternalWrapper), /* get interfaces */
nullptr, /* language helper */
&NS_CLASSINFO_NAME(ExternalWrapper), /* global class-info pointer */
0 /* class flags */
}
};
// From Gears base/firefox/module.cc
static nsModuleInfo const kModuleInfo = {
NS_MODULEINFO_VERSION,
("ExternalWrapperModule"),
(components),
(sizeof(components) / sizeof(components[0])),
(nullptr),
(nullptr)
};
NSGETMODULE_ENTRY_POINT(ExternalWrapperModule) (nsIComponentManager *servMgr,
nsIFile* location, nsIModule** result) {
Load();
return NS_NewGenericModule2(&kModuleInfo, result);
}
#endif //GECKO_VERSION