You've already forked lazarus-ccr
Fixed some problems win32 version. GTK and others still do not work.
Fixed some DOM events. Added new OnCloseWindow event. Added possibility to disable JavaScript. The interface is not fixed and some events could change shortly. Tested with XULRuuner from 1.9.0.16 to 1.9.1.11. XULRunner 1.9.2.x does not work due JavaScript problems, quite sure located in the XULRunner. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1231 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -37,7 +37,7 @@ unit BrowserSupports;
|
||||
interface
|
||||
|
||||
uses
|
||||
nsConsts, nsGeckoStrings, nsTypes, nsXPCOM;
|
||||
nsGeckoStrings, nsTypes, nsXPCOM;
|
||||
|
||||
const
|
||||
GFXIFORMATS_IID: TGUID = '{96d086e6-1dd1-11b2-b6b2-b77b59390247}';
|
||||
@ -114,7 +114,7 @@ type
|
||||
*)
|
||||
gfx_format = PRInt32;
|
||||
nscoord = PRInt32;
|
||||
nativeWindow = Pointer;
|
||||
nativeWindow = THANDLE;
|
||||
gfxIFormats = interface
|
||||
['{96d086e6-1dd1-11b2-b6b2-b77b59390247}']
|
||||
end;
|
||||
|
@ -67,6 +67,13 @@ type
|
||||
function SafeCallException(Obj: TObject; Addr: Pointer): HResult; override;
|
||||
end;
|
||||
|
||||
{$PUSH}
|
||||
{$HINTS OFF}
|
||||
procedure UseParameter(var X);
|
||||
begin
|
||||
end;
|
||||
{$POP}
|
||||
|
||||
function FindTarget(chrome: nsIWebBrowserChrome): IGeckoCreateWindowTarget;
|
||||
var
|
||||
chrome2: IGeckoBrowserChrome;
|
||||
@ -131,12 +138,14 @@ begin
|
||||
if Assigned(target) then
|
||||
Result := target.DoCreateChromeWindow(chromeFlags);
|
||||
if not Assigned(Result) then
|
||||
raise EGeckoError.Create('�V�����u���E�U���J�����Ƃ��o���܂����B');
|
||||
raise EGeckoHint.CreateFmt('Attempt to create a new Chrome window but handler does not create a new one. Chrome flags: %8X',[chromeFlags]);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TWindowCreator.SafeCallException(Obj: TObject; Addr: Pointer): HResult;
|
||||
begin
|
||||
UseParameter(Obj);
|
||||
UseParameter(Addr);
|
||||
Result := HRESULT(NS_ERROR_FAILURE);
|
||||
end;
|
||||
|
||||
|
@ -42,7 +42,7 @@ interface
|
||||
|
||||
uses
|
||||
{$IFNDEF LCL} Windows, Messages, {$ELSE} LclIntf, LMessages, LclType, LResources, {$ENDIF}
|
||||
SysUtils, Classes, Controls, nsConsts, nsXPCOM,
|
||||
SysUtils, Classes, Controls, nsXPCOM,
|
||||
nsGeckoStrings, CallbackInterfaces, nsTypes, nsXPCOMGlue, BrowserSupports,
|
||||
nsXPCOM_std19
|
||||
{$IFDEF LCLCarbon}, CarbonPrivate {$ENDIF}
|
||||
@ -70,6 +70,7 @@ const
|
||||
WM_GETDLGCODE = LM_GETDLGCODE;
|
||||
WM_NEXTDLGCTL = $0028;
|
||||
WM_ERASEBKGND = LM_ERASEBKGND;
|
||||
WM_SHOWWINDOW = LM_SHOWWINDOW;
|
||||
E_FAIL = HRESULT($80004005);
|
||||
type
|
||||
TMessage = TLMessage;
|
||||
@ -134,7 +135,10 @@ type
|
||||
end;
|
||||
|
||||
|
||||
//TODO 2 -cTCustomGeckoBrowser: DocShell �v���p�e�B���lj�
|
||||
//TODO 2 -cTCustomGeckoBrowser: DocShell �v��p�e�B���lj�
|
||||
|
||||
{ TCustomGeckoBrowser }
|
||||
|
||||
TCustomGeckoBrowser = class(TCustomControl,
|
||||
IGeckoCreateWindowTarget)
|
||||
private
|
||||
@ -160,6 +164,14 @@ type
|
||||
|
||||
FOnNewWindow: TGeckoBrowserNewWindow;
|
||||
|
||||
FOnSetupProperties: TNotifyEvent;
|
||||
|
||||
//misc settings
|
||||
FDisableJavaScript: Boolean;
|
||||
FInitialized: Boolean;
|
||||
|
||||
function GetDisableJavaScript: Boolean;
|
||||
procedure SetDisableJavascript(const AValue: Boolean);
|
||||
procedure ShutdownWebBrowser;
|
||||
procedure InnerLoadURI(uri: WideString; Flags: PRUint32;
|
||||
referer: nsIURI; postData, headers: TStream);
|
||||
@ -169,7 +181,6 @@ type
|
||||
|
||||
procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
|
||||
procedure WMEraseBkGnd(var Msg: TMessage); message WM_ERASEBKGND;
|
||||
|
||||
function GetContentDocument: nsIDOMDocument;
|
||||
function GetContentWindow: nsIDOMWindow;
|
||||
function GetCanGoBack: Boolean;
|
||||
@ -270,6 +281,11 @@ type
|
||||
|
||||
property OnNewWindow: TGeckoBrowserNewWindow
|
||||
read FOnNewWindow write FOnNewWindow;
|
||||
|
||||
property OnSetupProperties: TNotifyEvent read FOnSetupProperties write FOnSetupProperties;
|
||||
// misc base settings
|
||||
property DisableJavaScript: Boolean read GetDisableJavaScript write SetDisableJavascript;
|
||||
property Initialized: Boolean read FInitialized;
|
||||
end;
|
||||
|
||||
TCustomGeckoBrowserChrome = class(TInterfacedObject,
|
||||
@ -362,6 +378,9 @@ type
|
||||
FOnDOMDragDrop: TGeckoBrowserDOMEventHandler;
|
||||
FOnDOMDragExit: TGeckoBrowserDOMEventHandler;
|
||||
FOnDOMFocus: TGeckoBrowserDOMEventHandler;
|
||||
|
||||
FOnCloseWindow: TNotifyEvent;
|
||||
|
||||
// The Last focused element
|
||||
FLastFocused: nsIDOMElement;
|
||||
|
||||
@ -407,6 +426,8 @@ type
|
||||
read FOnDOMDragExit write FOnDOMDragExit;
|
||||
property OnDOMFocus: TGeckoBrowserDOMEventHandler
|
||||
read FOnDOMFocus write FOnDOMFocus;
|
||||
property OnCloseWindow: TNotifyEvent
|
||||
read FOnCloseWindow write FOnCloseWindow;
|
||||
|
||||
published
|
||||
// TWinControl
|
||||
@ -419,8 +440,13 @@ type
|
||||
property BevelKind;
|
||||
property BevelOuter;
|
||||
property BevelWidth;
|
||||
{$ELSE}
|
||||
property Anchors;
|
||||
property BorderSpacing;
|
||||
property Constraints;
|
||||
{$ENDIF}
|
||||
//property BorderWidth;
|
||||
property BorderStyle;
|
||||
property BorderWidth;
|
||||
|
||||
property OnLocationChange;
|
||||
property OnProgressChange;
|
||||
@ -434,6 +460,10 @@ type
|
||||
property OnGoForward;
|
||||
property OnGoToIndex;
|
||||
|
||||
property OnSetupProperties;
|
||||
|
||||
property DisableJavaScript;
|
||||
|
||||
public
|
||||
property ContentDocument;
|
||||
property ContentWindow;
|
||||
@ -449,8 +479,8 @@ type
|
||||
private
|
||||
FBrowser: TGeckoBrowser;
|
||||
protected
|
||||
constructor Create(Browser: TGeckoBrowser);
|
||||
public
|
||||
constructor Create(Browser: TGeckoBrowser);
|
||||
destructor Destroy; override;
|
||||
protected
|
||||
// nsIWebBrowserChrome
|
||||
@ -495,7 +525,6 @@ type
|
||||
nsISHistoryListener,
|
||||
nsIDOMEventListener)
|
||||
protected
|
||||
constructor Create(browser: TGeckoBrowser);
|
||||
// nsIWebProgressListener
|
||||
procedure OnStateChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; aStateFlags: PRUint32; aStatus: nsresult); override;
|
||||
procedure OnProgressChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; aCurSelfProgress: PRInt32; aMaxSelfProgress: PRInt32; aCurTotalProgress: PRInt32; aMaxTotalProgress: PRInt32); override;
|
||||
@ -511,12 +540,14 @@ type
|
||||
function OnHistoryPurge(aNumEntries: PRInt32): PRBool; safecall;
|
||||
// nsIDOMEventListener
|
||||
//procedure HandleEvent(aEvent: nsIDOMEvent); safecall;
|
||||
public
|
||||
constructor Create(browser: TGeckoBrowser);
|
||||
end;
|
||||
|
||||
(*TGeckoBrowser = class(TCustomControl,
|
||||
nsISHistoryListener)
|
||||
private
|
||||
{ Private �錾 }
|
||||
{ Private 錾 }
|
||||
FWebBrowser: nsIWebBrowser;
|
||||
FDocTitle: WideString;
|
||||
|
||||
@ -535,13 +566,13 @@ type
|
||||
function GetHistoryPosition: Integer;
|
||||
function GetHistoryCount: Integer;
|
||||
protected
|
||||
{ Protected �錾 }
|
||||
{ Protected 錾 }
|
||||
// TControl
|
||||
procedure Resize; override;
|
||||
|
||||
public
|
||||
{ Public �錾 }
|
||||
// �i�r�Q�[�V����
|
||||
{ Public 錾 }
|
||||
// �i�r�Q[�V����
|
||||
// nsIWebNavigation
|
||||
procedure GotoIndex(aIndex: Integer);
|
||||
|
||||
@ -549,7 +580,7 @@ type
|
||||
property HistoryPosition: Integer read GetHistoryPosition;
|
||||
property HistoryCount: Integer read GetHistoryCount;
|
||||
published
|
||||
{ Published �錾 }
|
||||
{ Published 錾 }
|
||||
// TWinControl
|
||||
property Align;
|
||||
property TabOrder;
|
||||
@ -635,7 +666,7 @@ procedure Register;
|
||||
implementation
|
||||
|
||||
uses
|
||||
nsError, nsStream, nsMemory, nsNetUtil, nsInit, GeckoInit,
|
||||
nsError, nsStream, nsMemory, nsNetUtil, GeckoInit,
|
||||
Forms, TypInfo, Variants;
|
||||
|
||||
procedure Register;
|
||||
@ -643,6 +674,13 @@ begin
|
||||
RegisterComponents('Gecko', [TGeckoBrowser]);
|
||||
end;
|
||||
|
||||
{$PUSH}
|
||||
{$HINTS OFF}
|
||||
procedure UseParameter(var X);
|
||||
begin
|
||||
end;
|
||||
{$POP}
|
||||
|
||||
(*
|
||||
// nsISHistoryListener
|
||||
function TGeckoBrowser.OnHistoryNewEntry(aNewURI: nsIURI): Longword;
|
||||
@ -721,7 +759,7 @@ begin
|
||||
Result := NS_OK;
|
||||
end;
|
||||
|
||||
// TControl �p��
|
||||
// TControl �p�
|
||||
procedure TGeckoBrowser.Resize;
|
||||
var
|
||||
BaseWindow: nsIBaseWindow;
|
||||
@ -813,6 +851,7 @@ end;
|
||||
|
||||
function TCustomGeckoBrowserChrome.SafeCallException(obj: TObject; addr: Pointer): HRESULT;
|
||||
begin
|
||||
UseParameter(obj); UseParameter(Addr);
|
||||
Result := E_FAIL;
|
||||
end;
|
||||
|
||||
@ -839,7 +878,7 @@ begin
|
||||
begin
|
||||
with FDOMEvents[I] do
|
||||
begin
|
||||
target.AddEventListener(NewString(Name).AString, Self, False);
|
||||
target.AddEventListener(NewString(Name).AString, Self, true);
|
||||
end;
|
||||
Inc(I);
|
||||
end;
|
||||
@ -883,9 +922,10 @@ begin
|
||||
{$IFNDEF FPC}
|
||||
browser.AddWebBrowserListener(weak, table.Entries[i].IID);
|
||||
{$ELSE}
|
||||
{$IFOPT R+}{$DEFINE TURNED_RANGE_CHECK_OFF}{$R-}{$ENDIF}
|
||||
{$PUSH}
|
||||
{$R-}
|
||||
browser.AddWebBrowserListener(weak, table.Entries[i].IID^); //FPC Entries is only array[0..0]!
|
||||
{$IFDEF TURNED_RANGE_CHECK_OFF}{$UNDEFINE TURNED_RANGE_CHECK_OFF}{$R+}{$ENDIF}
|
||||
{$POP}
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
@ -902,15 +942,17 @@ begin
|
||||
{$IFNDEF FPC}
|
||||
browser.RemoveWebBrowserListener(weak, table.Entries[i].IID);
|
||||
{$ELSE}
|
||||
{$IFOPT R+}{$DEFINE TURNED_RANGE_CHECK_OFF}{$R-}{$ENDIF}
|
||||
{$PUSH}
|
||||
{$R-}
|
||||
browser.RemoveWebBrowserListener(weak, table.Entries[i].IID^);
|
||||
{$IFDEF TURNED_RANGE_CHECK_OFF}{$UNDEFINE TURNED_RANGE_CHECK_OFF}{$R+}{$ENDIF}
|
||||
{$POP}
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
function TCustomGeckoBrowserListener.SafeCallException(
|
||||
Obj: TObject; Addr: Pointer): HResult;
|
||||
begin
|
||||
UseParameter(obj); UseParameter(Addr);
|
||||
Result := HRESULT(NS_ERROR_FAILURE);
|
||||
end;
|
||||
|
||||
@ -994,7 +1036,7 @@ begin
|
||||
baseWin.SetPositionAndSize(rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, False);
|
||||
end;
|
||||
|
||||
// TWinControl �p��
|
||||
// TWinControl �p�
|
||||
procedure TCustomGeckoBrowser.CreateWnd;
|
||||
begin
|
||||
{$IFDEF DEBUG}
|
||||
@ -1005,6 +1047,13 @@ begin
|
||||
if not (csDesigning in ComponentState) then
|
||||
begin
|
||||
InitWebBrowser;
|
||||
LoadURI('about:blank');
|
||||
FInitialized:=true;
|
||||
if Assigned(FOnSetupProperties) then begin
|
||||
FOnSetupProperties(Self);
|
||||
end;
|
||||
//Set again the published properties
|
||||
SetDisableJavascript(FDisableJavaScript);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1056,12 +1105,12 @@ begin
|
||||
baseWin := FWebBrowser as nsIBaseWindow;
|
||||
|
||||
rc := ClientRect;
|
||||
baseWin.InitWindow({$IFDEF MSWINDOWS}Pointer(Handle),{$ENDIF}
|
||||
{$IFDEF LCLCarbon}Pointer(TCarbonWindow(Handle).Window),{$ENDIF}
|
||||
baseWin.InitWindow({$IFDEF MSWINDOWS}Handle,{$ENDIF}
|
||||
{$IFDEF LCLCarbon}TCarbonWindow(Handle).Window,{$ENDIF}
|
||||
// {$IFDEF LCLCocoa}Pointer(TCocoaForm(Handle).MainWindowView.superview),{$ENDIF}
|
||||
{$IFDEF LCLCocoa}Pointer(TCocoaWindow(Handle).contentView),{$ENDIF}
|
||||
{$IFDEF LCLGtk}Pointer(Handle),{$ENDIF} //Is Handle same as GTK Window?
|
||||
{$IFDEF LCLGtk2}Pointer(Handle),{$ENDIF} //Is Handle same as GTK Window?
|
||||
{$IFDEF LCLCocoa}TCocoaWindow(Handle).contentView,{$ENDIF}
|
||||
{$IFDEF LCLGtk}Handle,{$ENDIF} //Is Handle same as GTK Window?
|
||||
{$IFDEF LCLGtk2}Handle,{$ENDIF} //Is Handle same as GTK Window?
|
||||
nil,
|
||||
rc.Left,
|
||||
rc.Top,
|
||||
@ -1151,7 +1200,7 @@ begin
|
||||
InnerLoadURI(uri, Flags, ref, nil, nil);
|
||||
end;
|
||||
|
||||
procedure TCustomGeckoBrowser.LoadURIWithFlags(const uri: WideString; Flags: Cardinal; const referer: WideString);
|
||||
procedure TCustomGeckoBrowser.LoadURIWithFlags(const uri: WideString; Flags: PRUint32; const referer: WideString);
|
||||
var
|
||||
ref: nsIURI;
|
||||
refStr: IInterfacedUTF8String;
|
||||
@ -1161,7 +1210,7 @@ begin
|
||||
InnerLoadURI(uri, Flags, ref, nil, nil);
|
||||
end;
|
||||
|
||||
procedure TCustomGeckoBrowser.LoadURIWithFlags(const uri: WideString; Flags: Cardinal; referer: nsIURI);
|
||||
procedure TCustomGeckoBrowser.LoadURIWithFlags(const uri: WideString; Flags: PRUint32; referer: nsIURI);
|
||||
begin
|
||||
InnerLoadURI(uri, Flags, referer, nil, nil);
|
||||
end;
|
||||
@ -1194,6 +1243,29 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TCustomGeckoBrowser.GetDisableJavaScript: Boolean;
|
||||
begin
|
||||
Result:=FDisableJavaScript;
|
||||
end;
|
||||
|
||||
procedure TCustomGeckoBrowser.SetDisableJavascript(const AValue: Boolean);
|
||||
var
|
||||
iWebSetup: nsIWebBrowserSetup;
|
||||
begin
|
||||
try
|
||||
if FInitialized then begin
|
||||
iWebSetup:=Self.FWebBrowser as nsIWebBrowserSetup;
|
||||
iWebSetup.SetProperty(NS_IWEBBROWSERSETUP_SETUP_ALLOW_JAVASCRIPT,PRInt32(not AValue));
|
||||
end;
|
||||
FDisableJavaScript:=AValue;
|
||||
except
|
||||
try
|
||||
Raise EGeckoHint.Create('Unable to disable JavaScript at this moment. Gecko not created?');
|
||||
except
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCustomGeckoBrowser.SetChrome(aChrome: TCustomGeckoBrowserChrome);
|
||||
var
|
||||
old: TCustomGeckoBrowserChrome;
|
||||
@ -1243,6 +1315,7 @@ begin
|
||||
));
|
||||
}
|
||||
{$ENDIF}
|
||||
UseParameter(statusType);
|
||||
if Assigned(FBrowser.OnStatusChange) then
|
||||
FBrowser.OnStatusChange(FBrowser, status);
|
||||
end;
|
||||
@ -1269,11 +1342,13 @@ end;
|
||||
procedure TGeckoBrowserChrome.SetChromeFlags(
|
||||
aChromeFlags: PRUint32);
|
||||
begin
|
||||
UseParameter(aChromeFlags);
|
||||
end;
|
||||
|
||||
procedure TGeckoBrowserChrome.DestroyBrowserWindow;
|
||||
begin
|
||||
//TODO 2 -cTGeckoBrowserChrome: TGeckoBrowserChrome.OnDestroyBrowser �C�x���g�̒lj�
|
||||
if Assigned(FBrowser.FOnCloseWindow) then
|
||||
FBrowser.FOnCloseWindow(FBrowser);
|
||||
end;
|
||||
|
||||
procedure TGeckoBrowserChrome.SizeBrowserTo(
|
||||
@ -1297,6 +1372,7 @@ end;
|
||||
procedure TGeckoBrowserChrome.ExitModalEventLoop(
|
||||
aStatus: nsresult);
|
||||
begin
|
||||
UseParameter(aStatus);
|
||||
end;
|
||||
|
||||
procedure TGeckoBrowserChrome.SetDimensions(
|
||||
@ -1376,7 +1452,15 @@ end;
|
||||
|
||||
procedure TGeckoBrowserChrome.SetFocus;
|
||||
begin
|
||||
if Assigned(FBrowser.FOnVisibleChange) then begin
|
||||
//Give the browser a chance to become visible
|
||||
FBrowser.FOnVisibleChange(FBrowser,true);
|
||||
end;
|
||||
try
|
||||
FBrowser.SetFocus;
|
||||
except
|
||||
Raise EGeckoHint.Create('Unable to set focus to '+FBrowser.Name);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TGeckoBrowserChrome.GetVisibility: PRBool;
|
||||
@ -1388,6 +1472,7 @@ end;
|
||||
procedure TGeckoBrowserChrome.SetVisibility(
|
||||
aVisibility: PRBool);
|
||||
begin
|
||||
UseParameter(aVisibility);
|
||||
//TODO 1 -cTGeckoBrowserChrome: TGeckoBrowserChrome.SetVisibility �̎���
|
||||
end;
|
||||
|
||||
@ -1415,27 +1500,31 @@ end;
|
||||
|
||||
function TGeckoBrowserChrome.GetSiteWindow: Pointer;
|
||||
begin
|
||||
{$PUSH}
|
||||
{$HINTS OFF}
|
||||
Result := Pointer(FBrowser.Handle);
|
||||
{$POP}
|
||||
end;
|
||||
|
||||
constructor TGeckoBrowserListener.Create(browser: TGeckoBrowser);
|
||||
const
|
||||
//Most usual events at the beginning to improve handling speed.
|
||||
events: array [0..15] of TGeckoDOMEventRegister = (
|
||||
(name:'mousemove'; eventType:etMouseEvent; propertyName:'OnDOMMouseMove' ),
|
||||
(name:'DOMMouseScroll'; eventType: etMouseEvent;propertyName:'OnDOMMouseScroll'),
|
||||
(name:'focus'; eventType:etEvent; propertyName:'OnDOMFocus'),
|
||||
(name:'load'; eventType:etEvent; propertyName:'OnDOMLoad' ),
|
||||
(name:'click'; eventType:etMouseEvent; propertyName:'OnDOMClick' ),
|
||||
(name:'mouseup'; eventType:etMouseEvent; propertyName:'OnDOMMouseUp' ),
|
||||
(name:'mousedown'; eventType:etMouseEvent; propertyName:'OnDOMMouseDown' ),
|
||||
(name:'mousemove'; eventType:etMouseEvent; propertyName:'OnDOMMouseMove' ),
|
||||
(name:'keyup'; eventType:etEvent; propertyName:'OnDOMKeyUp' ),
|
||||
(name:'keydown'; eventType:etEvent; propertyName:'OnDOMKeyDown'),
|
||||
(name:'keypress'; eventType:etEvent; propertyName:'OnDOMKeyPress'),
|
||||
(name:'DOMMouseScroll'; eventType: etMouseEvent; propertyName:'OnDOMMouseScroll'),
|
||||
(name:'DOMLinkAdded'; eventType: etEvent; propertyName:'OnDOMLinkAdded'),
|
||||
(name:'dragover'; eventType:etEvent; propertyName:'OnDOMDragOver'),
|
||||
(name:'draggesture'; eventType:etEvent; propertyName:'OnDOMDragGesture'),
|
||||
(name:'dragdrop'; eventType:etEvent; propertyName:'OnDOMDragDrop'),
|
||||
(name:'dragexit'; eventType:etEvent; propertyName:'OnDOMDragExit'),
|
||||
(name:'focus'; eventType:etEvent; propertyName:'OnDOMFocus'),
|
||||
(name:''; eventType:etNone; propertyName:'')
|
||||
);
|
||||
begin
|
||||
@ -1447,7 +1536,7 @@ procedure TGeckoBrowserListener.OnStateChange(
|
||||
aWebProgress: nsIWebProgress;
|
||||
aRequest: nsIRequest;
|
||||
aStateFlags: PRUint32;
|
||||
aStatus: PRUint32);
|
||||
aStatus: nsresult);
|
||||
{$IFDEF DEBUG}
|
||||
var
|
||||
uri: nsIURI;
|
||||
@ -1460,12 +1549,15 @@ const
|
||||
STATE_START = NS_IWEBPROGRESSLISTENER_STATE_START;
|
||||
STATE_STOP = NS_IWEBPROGRESSLISTENER_STATE_STOP;
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(aStatus);
|
||||
if (aStateFlags and STATE_IS_DOCUMENT)<>0 then
|
||||
begin
|
||||
// ���Ԃ̕ω��̓h�L�������g�ɑ��Ăł���
|
||||
// ��Ԃ̕ω��̓h�L������g�ɑ��Ăł���
|
||||
if (aStateFlags and STATE_START)<>0 then
|
||||
begin
|
||||
// �h�L�������g�̓ǂݍ��݂��J�n���ꂽ
|
||||
// �h�L������g�̓ǂݞ�݂��J�n���ꂽ
|
||||
{$IFDEF DEBUG}
|
||||
{
|
||||
OutputDebugString('GeckoBrowser.OnDocumentBegin');
|
||||
@ -1474,7 +1566,7 @@ begin
|
||||
end else
|
||||
if (aStateFlags and STATE_STOP)<>0 then
|
||||
begin
|
||||
// �h�L�������g�̓ǂݍ��݂���������
|
||||
// �h�L������g�̓ǂݞ�݂���������
|
||||
{$IFDEF DEBUG}
|
||||
{
|
||||
OutputDebugString('GeckoBrowser.OnDocumentComplete');
|
||||
@ -1484,10 +1576,10 @@ begin
|
||||
end;
|
||||
if (aStateFlags and STATE_IS_NETWORK)<>0 then
|
||||
begin
|
||||
// ���Ԃ̕ω��̓l�b�g���[�N�ɑ��Ăł���
|
||||
// ��Ԃ̕ω��̓l�b�g�[�N�ɑ��Ăł���
|
||||
if (aStateFlags and STATE_START)<>0 then
|
||||
begin
|
||||
// �l�b�g���[�N�̓]�����J�n���ꂽ�ꍇ
|
||||
// �l�b�g�[�N�̓]�����J�n���ꂽ��
|
||||
{$IFDEF DEBUG}
|
||||
{
|
||||
str := NewCString;
|
||||
@ -1501,7 +1593,7 @@ begin
|
||||
end else
|
||||
if (aStateFlags and STATE_STOP)<>0 then
|
||||
begin
|
||||
// �l�b�g���[�N�̓]�����I�������ꍇ
|
||||
// �l�b�g�[�N�̓]����I��������
|
||||
{$IFDEF DEBUG}
|
||||
{
|
||||
str := NewCString;
|
||||
@ -1526,6 +1618,10 @@ procedure TGeckoBrowserListener.OnProgressChange(
|
||||
aCurTotalProgress: PRInt32;
|
||||
aMaxTotalProgress: PRInt32);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(aCurSelfProgress);
|
||||
UseParameter(aMaxSelfProgress);
|
||||
if Assigned(FBrowser.OnProgressChange) then
|
||||
begin
|
||||
{$IFDEF DEBUG}
|
||||
@ -1546,6 +1642,8 @@ procedure TGeckoBrowserListener.OnLocationChange(
|
||||
var
|
||||
str: IInterfacedCString;
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
str := NewCString;
|
||||
location.GetSpec(str.ACString);
|
||||
{$IFDEF DEBUG}
|
||||
@ -1562,9 +1660,12 @@ end;
|
||||
procedure TGeckoBrowserListener.OnStatusChange(
|
||||
aWebProgress: nsIWebProgress;
|
||||
aRequest: nsIRequest;
|
||||
aStatus: PRUint32;
|
||||
aStatus: nsresult;
|
||||
const aMessage: PWideChar);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(aStatus);
|
||||
{$IFDEF DEBUG}
|
||||
{
|
||||
OutputDebugStringW(PWideChar(
|
||||
@ -1581,7 +1682,10 @@ procedure TGeckoBrowserListener.OnSecurityChange(
|
||||
aRequest: nsIRequest;
|
||||
state: PRUint32);
|
||||
begin
|
||||
//TODO 1 -cTGeckoBrowserListner: TGeckoBrowserListener.OnSecurityChange �̋L�q
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(State);
|
||||
//TODO 1 -cTGeckoBrowserListner: TGeckoBrowserListener.OnSecurityChange �̋Lq
|
||||
end;
|
||||
|
||||
constructor TGeckoBrowser.Create(AOwner: TComponent);
|
||||
@ -1595,8 +1699,7 @@ function TGeckoBrowserChrome.NS_GetInterface(const uuid: TGUID; out _result): ns
|
||||
begin
|
||||
if IsEqualGUID(uuid, nsIDOMWindow) then
|
||||
begin
|
||||
// nsIDOMWindow ���������Ȃ��� nsIWindowCreator.CreateChromeWindow �ŃG���[�ɂȂ�
|
||||
Result := FBrowser.FBrowser.ContainerWindow.QueryInterface(uuid, _result);
|
||||
Result:= nsresult(FBrowser.GetContentWindow.QueryInterface(uuid, _result));
|
||||
end else
|
||||
begin
|
||||
// FPC port: Result is PRUInt32, but QueryInterface returns Longint,
|
||||
@ -1608,6 +1711,7 @@ end;
|
||||
|
||||
procedure TGeckoBrowserChrome.OnShowContextMenu(aContextFlags: PRUint32;
|
||||
aUtils: nsIContextMenuInfo);
|
||||
(*
|
||||
const
|
||||
CONTEXT_NONE = NS_ICONTEXTMENULISTENER2_CONTEXT_NONE;
|
||||
CONTEXT_LINK = NS_ICONTEXTMENULISTENER2_CONTEXT_LINK;
|
||||
@ -1615,7 +1719,7 @@ const
|
||||
CONTEXT_DOCUMENT = NS_ICONTEXTMENULISTENER2_CONTEXT_DOCUMENT;
|
||||
CONTEXT_TEXT = NS_ICONTEXTMENULISTENER2_CONTEXT_TEXT;
|
||||
CONTEXT_INPUT = NS_ICONTEXTMENULISTENER2_CONTEXT_INPUT;
|
||||
CONTEXT_BACKGROUND_IMAGE = NS_ICONTEXTMENULISTENER2_CONTEXT_BACKGROUND_IMAGE;
|
||||
CONTEXT_BACKGROUND_IMAGE = NS_ICONTEXTMENULISTENER2_CONTEXT_BACKGROUND_IMAGE;*)
|
||||
var
|
||||
cmenu: TCtxMenuInfo;
|
||||
begin
|
||||
@ -1631,10 +1735,12 @@ begin
|
||||
end;
|
||||
|
||||
procedure TGeckoBrowserChrome.OnShowTooltip(aXCoords: PRInt32; aYCoords: PRInt32; const aTipText: PWideChar); safecall;
|
||||
{$IFNDEF FPC}
|
||||
var
|
||||
r:TRect;
|
||||
p,ap:TPoint;
|
||||
// height:Integer;
|
||||
{$ENDIF}
|
||||
begin
|
||||
{$IFNDEF LCL}
|
||||
if FBrowser.FHint = nil then
|
||||
@ -1649,6 +1755,11 @@ begin
|
||||
r.Right:=r.Right +p.x;
|
||||
r.Bottom:=p.y;
|
||||
FBrowser.FHint.ActivateHint(r,aTipText);
|
||||
{$ELSE}
|
||||
UseParameter(aXCoords);
|
||||
UseParameter(aYCoords);
|
||||
FBrowser.Hint:=aTiptext;
|
||||
FBrowser.ShowHint:=true;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
@ -1690,7 +1801,7 @@ end;
|
||||
|
||||
procedure TCustomGeckoBrowser.WMEraseBkGnd(var Msg: TMessage);
|
||||
begin
|
||||
// �������h�~
|
||||
// Cancel erase background actions.
|
||||
Msg.Result := 0;
|
||||
end;
|
||||
|
||||
@ -1706,7 +1817,7 @@ begin
|
||||
end else
|
||||
begin
|
||||
baseWin := FWebBrowser as nsIBaseWindow;
|
||||
baseWin.Repaint(True);
|
||||
baseWin.Repaint(true);
|
||||
end;
|
||||
inherited;
|
||||
end;
|
||||
@ -1823,6 +1934,7 @@ end;
|
||||
|
||||
procedure TGeckoBrowserListener.OnHistoryNewEntry(aNewURI: nsIURI);
|
||||
begin
|
||||
UseParameter(aNewURI);
|
||||
end;
|
||||
|
||||
function TGeckoBrowserListener.OnHistoryGoBack(aBackURI: nsIURI): PRBool;
|
||||
@ -1830,6 +1942,7 @@ var
|
||||
Handled:Boolean;
|
||||
aContinue:PRBool;
|
||||
begin
|
||||
Handled:=false;
|
||||
if Assigned(FBrowser.FOnGoBack) then
|
||||
FBrowser.FOnGoBack(Self,aBackURI,aContinue,Handled);
|
||||
if Handled then begin
|
||||
@ -1849,6 +1962,7 @@ var
|
||||
Handled:Boolean;
|
||||
aContinue:PRBool;
|
||||
begin
|
||||
Handled:=false;
|
||||
if Assigned(FBrowser.FOnGoForward) then
|
||||
FBrowser.FOnGoForward(Self,aForwardURI,aContinue,Handled);
|
||||
if Handled then begin
|
||||
@ -1865,6 +1979,8 @@ end;
|
||||
|
||||
function TGeckoBrowserListener.OnHistoryReload(aReloadURI: nsIURI; aReloadFlags: PRUint32): PRBool;
|
||||
begin
|
||||
UseParameter(aReloadURI);
|
||||
UseParameter(aReloadFlags);
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
@ -1873,6 +1989,7 @@ var
|
||||
Handled:Boolean;
|
||||
aContinue:PRBool;
|
||||
begin
|
||||
Handled:=false;
|
||||
if Assigned(FBrowser.FOnGoToIndex) then
|
||||
FBrowser.FOnGoToIndex(Self,aIndex,aGotoURI,aContinue,Handled);
|
||||
|
||||
@ -1890,6 +2007,7 @@ end;
|
||||
|
||||
function TGeckoBrowserListener.OnHistoryPurge(aNumEntries: PRInt32): PRBool;
|
||||
begin
|
||||
UseParameter(aNumEntries);
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
|
@ -1,16 +1,12 @@
|
||||
object GeckoChromeForm: TGeckoChromeForm
|
||||
Left = 192
|
||||
Height = 600
|
||||
Top = 107
|
||||
Width = 800
|
||||
Height = 600
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -12
|
||||
Font.Name = 'Tahoma'
|
||||
Font.Style = []
|
||||
OnClose = FormClose
|
||||
OnCreate = FormCreate
|
||||
OnResize = FormResize
|
||||
PixelsPerInch = 96
|
||||
LCLVersion = '0.9.29'
|
||||
end
|
||||
|
@ -1,8 +1,8 @@
|
||||
{ This is an automatically generated lazarus resource file }
|
||||
|
||||
LazarusResources.Add('TGeckoChromeForm','FORMDATA',[
|
||||
'TPF0'#16'TGeckoChromeForm'#15'GeckoChromeForm'#4'Left'#3#192#0#3'Top'#2'k'#5
|
||||
+'Width'#3' '#3#6'Height'#3'X'#2#5'Color'#7#9'clBtnFace'#12'Font.Charset'#7#15
|
||||
+'DEFAULT_CHARSET'#10'Font.Color'#7#12'clWindowText'#11'Font.Height'#2#244#9
|
||||
+'Font.Name'#6#6'Tahoma'#10'Font.Style'#11#0#7'OnClose'#7#9'FormClose'#8'OnCr'
|
||||
+'eate'#7#10'FormCreate'#8'OnResize'#7#10'FormResize'#13'PixelsPerInch'#2'`'#0
|
||||
+#0
|
||||
'TPF0'#16'TGeckoChromeForm'#15'GeckoChromeForm'#4'Left'#3#192#0#6'Height'#3'X'
|
||||
+#2#3'Top'#2'k'#5'Width'#3' '#3#11'Font.Height'#2#244#9'Font.Name'#6#6'Tahoma'
|
||||
+#7'OnClose'#7#9'FormClose'#8'OnCreate'#7#10'FormCreate'#8'OnResize'#7#10'For'
|
||||
+'mResize'#10'LCLVersion'#6#6'0.9.29'#0#0
|
||||
]);
|
||||
|
@ -41,7 +41,7 @@ unit GeckoChromeWindow;
|
||||
interface
|
||||
|
||||
uses
|
||||
{$IFNDEF LCL} Windows, Messages, {$ELSE} LclIntf, LMessages, LResources, {$ENDIF}
|
||||
{$IFNDEF LCL} Windows, Messages, {$ELSE} LclIntf, LResources, {$ENDIF}
|
||||
SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, CallbackInterfaces, nsXPCOM, nsTypes, nsXPCOM_std19
|
||||
{$IFDEF LCLCarbon}, CarbonPrivate {$ENDIF}
|
||||
@ -60,7 +60,7 @@ type
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormResize(Sender: TObject);
|
||||
private
|
||||
{ Private �錾 }
|
||||
{ Private 錾 }
|
||||
FWebBrowser: nsIWebBrowser;
|
||||
FChromeFlags: Longword;
|
||||
|
||||
@ -98,12 +98,12 @@ type
|
||||
// for nsISupportsWeakReference
|
||||
function GetWeakReference(): nsIWeakReference; safecall;
|
||||
|
||||
function GetNativeWindow : Pointer; //FPC port: added this.
|
||||
function GetNativeWindow : THANDLE; //FPC port: added this.
|
||||
procedure InitWebBrowser;
|
||||
procedure UpdateChrome;
|
||||
procedure ContentFinishedLoading;
|
||||
public
|
||||
{ Public �錾 }
|
||||
{ Public 錾 }
|
||||
function SafeCallException(Obj: TObject; Addr: Pointer): HResult; override;
|
||||
|
||||
constructor CreateWithChromeFlags(AOwner: TComponent; aChromeFlags: Longword);
|
||||
@ -126,6 +126,13 @@ implementation
|
||||
uses
|
||||
nsXPCOMGlue, nsError, BrowserSupports;
|
||||
|
||||
{$PUSH}
|
||||
{$HINTS OFF}
|
||||
procedure UseParameter(var X);
|
||||
begin
|
||||
end;
|
||||
{$POP}
|
||||
|
||||
constructor TGeckoChromeForm.CreateWithChromeFlags(AOwner: TComponent; AChromeFlags: Longword);
|
||||
begin
|
||||
inherited Create(AOwner);
|
||||
@ -139,16 +146,16 @@ begin
|
||||
Action := caFree;
|
||||
end;
|
||||
|
||||
function TGeckoChromeForm.GetNativeWindow : Pointer;
|
||||
function TGeckoChromeForm.GetNativeWindow : THANDLE;
|
||||
{$IFDEF LCLCocoa}
|
||||
var
|
||||
ARect : NSRect;
|
||||
AView : NSView;
|
||||
{$ENDIF}
|
||||
begin
|
||||
{$IFDEF MSWINDOWS}Result := Pointer(Handle);{$ENDIF}
|
||||
{$IFDEF MSWINDOWS}Result := Handle;{$ENDIF}
|
||||
|
||||
{$IFDEF LCLCarbon}Result := Pointer(TCarbonWindow(Handle).Window);{$ENDIF}
|
||||
{$IFDEF LCLCarbon}Result := TCarbonWindow(Handle).Window;{$ENDIF}
|
||||
//Carbon doesn't work but leave in so package compiles in Carbon IDE.
|
||||
|
||||
// {$IFDEF LCLCocoa}Result := Pointer(TCocoaForm(Handle).MainWindowView.superview);{$ENDIF}
|
||||
@ -163,16 +170,16 @@ begin
|
||||
ARect.origin.y := 15;
|
||||
AView := NSView.alloc.initWithFrame(ARect);
|
||||
NSView(TCocoaWindow(Handle).contentView).addSubView(AView);
|
||||
Result := Pointer(AView);
|
||||
Result := HANDLE(AView);
|
||||
{$ENDIF}
|
||||
|
||||
//NSLog(NSStringUtf8(FloatToStr(NSView(TCocoaWindow(Handle).contentView).frame.size.width)));
|
||||
// {$IFDEF LCLCocoa}Result := Pointer(TCocoaWindow(Handle).contentView);{$ENDIF}
|
||||
//New ObjC-based Cocoa widgetset.
|
||||
|
||||
{$IFDEF LCLGtk}Result := Pointer(Handle);{$ENDIF} //Is Handle same as GTK Window?
|
||||
{$IFDEF LCLGtk}Result := Handle;{$ENDIF} //Is Handle same as GTK Window?
|
||||
|
||||
{$IFDEF LCLGtk2}Result := Pointer(Handle);{$ENDIF} //Is Handle same as GTK Window?
|
||||
{$IFDEF LCLGtk2}Result := Handle;{$ENDIF} //Is Handle same as GTK Window?
|
||||
end;
|
||||
|
||||
procedure TGeckoChromeForm.InitWebBrowser;
|
||||
@ -227,7 +234,8 @@ end;
|
||||
|
||||
function TGeckoChromeForm.DoCreateChromeWindow(chromeFlags: Longword): nsIWebBrowserChrome;
|
||||
begin
|
||||
//Result := nil;
|
||||
UseParameter(chromeFlags);
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
function TGeckoChromeForm.GetWebBrowserChrome: nsIWebBrowserChrome;
|
||||
@ -237,6 +245,7 @@ end;
|
||||
|
||||
procedure TGeckoChromeForm.SetStatus(statusType: Longword; const status: PWideChar);
|
||||
begin
|
||||
UseParameter(statusType);
|
||||
end;
|
||||
|
||||
function TGeckoChromeForm.GetWebBrowser: nsIWebBrowser;
|
||||
@ -246,6 +255,7 @@ end;
|
||||
|
||||
procedure TGeckoChromeForm.SetWebBrowser(aWebBrowser: nsIWebBrowser);
|
||||
begin
|
||||
UseParameter(aWebBrowser);
|
||||
end;
|
||||
|
||||
function TGeckoChromeForm.GetChromeFlags: PRUint32;
|
||||
@ -284,8 +294,9 @@ begin
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
procedure TGeckoChromeForm.ExitModalEventLoop(aStatus: PRUint32);
|
||||
procedure TGeckoChromeForm.ExitModalEventLoop(aStatus: nsresult); safecall;
|
||||
begin
|
||||
UseParameter(aStatus);
|
||||
ModalResult := 1;
|
||||
end;
|
||||
|
||||
@ -359,6 +370,7 @@ end;
|
||||
|
||||
procedure TGeckoChromeForm.SetVisibility(Value: LongBool);
|
||||
begin
|
||||
UseParameter(Value);
|
||||
//Visible := Value;
|
||||
end;
|
||||
|
||||
@ -374,11 +386,18 @@ end;
|
||||
|
||||
function TGeckoChromeForm.GetSiteWindow: Pointer;
|
||||
begin
|
||||
Result := GetNativeWindow;
|
||||
//Known "not safe" conversion.
|
||||
{$PUSH}
|
||||
{$HINTS OFF}
|
||||
Result := Pointer(GetNativeWindow);
|
||||
{$POP}
|
||||
end;
|
||||
|
||||
procedure TGeckoChromeForm.OnStateChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; aStateFlags: PRUint32; aStatus: nsresult);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(aStatus);
|
||||
if ((aStateFlags and NS_IWEBPROGRESSLISTENER_STATE_STOP)<>0) and
|
||||
((aStateFlags and NS_IWEBPROGRESSLISTENER_STATE_IS_DOCUMENT)<>0) then
|
||||
begin
|
||||
@ -388,21 +407,35 @@ end;
|
||||
|
||||
procedure TGeckoChromeForm.OnProgressChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; aCurSelfProgress: PRInt32; aMaxSelfProgress: PRInt32; aCurTotalProgress: PRInt32; aMaxTotalProgress: PRInt32);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(aCurSelfProgress);
|
||||
UseParameter(aMaxSelfProgress);
|
||||
UseParameter(aCurTotalProgress);
|
||||
UseParameter(aMaxTotalProgress);
|
||||
end;
|
||||
|
||||
procedure TGeckoChromeForm.OnLocationChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; location: nsIURI);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(location);
|
||||
end;
|
||||
|
||||
procedure TGeckoChromeForm.OnStatusChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; aStatus: nsresult; const aMessage: PWideChar);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(aStatus);
|
||||
end;
|
||||
|
||||
procedure TGeckoChromeForm.OnSecurityChange(aWebProgress: nsIWebProgress; aRequest: nsIRequest; state: PRUint32);
|
||||
begin
|
||||
UseParameter(aWebProgress);
|
||||
UseParameter(aRequest);
|
||||
UseParameter(state);
|
||||
end;
|
||||
|
||||
|
||||
function TGeckoChromeForm.NS_GetInterface(const uuid: TGUID; out Intf): nsresult;
|
||||
var
|
||||
domwin: nsIDOMWindow;
|
||||
@ -471,6 +504,7 @@ const
|
||||
|
||||
function TGeckoChromeForm.SafeCallException(Obj: TObject; Addr: Pointer): HResult;
|
||||
begin
|
||||
UseParameter(Addr);
|
||||
if Obj is EIntfCastError then
|
||||
Result := E_NOINTERFACE
|
||||
else
|
||||
|
@ -21,11 +21,19 @@
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<IOChecks Value="True"/>
|
||||
<RangeChecks Value="True"/>
|
||||
<OverflowChecks Value="True"/>
|
||||
<StackChecks Value="True"/>
|
||||
</Checks>
|
||||
<VerifyObjMethodCallValidity Value="True"/>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<GenerateDebugInfo Value="True"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
<Other>
|
||||
<WriteFPCLogo Value="False"/>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
|
@ -3,7 +3,7 @@ unit nsXPCOM_std19;
|
||||
interface
|
||||
|
||||
uses
|
||||
nsConsts, nsGeckoStrings, nsTypes;
|
||||
nsGeckoStrings, nsTypes;
|
||||
|
||||
const
|
||||
NS_ISUPPORTS_STD19_IID: TGUID = '{00000000-0000-0000-c000-000000000046}';
|
||||
|
@ -37,7 +37,18 @@ unit nsConsts;
|
||||
interface
|
||||
|
||||
const
|
||||
GRE_WIN_REG_LOC = 'Software\mozilla.org\GRE\';
|
||||
{$IFDEF MSWINDOWS}
|
||||
XPCOM_DLL = 'xpcom.dll';
|
||||
XUL_DLL = 'xul.dll';
|
||||
{$ENDIF}
|
||||
{$IFDEF UNIX}
|
||||
XPCOM_DLL = 'libxpcom.so';
|
||||
XUL_DLL = 'libxul.so';
|
||||
{$ENDIF}
|
||||
|
||||
const
|
||||
GRE_MOZILLA_WIN_REG_LOC = 'Software\mozilla.org\GRE\';
|
||||
GRE_FIREFOX_BASE_WIN_REG_LOC = 'SOFTWARE\Mozilla\Mozilla Firefox';
|
||||
|
||||
// 1.7 Release
|
||||
MOZILLA_VERSION = 1.7;
|
||||
|
@ -36,11 +36,7 @@ unit nsGeckoStrings;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
nsConsts, nsTypes;
|
||||
|
||||
type
|
||||
|
||||
nsAString = ^nsStringContainer;
|
||||
nsString = nsAString;
|
||||
nsStringContainer = record
|
||||
|
@ -37,7 +37,9 @@ unit nsInit;
|
||||
interface
|
||||
|
||||
uses
|
||||
nsXPCOM, nsConsts, nsTypes, nsGeckoStrings;
|
||||
sysutils,Classes,LCLProc,FileUtil,nsXPCOM, nsConsts, nsTypes, nsGeckoStrings
|
||||
{$IFDEF MSWINDOWS},registry{$ENDIF}
|
||||
;
|
||||
|
||||
// XPCOM Functions
|
||||
function NS_InitXPCOM2(out servMgr: nsIServiceManager; binDir: nsIFile; appFileLocationProvider: nsIDirectoryServiceProvider): nsresult; cdecl;
|
||||
@ -51,8 +53,8 @@ function NS_NewNativeLocalFile(const Path: nsACString; FollowLinks: PRBool; out
|
||||
function NS_GetDebug(out debug: nsIDebug): nsresult; cdecl;
|
||||
function NS_GetTraceRefcnt(out traceRefcnt: nsITraceRefcnt): nsresult; cdecl;
|
||||
|
||||
type
|
||||
PLongBool = ^LongBool;
|
||||
//type
|
||||
// PLongBool = ^LongBool;
|
||||
|
||||
function NS_StringContainerInit(var aContainer: nsStringContainer): nsresult; cdecl;
|
||||
procedure NS_StringContainerFinish(var aContainer: nsStringContainer); cdecl;
|
||||
@ -81,8 +83,8 @@ type
|
||||
NS_ENCODING_UTF8 = 1,
|
||||
NS_ENCODING_NATIVE_FILESYSTEM = 2);
|
||||
|
||||
function NS_CStringToUTF16(const aSource: nsACString; aSrcEncoding: nsSourceEncoding; aDest: nsAString): Longword; cdecl;
|
||||
function NS_UTF16ToCString(const aSource: nsAString; aSrcEncoding: nsSourceEncoding; aDest: nsACString): Longword; cdecl;
|
||||
function NS_CStringToUTF16(const aSource: nsACString; aSrcEncoding: nsSourceEncoding; aDest: nsAString): nsresult; cdecl;
|
||||
function NS_UTF16ToCString(const aSource: nsAString; aSrcEncoding: nsSourceEncoding; aDest: nsACString): nsresult; cdecl;
|
||||
|
||||
// Added for Gecko 1.8
|
||||
type
|
||||
@ -99,7 +101,7 @@ type
|
||||
function NS_Alloc(size: PRSize): Pointer; cdecl;
|
||||
function NS_Realloc(ptr: Pointer; size: PRSize): Pointer; cdecl;
|
||||
procedure NS_Free(ptr: Pointer); cdecl;
|
||||
function NS_InitXPCOM3(out servMgr: nsIServiceManager; binDir: nsIFile; appFileLocationProvider: nsIDirectoryServiceProvider; const staticComponents: nsStaticModuleInfoArray; componentCount: PRUint32): nsresult; cdecl;
|
||||
function NS_InitXPCOM3(out servMgr: nsIServiceManager; binDir: nsIFile; appFileLocationProvider: nsIDirectoryServiceProvider; var staticComponents: nsStaticModuleInfoArray; componentCount: PRUint32): nsresult; cdecl;
|
||||
|
||||
function NS_StringContainerInit2(var aContainer: nsStringContainer; const aStr: PWideChar; aOffset, aLength: PRUint32): nsresult; cdecl;
|
||||
procedure NS_StringSetIsVoid(aStr: nsAString; const aIsVoid: PRBool); cdecl;
|
||||
@ -230,7 +232,6 @@ type
|
||||
upper: PAnsiChar;
|
||||
upperInclusive: PRBool;
|
||||
end;
|
||||
PGREVersionRangeArray = ^TGREVersionRangeArray;
|
||||
TGREVersionRangeArray = array [0..MaxInt div SizeOf(TGREVersionRange)-1] of TGREVersionRange;
|
||||
|
||||
PGREProperty = ^TGREProperty;
|
||||
@ -238,7 +239,6 @@ type
|
||||
property_: PAnsiChar;
|
||||
value: PAnsiChar;
|
||||
end;
|
||||
PGREPropertyArray = ^TGREPropertyArray;
|
||||
TGREPropertyArray = array [0..MaxInt div SizeOf(TGREProperty)-1] of TGREProperty;
|
||||
|
||||
PNSFuncPtr = ^NSFuncPtr;
|
||||
@ -269,8 +269,8 @@ function XPCOMGlueStartup(xpcomFile: PAnsiChar): nsresult;
|
||||
function XPCOMGlueShutdown: nsresult;
|
||||
function XPCOMGlueLoadXULFunctions(aSymbols: PDynamicFunctionLoad): nsresult;
|
||||
|
||||
function GRE_Startup: Longword;
|
||||
function GRE_Shutdown: Longword;
|
||||
function GRE_Startup: nsresult;
|
||||
function GRE_Shutdown: nsresult;
|
||||
|
||||
|
||||
// PChar functions
|
||||
@ -290,14 +290,42 @@ function NS_StrLCat(Dest: PWideChar; const Source: PWideChar; maxLen: Cardinal):
|
||||
function NS_StrComp(const Str1, Str2: PWideChar): Integer; overload;
|
||||
function NS_StrRScan(const Str: PWideChar; Chr: WideChar): PWideChar; overload;
|
||||
|
||||
{$IFDEF MSWINDOWS}
|
||||
function NS_CurrentProcessDirectory(buf: PAnsiChar; bufLen: Cardinal): Boolean;
|
||||
{$ENDIF}
|
||||
|
||||
type
|
||||
TAnsiCharArray = array [0..High(Word) div SizeOf(AnsiChar)] of AnsiChar;
|
||||
TMaxPathChar = array[0..MAX_PATH] of AnsiChar;
|
||||
// HINST = TLibHandle;
|
||||
PDependentLib = ^TDependentLib;
|
||||
TDependentLib = record
|
||||
libHandle: HMODULE;
|
||||
next: PDependentLib;
|
||||
end;
|
||||
|
||||
|
||||
type
|
||||
nsIDirectoryServiceProvider_stdcall = interface(nsISupports)
|
||||
['{bbf8cab0-d43a-11d3-8cc2-00609792278c}']
|
||||
function GetFile(const prop: PAnsiChar; out persistent: PRBool; out AFile: nsIFile): nsresult; stdcall;
|
||||
end;
|
||||
|
||||
nsGREDirServiceProvider = class(TInterfacedObject,
|
||||
nsIDirectoryServiceProvider_stdcall)
|
||||
public
|
||||
FPathEnvString: TMaxPathChar;
|
||||
class function NewInstance: TObject; override;
|
||||
procedure FreeInstance; override;
|
||||
function GetFile(const prop: PAnsiChar; out persistent: PRBool; out AFile: nsIFile): nsresult; stdcall;
|
||||
function GetGreDirectory(out AFile: nsILocalFile): nsresult;
|
||||
end;
|
||||
|
||||
procedure ZeroArray(out AArray; const ASize: SizeInt);
|
||||
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
{$IFDEF MSWINDOWS} Windows, {$ELSE} DynLibs, {$ENDIF} nsError, nsMemory, SysUtils;
|
||||
{$IFDEF MSWINDOWS} Windows, {$ELSE} DynLibs, {$ENDIF} nsError, nsMemory;
|
||||
|
||||
type
|
||||
XPCOMExitRoutine = function : Longword; stdcall;
|
||||
@ -316,7 +344,7 @@ type
|
||||
AllocFunc = function (size: PRSize): Pointer; cdecl;
|
||||
ReallocFunc = function (ptr: Pointer; size: PRSize): Pointer; cdecl;
|
||||
FreeFunc = procedure (ptr: Pointer); cdecl;
|
||||
Init3Func = function (out servMgr: nsIServiceManager; binDir: nsIFile; provider: nsIDirectoryServiceProvider; const staticComponents: nsStaticModuleInfoArray; componentCount: PRUint32): nsresult; cdecl;
|
||||
Init3Func = function (out servMgr: nsIServiceManager; binDir: nsIFile; provider: nsIDirectoryServiceProvider; var staticComponents: nsStaticModuleInfoArray; componentCount: PRUint32): nsresult; cdecl;
|
||||
|
||||
GetDebugFunc = function (out debug: nsIDebug): Longword; cdecl;
|
||||
GetTraceRefcntFunc = function (out traceRefcnt: nsITraceRefcnt): Longword; cdecl;
|
||||
@ -439,7 +467,7 @@ var
|
||||
|
||||
function NS_InitXPCOM2(out servMgr: nsIServiceManager;
|
||||
binDir: nsIFile;
|
||||
appFileLocationProvider: nsIDirectoryServiceProvider): Longword;
|
||||
appFileLocationProvider: nsIDirectoryServiceProvider): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.init) then
|
||||
Result := xpcomFunc.init(servMgr, binDir, appFileLocationProvider)
|
||||
@ -447,7 +475,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_ShutdownXPCOM(servMgr: nsIServiceManager): Longword;
|
||||
function NS_ShutdownXPCOM(servMgr: nsIServiceManager): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.shutdown) then
|
||||
Result := xpcomFunc.shutdown(servMgr)
|
||||
@ -455,7 +483,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_GetServiceManager(out servMgr: nsIServiceManager): Longword;
|
||||
function NS_GetServiceManager(out servMgr: nsIServiceManager): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.getServiceManager) then
|
||||
Result := xpcomFunc.getServiceManager(servMgr)
|
||||
@ -508,7 +536,7 @@ begin
|
||||
end;
|
||||
|
||||
function NS_RegisterXPCOMExitRoutine(exitRoutine: XPCOMExitRoutine;
|
||||
priority: Longword): Longword;
|
||||
priority: Longword): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.registerXPCOMExitRoutine) then
|
||||
Result := xpcomFunc.registerXPCOMExitRoutine(exitRoutine, priority)
|
||||
@ -516,7 +544,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_UnregisterXPCOMExitRoutine(exitRoutine: XPCOMExitRoutine): Longword;
|
||||
function NS_UnregisterXPCOMExitRoutine(exitRoutine: XPCOMExitRoutine): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.unregisterXPCOMExitRoutine) then
|
||||
Result := xpcomFunc.unregisterXPCOMExitRoutine(exitRoutine)
|
||||
@ -524,7 +552,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_GetDebug(out debug: nsIDebug): Longword;
|
||||
function NS_GetDebug(out debug: nsIDebug): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.getDebug) then
|
||||
Result := xpcomFunc.getDebug(debug)
|
||||
@ -532,7 +560,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_GetTraceRefcnt(out traceRefcnt: nsITraceRefcnt): Longword;
|
||||
function NS_GetTraceRefcnt(out traceRefcnt: nsITraceRefcnt): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.getTraceRefCnt) then
|
||||
Result := xpcomFunc.getTraceRefCnt(traceRefcnt)
|
||||
@ -540,7 +568,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_StringContainerInit(var aContainer: nsStringContainer): Longword;
|
||||
function NS_StringContainerInit(var aContainer: nsStringContainer): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.stringContainerInit) then
|
||||
Result := xpcomFunc.stringContainerInit(aContainer)
|
||||
@ -554,7 +582,7 @@ begin
|
||||
xpcomFunc.stringContainerFinish(aContainer);
|
||||
end;
|
||||
|
||||
function NS_StringGetData(const aStr: nsAString; out aData: PWideChar; aTerminated: PLongBool): Longword;
|
||||
function NS_StringGetData(const aStr: nsAString; out aData: PWideChar; aTerminated: PLongBool): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.stringGetData) then
|
||||
Result := xpcomFunc.stringGetData(aStr, aData, aTerminated)
|
||||
@ -595,7 +623,7 @@ begin
|
||||
NS_StringSetDataRange(aStr, aCutOffset, aCutLength, nil, 0);
|
||||
end;
|
||||
|
||||
function NS_CStringContainerInit(var aContainer: nsCStringContainer): Longword;
|
||||
function NS_CStringContainerInit(var aContainer: nsCStringContainer): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.cstringContainerInit) then
|
||||
Result := xpcomFunc.cstringContainerInit(aContainer)
|
||||
@ -650,7 +678,7 @@ begin
|
||||
NS_CStringSetDataRange(aStr, aCutOffset, aCutLength, nil, 0);
|
||||
end;
|
||||
|
||||
function NS_CStringToUTF16(const aSource: nsACString; aSrcEncoding: nsSourceEncoding; aDest: nsAString): Longword;
|
||||
function NS_CStringToUTF16(const aSource: nsACString; aSrcEncoding: nsSourceEncoding; aDest: nsAString): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.cstringToUTF16) then
|
||||
Result := xpcomFunc.cstringToUTF16(aSource, aSrcEncoding, aDest)
|
||||
@ -658,7 +686,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
|
||||
function NS_UTF16ToCString(const aSource: nsAString; aSrcEncoding: nsSourceEncoding; aDest: nsACString): Longword;
|
||||
function NS_UTF16ToCString(const aSource: nsAString; aSrcEncoding: nsSourceEncoding; aDest: nsACString): nsresult;
|
||||
begin
|
||||
if Assigned(xpcomFunc.UTF16ToCString) then
|
||||
Result := xpcomFunc.UTF16ToCString(aSource, aSrcEncoding, aDest)
|
||||
@ -705,7 +733,7 @@ begin
|
||||
xpcomFunc.free(ptr);
|
||||
end;
|
||||
|
||||
function NS_InitXPCOM3(out servMgr: nsIServiceManager; binDir: nsIFile; appFileLocationProvider: nsIDirectoryServiceProvider; const staticComponents: nsStaticModuleInfoArray; componentCount: PRUint32): nsresult; cdecl;
|
||||
function NS_InitXPCOM3(out servMgr: nsIServiceManager; binDir: nsIFile; appFileLocationProvider: nsIDirectoryServiceProvider; var staticComponents: nsStaticModuleInfoArray; componentCount: PRUint32): nsresult; cdecl;
|
||||
//FPC port: added const to staticComponents and changed componentCount from
|
||||
// PRInt32 to PRUInt32 so they match init3 - wouldn't assemble otherwise on PowerPC.
|
||||
begin
|
||||
@ -849,6 +877,7 @@ function GRE_GetPathFromRegKey(
|
||||
properties: PGREPropertyArray;
|
||||
propertiesLength: PRUint32;
|
||||
buf: PAnsiChar; buflen: PRUint32): PRBool; forward;
|
||||
{$ENDIF}
|
||||
|
||||
function GRE_GetGREPathWithProperties(
|
||||
aVersions: PGREVersionRange;
|
||||
@ -857,11 +886,39 @@ function GRE_GetGREPathWithProperties(
|
||||
propertiesLength: PRUint32;
|
||||
buf: PAnsiChar; buflen: PRUint32): nsresult;
|
||||
var
|
||||
env: array[0..MAX_PATH] of AnsiChar;
|
||||
env: string;
|
||||
hRegKey: HKEY;
|
||||
ok: PRBool;
|
||||
versions: PGREVersionRangeArray;
|
||||
properties: PGREPropertyArray;
|
||||
GeckoVersion: String;
|
||||
function GRE_FireFox(): string;
|
||||
var
|
||||
Reg: TRegistry;
|
||||
FF: string;
|
||||
begin
|
||||
Reg:=TRegistry.Create(KEY_ALL_ACCESS);
|
||||
Reg.RootKey:=HKEY_LOCAL_MACHINE;
|
||||
if Reg.OpenKeyReadOnly(GRE_FIREFOX_BASE_WIN_REG_LOC) then begin
|
||||
FF:=Reg.ReadString('CurrentVersion');
|
||||
FF:=LeftStr(FF,Pos(' ',FF)-1);
|
||||
Reg.CloseKey;
|
||||
FF:=format('%s %s',[GRE_FIREFOX_BASE_WIN_REG_LOC,FF]);
|
||||
if Reg.OpenKeyReadOnly(FF) then begin
|
||||
GeckoVersion:=Reg.ReadString('GeckoVer');
|
||||
if GeckoVersion<>'' then begin
|
||||
Reg.CloseKey;
|
||||
FF:=FF+'\bin';
|
||||
if Reg.OpenKeyReadOnly(FF) then begin
|
||||
Result:=Reg.ReadString('PathToExe');
|
||||
Result:=ExtractFilePath(Result)+XPCOM_DLL;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
Reg.CloseKey;
|
||||
Reg.Free;
|
||||
end;
|
||||
begin
|
||||
versions := PGREVersionRangeArray(aVersions);
|
||||
properties := PGREPropertyArray(aProperties);
|
||||
@ -876,15 +933,18 @@ begin
|
||||
end;
|
||||
*)
|
||||
|
||||
if GetEnvironmentVariableA('USE_LOCAL_GRE', env, MAX_PATH)>0 then
|
||||
env:=sysutils.GetEnvironmentVariable('USE_LOCAL_GRE');
|
||||
if env<>''then
|
||||
begin
|
||||
buf[0] := #0;
|
||||
strlcopy(Buf,pchar(env+PathDelim+XPCOM_DLL),buflen);
|
||||
Result := NS_OK;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
{$IFDEF MSWINDOWS}
|
||||
//Check for default mozilla GRE
|
||||
hRegKey := 0;
|
||||
if RegOpenKeyEx(HKEY_CURRENT_USER, GRE_WIN_REG_LOC, 0,
|
||||
if RegOpenKeyEx(HKEY_CURRENT_USER, GRE_MOZILLA_WIN_REG_LOC, 0,
|
||||
KEY_READ, hRegKey) = ERROR_SUCCESS then
|
||||
begin
|
||||
ok := GRE_GetPathFromRegKey(hRegkey,
|
||||
@ -899,7 +959,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
if RegOpenKeyEx(HKEY_LOCAL_MACHINE, GRE_WIN_REG_LOC, 0,
|
||||
if RegOpenKeyEx(HKEY_LOCAL_MACHINE, GRE_MOZILLA_WIN_REG_LOC, 0,
|
||||
KEY_READ, hRegKey) = ERROR_SUCCESS then
|
||||
begin
|
||||
ok := GRE_GetPathFromRegKey(hRegKey,
|
||||
@ -913,10 +973,16 @@ begin
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
//Check for Firefox GRE
|
||||
(*GrePath:=GRE_FireFox();
|
||||
if GrePath<>'' then begin
|
||||
strlcopy(buf,pchar(GrePath),bufLen);
|
||||
Result:=NS_OK;
|
||||
exit;
|
||||
end;*)
|
||||
{$ENDIF}
|
||||
Result := NS_ERROR_FAILURE;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
function CheckVersion(toCheck: PAnsiChar;
|
||||
const versions: PGREVersionRangeArray;
|
||||
@ -980,8 +1046,6 @@ function GRE_GetPathFromRegKey(
|
||||
properties: PGREPropertyArray;
|
||||
propertiesLength: PRUint32;
|
||||
buf: PAnsiChar; buflen: PRUint32): PRBool;
|
||||
const
|
||||
XPCOM_DLL = 'xpcom.dll';
|
||||
var
|
||||
i, j: DWORD;
|
||||
name: array [0..MAX_PATH] of AnsiChar;
|
||||
@ -1058,23 +1122,6 @@ begin
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
type
|
||||
TAnsiCharArray = array [0..High(Word) div SizeOf(AnsiChar)] of AnsiChar;
|
||||
PAnsiCharArray = ^TAnsiCharArray;
|
||||
TMaxPathChar = array[0..MAX_PATH] of AnsiChar;
|
||||
{$IFNDEF MSWINDOWS}
|
||||
HINST = TLibHandle;
|
||||
{$ENDIF}
|
||||
PDependentLib = ^TDependentLib;
|
||||
TDependentLib = record
|
||||
libHandle: HINST;
|
||||
next: PDependentLib;
|
||||
end;
|
||||
|
||||
const
|
||||
XPCOM_DLL = 'xpcom.dll';
|
||||
XUL_DLL = 'xul.dll';
|
||||
|
||||
var
|
||||
sDependentLibs: PDependentLib = nil;
|
||||
sXULLibrary: HINST = 0;
|
||||
@ -1084,37 +1131,34 @@ type
|
||||
|
||||
function XPCOMGlueLoad(xpcomFile: PAnsiChar): GetFrozenFunctionsFunc; forward;
|
||||
procedure XPCOMGlueUnload(); forward;
|
||||
{$IFDEF MSWINDOWS}
|
||||
function fullpath(absPath, relPath: PAnsiChar; maxLength: PRUint32): PAnsiChar; forward;
|
||||
{$ENDIF}
|
||||
|
||||
const
|
||||
BUFFEREDFILE_BUFSIZE = 256;
|
||||
type
|
||||
TBufferedFile = record
|
||||
f: THandle;
|
||||
fs: TFileStream;
|
||||
buf: array [0..BUFFEREDFILE_BUFSIZE-1] of AnsiChar;
|
||||
bufPos: Integer;
|
||||
bufMax: Integer;
|
||||
end;
|
||||
|
||||
{$IFDEF MSWINDOWS}
|
||||
function BufferedFile_Open(name: PAnsiChar; var ret: TBufferedFile): Boolean;
|
||||
function BufferedFile_Open(name: PAnsiChar; out ret: TBufferedFile): Boolean;
|
||||
begin
|
||||
Result := False;
|
||||
ret.f := CreateFileA(name, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
if ret.f <> INVALID_HANDLE_VALUE then
|
||||
begin
|
||||
Result := True;
|
||||
end;
|
||||
try
|
||||
ret.fs:=TFileStream.Create(name,fmOpenRead, fmShareDenyWrite);
|
||||
result:=true;
|
||||
ret.bufPos := 0;
|
||||
ret.bufMax := -1;
|
||||
except
|
||||
ret.fs:=nil;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure BufferedFile_Close(var aFile: TBufferedFile);
|
||||
begin
|
||||
CloseHandle(aFile.f);
|
||||
aFile.f := 0;
|
||||
afile.fs.Free;
|
||||
afile.fs:=nil;
|
||||
aFile.bufPos := 0;
|
||||
aFile.bufMax := -1;
|
||||
end;
|
||||
@ -1123,7 +1167,7 @@ procedure BufferedFile_ReadBuffer(var aFile: TBufferedFile);
|
||||
var
|
||||
readSize: DWORD;
|
||||
begin
|
||||
if ReadFile(aFile.f, aFile.buf, BUFFEREDFILE_BUFSIZE, readSize, nil) then
|
||||
readSize:=aFile.fs.Read(aFile.buf, BUFFEREDFILE_BUFSIZE);
|
||||
begin
|
||||
aFile.bufPos := 0;
|
||||
aFile.bufMax := readSize;
|
||||
@ -1207,7 +1251,6 @@ begin
|
||||
BufferedFile_Close(f);
|
||||
end;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
procedure AppendDependentLib(libHandle: HINST);
|
||||
var
|
||||
@ -1224,14 +1267,20 @@ end;
|
||||
procedure ReadDependentCB(aDependentLib: PAnsiChar);
|
||||
var
|
||||
h: HINST;
|
||||
OldDir: string;
|
||||
NewDir: string;
|
||||
begin
|
||||
{$IFDEF MSWINDOWS}
|
||||
h := LoadLibraryExA(aDependentLib, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
{$ELSE}
|
||||
//Changes directory temporaly to resolve automatic modules loading
|
||||
//in a crossplatform way.
|
||||
OldDir:=GetCurrentDir;
|
||||
NewDir:=ExtractFilePath(aDependentLib);
|
||||
SetCurrentDir(NewDir);
|
||||
h := LoadLibrary(aDependentLib);
|
||||
{$ENDIF}
|
||||
SetCurrentDir(OldDir);
|
||||
if h <> 0 then
|
||||
AppendDependentLib(h);
|
||||
AppendDependentLib(h)
|
||||
else
|
||||
Raise Exception.Create('Missing Gecko runtime library: '+aDependentLib);
|
||||
end;
|
||||
|
||||
function XPCOMGlueLoad(xpcomFile: PAnsiChar): GetFrozenFunctionsFunc;
|
||||
@ -1240,7 +1289,6 @@ var
|
||||
idx: PRInt32;
|
||||
h: HINST;
|
||||
begin
|
||||
{$IFDEF MSWINDOWS}
|
||||
if (xpcomFile[0]='.') and (xpcomFile[1]=#0) then
|
||||
begin
|
||||
xpcomFile := XPCOM_DLL;
|
||||
@ -1254,14 +1302,11 @@ begin
|
||||
xpcomDir[idx] := #0;
|
||||
XPCOMGlueLoadDependentLibs(xpcomDir, ReadDependentCB);
|
||||
NS_StrLCat(xpcomdir, '\'+xul_dll, sizeof(xpcomdir));
|
||||
sXULLibrary := LoadLibraryExA(xpcomdir, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
sXULLibrary := LoadLibrary(xpcomdir);
|
||||
end;
|
||||
end;
|
||||
|
||||
h := LoadLibraryExA(xpcomFile, 0, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
{$ELSE}
|
||||
h := LoadLibrary(xpcomFile);
|
||||
{$ENDIF}
|
||||
|
||||
if h <> 0 then
|
||||
begin
|
||||
@ -1294,9 +1339,8 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function XPCOMGlueStartup(xpcomFile: PAnsiChar): Longword;
|
||||
function XPCOMGlueStartup(xpcomFile: PAnsiChar): nsresult;
|
||||
const
|
||||
XPCOM_DLL = 'xpcom.dll';
|
||||
XPCOM_GLUE_VERSION = 1;
|
||||
var
|
||||
func: GetFrozenFunctionsFunc;
|
||||
@ -1320,7 +1364,7 @@ begin
|
||||
XPCOMGlueUnload();
|
||||
end;
|
||||
|
||||
function XPCOMGlueShutdown: Longword;
|
||||
function XPCOMGlueShutdown: nsresult;
|
||||
begin
|
||||
XPCOMGlueUnload();
|
||||
|
||||
@ -1333,8 +1377,6 @@ function XPCOMGlueLoadXULFunctions(aSymbols: PDynamicFunctionLoad): nsresult;
|
||||
var
|
||||
i: Integer;
|
||||
symbols: PDynamicFunctionLoadArray;
|
||||
type
|
||||
PPointer = ^Pointer;
|
||||
begin
|
||||
symbols := PDynamicFunctionLoadArray(aSymbols);
|
||||
|
||||
@ -1394,7 +1436,7 @@ var
|
||||
dot: Integer;
|
||||
begin
|
||||
idx := 0;
|
||||
FillChar(vers, sizeof(vers), 0);
|
||||
ZeroArray(vers, sizeof(vers));
|
||||
for i:=0 to 2 do
|
||||
begin
|
||||
dot := idx;
|
||||
@ -1501,35 +1543,21 @@ begin
|
||||
Result := GREVersionCompare(lhsVer, rhsVer);
|
||||
end;
|
||||
|
||||
{$IFDEF MSWINDOWS}
|
||||
// �����t�@�C����GRE�̕K�v�o�[�W�����ɒB���Ă��邩�ׂ��B
|
||||
function CheckGeckoVersion(path: PAnsiChar; const reqVer: TGREVersion): Boolean;
|
||||
const
|
||||
BUFSIZE = 4096;
|
||||
var
|
||||
buf: array[0..BUFSIZE-1] of Char;
|
||||
fileVer: PAnsiChar;
|
||||
dwSize: DWORD;
|
||||
dw: DWORD;
|
||||
greVer: TGREVersion;
|
||||
{$IFDEF GECKO_EXPERIMENTAL}
|
||||
// �����t�@�C����GRE�̕K�v�o[�W�����ɒB���Ă��邩�ׂ�B
|
||||
function GetPathFromConfigDir(dirname: PAnsiChar; buf: PAnsiChar): Boolean;
|
||||
begin
|
||||
//TODO 1: GetPathFromConfigDir �̎���
|
||||
Result := False;
|
||||
|
||||
dwSize := GetFileVersionInfoSizeA(path, dw);
|
||||
if (dwSize<=0) or (dwSize>BUFSIZE) then Exit;
|
||||
|
||||
Result := GetFileVersionInfoA(path, 0, dwSize, @buf);
|
||||
if not Result then Exit;
|
||||
|
||||
// �o�[�W���������̌���ID�͌��ߑł�
|
||||
Result := VerQueryValueA(@buf, '\StringFileInfo\000004b0\FileVersion', Pointer(fileVer), dw);
|
||||
if not Result then Exit;
|
||||
|
||||
greVer := GetGREVersion(fileVer);
|
||||
|
||||
if GREVersionCompare(greVer, reqVer)>=0 then Result := True;
|
||||
end;
|
||||
|
||||
function GetPathFromConfigFile(const filename: PAnsiChar; buf: PAnsiChar): Boolean;
|
||||
begin
|
||||
//TODO 1: GetPathFromConfigFile �̎���
|
||||
Result := False;
|
||||
end;
|
||||
{$ENDIF GECKO_EXPERIMENTAL}
|
||||
|
||||
function IsXpcomDll(const filename: PAnsiChar): Boolean;
|
||||
var
|
||||
module: HMODULE;
|
||||
@ -1545,10 +1573,38 @@ begin
|
||||
FreeLibrary(module);
|
||||
end;
|
||||
|
||||
function CheckGeckoVersion(path: PAnsiChar; const reqVer: TGREVersion): Boolean;
|
||||
const
|
||||
BUFSIZE = 4096;
|
||||
var
|
||||
buf: array[0..BUFSIZE-1] of Char;
|
||||
fileVer: PAnsiChar;
|
||||
dwSize: DWORD;
|
||||
dw: DWORD;
|
||||
greVer: TGREVersion;
|
||||
begin
|
||||
Result := False;
|
||||
dw:=1; //Non zero
|
||||
dwSize := GetFileVersionInfoSizeA(path, dw);
|
||||
if (dwSize<=0) or (dwSize>BUFSIZE) then Exit;
|
||||
|
||||
Result := GetFileVersionInfoA(path, 0, dwSize, @buf);
|
||||
if not Result then Exit;
|
||||
|
||||
// �o[�W��������̌���ID�͌��ߑł�
|
||||
fileVer:=nil;
|
||||
Result := VerQueryValueA(@buf, '\StringFileInfo\000004b0\FileVersion', Pointer(fileVer), dw);
|
||||
if not Result then Exit;
|
||||
|
||||
greVer := GetGREVersion(fileVer);
|
||||
|
||||
if GREVersionCompare(greVer, reqVer)>=0 then Result := True;
|
||||
end;
|
||||
|
||||
function GetLatestGreFromReg(regBase: HKEY; const reqVer: TGREVersion;
|
||||
grePath: PAnsiChar; var greVer: TGREVersion): Boolean;
|
||||
var
|
||||
curKey: HKEY;
|
||||
curKey: HKEY = 0;
|
||||
dwSize: DWORD;
|
||||
i: Integer;
|
||||
keyName: TMaxPathChar;
|
||||
@ -1574,7 +1630,7 @@ begin
|
||||
(GREVersionCompare(ver, greVer)>=0) then
|
||||
begin
|
||||
dllPath := path;
|
||||
NS_StrCat(dllPath, '\xpcom.dll');
|
||||
NS_StrCat(dllPath, '\'+XPCOM_DLL);
|
||||
//if IsXpcomDll(dllPath) then
|
||||
// if CheckGeckoVersion(dllPath, reqVer) and
|
||||
// IsXpcomDll(@dllPath) then
|
||||
@ -1600,7 +1656,7 @@ const
|
||||
nameBase: PAnsiChar = 'Software\mozilla.org\GRE';
|
||||
var
|
||||
rv: HRESULT;
|
||||
base: HKEY;
|
||||
base: HKEY = 0;
|
||||
cuPath, lmPath: TMaxPathChar;
|
||||
cuVer, lmVer: TGREVersion;
|
||||
reqVer: TGREVersion;
|
||||
@ -1609,8 +1665,8 @@ label
|
||||
NoLocalMachine,
|
||||
NoCurrentUser;
|
||||
begin
|
||||
FillChar(cuVer, SizeOf(cuVer), 0);
|
||||
FillChar(lmVer, SizeOf(lmVer), 0);
|
||||
ZeroArray(cuVer, SizeOf(cuVer));
|
||||
ZeroArray(lmVer, SizeOf(lmVer));
|
||||
reqVer := GetGREVersion(GRE_BUILD_ID);
|
||||
|
||||
rv := RegOpenKeyA(HKEY_LOCAL_MACHINE, nameBase, base);
|
||||
@ -1632,27 +1688,13 @@ NoCurrentUser:;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function GetPathFromConfigDir(dirname: PAnsiChar; buf: PAnsiChar): Boolean;
|
||||
begin
|
||||
//TODO 1: GetPathFromConfigDir �̎���
|
||||
Result := False;
|
||||
end;
|
||||
|
||||
function GetPathFromConfigFile(const filename: PAnsiChar; buf: PAnsiChar): Boolean;
|
||||
begin
|
||||
//TODO 1: GetPathFromConfigFile �̎���
|
||||
Result := False;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
var
|
||||
GRELocation: TMaxPathChar;
|
||||
|
||||
function GetGREDirectoryPath(buf: PAnsiChar): Boolean;
|
||||
{$IFDEF MSWINDOWS}
|
||||
const
|
||||
GRE_REGISTRY_KEY = GRE_WIN_REG_LOC + GRE_BUILD_ID;
|
||||
//const
|
||||
// GRE_REGISTRY_KEY = GRE_MOZILLA_WIN_REG_LOC + GRE_BUILD_ID;
|
||||
var
|
||||
cpd:TMaxPathChar;
|
||||
dllPath: TMaxPathChar;
|
||||
@ -1668,7 +1710,7 @@ begin
|
||||
if NS_CurrentProcessDirectory(cpd, MAX_PATH) then
|
||||
begin
|
||||
dllPath := cpd;
|
||||
NS_StrCat(dllPath, '\xpcom.dll');
|
||||
NS_StrCat(dllPath, '\'+XPCOM_DLL);
|
||||
if IsXpcomDll(dllPath) then
|
||||
begin
|
||||
//buf := cpd;
|
||||
@ -1727,22 +1769,6 @@ begin
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
type
|
||||
nsIDirectoryServiceProvider_stdcall = interface(nsISupports)
|
||||
['{bbf8cab0-d43a-11d3-8cc2-00609792278c}']
|
||||
function GetFile(const prop: PAnsiChar; out persistent: PRBool; out AFile: nsIFile): nsresult; stdcall;
|
||||
end;
|
||||
|
||||
nsGREDirServiceProvider = class(TInterfacedObject,
|
||||
nsIDirectoryServiceProvider_stdcall)
|
||||
public
|
||||
FPathEnvString: TMaxPathChar;
|
||||
class function NewInstance: TObject; override;
|
||||
procedure FreeInstance; override;
|
||||
function GetFile(const prop: PAnsiChar; out persistent: PRBool; out AFile: nsIFile): nsresult; stdcall;
|
||||
function GetGreDirectory(out AFile: nsILocalFile): nsresult;
|
||||
end;
|
||||
|
||||
function nsGREDirServiceProvider.GetGreDirectory(out AFile: nsILocalFile): nsresult;
|
||||
var
|
||||
GreDir: TMaxPathChar;
|
||||
@ -1752,6 +1778,7 @@ begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
if not GetGREDirectoryPath(GreDir) then Exit;
|
||||
|
||||
ZeroArray(leaf,sizeof(leaf));
|
||||
Result := NS_CStringContainerInit(leaf);
|
||||
if NS_FAILED(Result) then Exit;
|
||||
NS_CStringSetData(@leaf, GreDir);
|
||||
@ -1836,7 +1863,7 @@ end;
|
||||
var
|
||||
sStartupCount: Integer = 0;
|
||||
|
||||
function GRE_Startup: Longword;
|
||||
function GRE_Startup: nsresult;
|
||||
var
|
||||
xpcomLocation: TMaxPathChar;
|
||||
provider: nsGREDirServiceProvider;
|
||||
@ -1876,7 +1903,7 @@ begin
|
||||
Inc(sStartupCount);
|
||||
end;
|
||||
|
||||
function GRE_Shutdown: Longword;
|
||||
function GRE_Shutdown: nsresult;
|
||||
begin
|
||||
Dec(sStartupCount);
|
||||
|
||||
@ -2123,12 +2150,11 @@ begin
|
||||
Result := (Append^ = #0);
|
||||
end;
|
||||
|
||||
{$IFDEF MSWINDOWS}
|
||||
function fullpath(absPath, relPath: PAnsiChar; maxLength: PRUint32): PAnsiChar;
|
||||
var
|
||||
filePart: PAnsiChar;
|
||||
begin
|
||||
GetFullPathNameA(relPath, maxLength, absPath, filePart);
|
||||
//Path here must arrive already absolute :-?
|
||||
strlcopy(abspath,relpath,maxLength);
|
||||
// GetFullPathNameA(relPath, maxLength, absPath, filePart);
|
||||
Result := absPath;
|
||||
end;
|
||||
|
||||
@ -2137,17 +2163,21 @@ var
|
||||
lastSlash: PAnsiChar;
|
||||
begin
|
||||
Result := False;
|
||||
if SUCCEEDED(GetModuleFileNameA(0, buf, bufLen)) then
|
||||
begin
|
||||
move(ParamStr(0)[1],buf^,min(bufLen,Length(ParamStr(0))));
|
||||
lastSlash := NS_StrRScan(buf, '\');
|
||||
if Assigned(lastSlash) then
|
||||
begin
|
||||
lastSlash^ := #0;
|
||||
Result := True;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
{$ENDIF}
|
||||
|
||||
procedure ZeroArray(out AArray; const ASize: SizeInt);
|
||||
begin
|
||||
{$PUSH}{$HINTS OFF}
|
||||
FillByte(AArray,ASize,0);
|
||||
{$POP}
|
||||
end;
|
||||
|
||||
|
||||
end.
|
||||
|
@ -81,7 +81,7 @@ end;
|
||||
|
||||
function GlueStartupMemory: Longword;
|
||||
begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
Result := LongWord(NS_ERROR_FAILURE);
|
||||
if Assigned(gMemory) then Exit;
|
||||
nsInit.NS_GetMemoryManager(gMemory);
|
||||
if not Assigned(gMemory) then Exit;
|
||||
@ -124,13 +124,13 @@ end;
|
||||
|
||||
function HeapMinimize(aImmediate: Boolean): Longword;
|
||||
begin
|
||||
Result := NS_ERROR_FAILURE;
|
||||
Result := LongWord(NS_ERROR_FAILURE);
|
||||
if ENSURE_ALLOCATOR then
|
||||
try
|
||||
Result := NS_OK;
|
||||
gMemory.HeapMinimize(aImmediate);
|
||||
except
|
||||
Result := NS_ERROR_FAILURE;
|
||||
Result := LongWord(NS_ERROR_FAILURE);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -39,16 +39,16 @@ unit nsStream;
|
||||
interface
|
||||
|
||||
uses
|
||||
nsXPCOM, Classes;
|
||||
nsXPCOM, Classes,nsTypes;
|
||||
|
||||
function NS_NewByteArrayInputStream(out stream: nsIInputStream; const Buffer: Pointer; Size: Longword): Longword;
|
||||
function NS_NewByteArrayInputStream(out stream: nsIInputStream; const Buffer: Pointer; Size: Longword): nsresult;
|
||||
function NS_NewInputStreamFromTStream(input: TStream; own: Boolean=False): nsIInputStream;
|
||||
function NS_NewOutputStreamFromTStream(output: TStream; own: Boolean=False): nsIOutputStream;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
Math, nsMemory, nsError, nsTypes, SysUtils;
|
||||
Math, nsMemory, nsError, SysUtils;
|
||||
|
||||
type
|
||||
nsByteArrayInputStream = class(TInterfacedObject,
|
||||
@ -163,7 +163,7 @@ begin
|
||||
raise Exception.Create('nsIInputStream.Close')
|
||||
end;
|
||||
|
||||
function NS_NewByteArrayInputStream(out stream: nsIInputStream; const Buffer: Pointer; Size: Longword): Longword;
|
||||
function NS_NewByteArrayInputStream(out stream: nsIInputStream; const Buffer: Pointer; Size: Longword): nsresult;
|
||||
begin
|
||||
try
|
||||
stream := nsByteArrayInputStream.Create(Buffer, Size);
|
||||
|
@ -38,9 +38,6 @@ unit nsTypes;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
nsConsts;
|
||||
|
||||
type
|
||||
PRBool = LongBool;
|
||||
PRUint8 = Byte;
|
||||
@ -53,10 +50,12 @@ type
|
||||
PRInt32 = Longint;
|
||||
PRInt64 = Int64;
|
||||
|
||||
nsresult = PRUint32;
|
||||
nsrefcnt = PRUint32;
|
||||
nsresult = PRint32;
|
||||
nsrefcnt = PRint32;
|
||||
|
||||
size_t = PRUint32;
|
||||
{$IFNDEF FPC}
|
||||
size_t = SizeUint;
|
||||
{$ENDIF}
|
||||
|
||||
PRSize = PRUint32;
|
||||
|
||||
|
@ -3,7 +3,7 @@ unit nsXPCOM;
|
||||
interface
|
||||
|
||||
uses
|
||||
nsConsts, nsGeckoStrings, nsTypes;
|
||||
nsGeckoStrings, nsTypes;
|
||||
|
||||
const
|
||||
NS_ISUPPORTS_IID: TGUID = '{00000000-0000-0000-c000-000000000046}';
|
||||
|
@ -39,7 +39,7 @@ unit nsXPCOMGlue;
|
||||
interface
|
||||
|
||||
uses
|
||||
nsXPCOM, nsGeckoStrings, nsConsts, nsTypes, SysUtils;
|
||||
nsXPCOM, nsTypes, SysUtils;
|
||||
|
||||
const
|
||||
(*
|
||||
@ -281,8 +281,8 @@ type
|
||||
TWeakReference = class(TInterfacedObject, nsIWeakReference)
|
||||
private
|
||||
FSupports: TSupportsWeakReference;
|
||||
constructor Create(supports: TSupportsWeakReference);
|
||||
public
|
||||
constructor Create(supports: TSupportsWeakReference);
|
||||
destructor Destroy; override;
|
||||
procedure QueryReferent(const uuid: TGUID; out Intf); safecall;
|
||||
end;
|
||||
@ -295,7 +295,9 @@ type
|
||||
function GetWeakReference: nsIWeakReference; safecall;
|
||||
end;
|
||||
|
||||
EGeckoError = class(Exception);
|
||||
EGeckoException = class (Exception);
|
||||
EGeckoError = class(EGeckoException); //Gecko error. It is an error.
|
||||
EGeckoHint = class(EGeckoException); //Gecko Hint. It does not necessary means an error. They could be hidden.
|
||||
|
||||
function NS_NewSupportsWeakReferenceDelegate(aTarget: nsISupports): nsISupportsWeakReference;
|
||||
|
||||
@ -311,7 +313,7 @@ resourcestring
|
||||
implementation
|
||||
|
||||
uses
|
||||
nsMemory, nsError, nsInit, {$IFDEF MSWINDOWS} Windows, {$ENDIF} StrUtils;
|
||||
nsMemory, nsError, nsInit {$IFDEF MSWINDOWS} ,Windows {$ELSE} ,{$ENDIF};
|
||||
|
||||
var
|
||||
sCompMgr: nsIComponentManager = nil;
|
||||
|
@ -80,7 +80,7 @@ function XRE_InitEmbedding(aLibXulDirectory: nsILocalFile;
|
||||
aAppDirectory: nsILocalFile;
|
||||
aAppDirProvider: nsIDirectoryServiceProvider;
|
||||
const aStaticComponents: PStaticModuleInfoArray;
|
||||
aStaticComponentCount: PRUint32): nsresult; cdecl;
|
||||
aStaticComponentCount: PRUint32): nsresult;
|
||||
procedure XRE_NotifyProfile(); cdecl;
|
||||
procedure XRE_TermEmbedding(); cdecl;
|
||||
function XRE_CreateAppData(aINIFile: nsILocalFile;
|
||||
@ -92,7 +92,7 @@ procedure XRE_FreeAppData(aAppData: PXREAppData); cdecl;
|
||||
implementation
|
||||
|
||||
uses
|
||||
nsConsts, nsError, nsGeckoStrings,
|
||||
nsError, nsGeckoStrings,
|
||||
{$IFDEF MSWINDOWS} Windows, {$ELSE} DynLibs, {$ENDIF} SysUtils;
|
||||
|
||||
var
|
||||
@ -129,8 +129,6 @@ var
|
||||
freeAppDataFunc :
|
||||
procedure (aAppData: PXREAppData); cdecl;
|
||||
|
||||
sInitialized : Boolean = False;
|
||||
|
||||
function strrpbrk(src: PAnsiChar; const charSet: PAnsiChar): PAnsiChar;
|
||||
var
|
||||
ptr: PAnsiChar;
|
||||
@ -172,6 +170,7 @@ begin
|
||||
vers.upper := upperVer;
|
||||
vers.upperInclusive := upperInclusive;
|
||||
|
||||
(*
|
||||
Result := GRE_GetGREPathWithProperties(@vers, 1, nil, 0, xpcomPath, MAX_PATH);
|
||||
//FPC port: previous call doesn't find Firefox's GRE, so just force it.
|
||||
if NS_FAILED(result) then
|
||||
@ -184,6 +183,31 @@ begin
|
||||
//FPC port
|
||||
if NS_FAILED(result) then
|
||||
Exit;
|
||||
*)
|
||||
//Changed checking order. Preference is xulrunner in application folder
|
||||
if ParamStr(1)<>'' then begin
|
||||
NS_StrLCopy(xpcomPath, PChar(ParamStr(1) + '\xpcom.dll'), MAX_PATH);
|
||||
Result:=NS_OK;
|
||||
end else begin
|
||||
NS_StrLCopy(xpcomPath, PChar(ExtractFilePath(ParamStr(0)) + 'xpcom.dll'), MAX_PATH);
|
||||
if FileExists(xpcomPath) then begin
|
||||
Result := NS_OK;
|
||||
end else begin
|
||||
NS_StrLCopy(xpcomPath, PChar(ExtractFilePath(ParamStr(0)) + 'xulrunner\xpcom.dll'), MAX_PATH);
|
||||
if FileExists(xpcomPath) then begin
|
||||
Result := NS_OK;
|
||||
end else begin
|
||||
Result := GRE_GetGREPathWithProperties(@vers, 1, nil, 0, xpcomPath, MAX_PATH);
|
||||
if not FileExists(xpcomPath) then begin
|
||||
Result:=NS_ERROR_FILE_ACCESS_DENIED
|
||||
end else begin
|
||||
result:=NS_OK;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if NS_FAILED(result) then
|
||||
Exit;
|
||||
|
||||
lastSlash := strrpbrk(xpcomPath, '/\');
|
||||
if not Assigned(lastSlash) then
|
||||
@ -286,7 +310,7 @@ begin
|
||||
Result := NS_ERROR_NOT_INITIALIZED;
|
||||
Exit;
|
||||
end;
|
||||
FreeLibrary(sXulModule);
|
||||
XPCOMGlueShutdown;
|
||||
sXulModule := 0;
|
||||
Result := NS_OK;
|
||||
end;
|
||||
@ -369,8 +393,9 @@ begin
|
||||
XRE_UnloadGRE();
|
||||
Exit;
|
||||
end;
|
||||
|
||||
// NS_LogInit();
|
||||
Result := XRE_InitEmbedding(xulDir, appDir, nil, nil, 0);
|
||||
// NS_LogTerm();
|
||||
end;
|
||||
|
||||
function XRE_Shutdown(): nsresult;
|
||||
|
Reference in New Issue
Block a user