73 lines
1.6 KiB
ObjectPascal

unit GeckoInit;
interface
procedure GeckoComponentsStartup(XPComPath: string = '');
procedure GeckoComponentsShutdown;
implementation
uses
nsXPCOM, nsInit, nsTypes, nsErrorUtils, nsError,
nsXPCOMGlue, nsXRE {$IFDEF MSWINDOWS}, Windows {$ENDIF};
var
sInitCount: Integer = 0;
procedure GeckoComponentsStartup(XPComPath: string = '');
const
NS_DIRECTORY_SERVICE_CID: TGUID = '{f00152d0-b40b-11d3-8c9c-000064657374}';
var
rv: nsresult;
errorStr: AnsiString;
ServiceManager: nsIServiceManager;
DirectoryService: nsIDirectoryService;
begin
if sInitCount>0 then
begin
Inc(sInitCount);
Exit;
end;
rv := XRE_Startup('1.9', True, '2.0', False, XPComPath);
if NS_FAILED(rv) then
begin
errorStr := NS_GetErrorStringBundleKey(rv);
XPCOMGlueShutdown;
raise EGeckoError.Create(string(errorStr));
end;
//Register the service via Service Manager.
if not Assigned(GeckoEngineDirectoryService) then
GeckoEngineDirectoryService:=IDirectoryServiceProvider.Create;
NS_GetServiceManager(ServiceManager);
ServiceManager.GetService(NS_DIRECTORY_SERVICE_CID, DirectoryService,DirectoryService);
{$IFDEF LCLGTK2 AND defined(cpux86_64)}
//No register meanwhile the DirectoryService bug in Linux64 is not solved.
{$ELSE}
DirectoryService.RegisterProvider(GeckoEngineDirectoryService);
{$ENDIF}
Inc(sInitCount);
end;
procedure GeckoComponentsShutdown();
begin
if sInitCount = 0 then
begin
raise EGeckoError.Create(
'ERROR: Too many calls for GeckoComponentsShutdown then GeckoComponentsStartup');
end;
Dec(sInitCount);
if sInitCount = 0 then
begin
XRE_Shutdown();
end;
end;
end.