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:
Joshy
2010-05-28 21:53:08 +00:00
parent 739b3a43cb
commit 55a0067ad1
17 changed files with 508 additions and 280 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;
@ -186,7 +197,7 @@ type
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure InitWebBrowser; //FPC port: moved from private to public
procedure InitWebBrowser; //FPC port: moved from private to public
procedure LoadURI(const uri: WideString); overload;
procedure LoadURI(const uri: WideString; const referer: UTF8String);
overload;
@ -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
FBrowser.SetFocus;
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,28 +1500,32 @@ 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:'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:'')
(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:'keyup'; eventType:etEvent; propertyName:'OnDOMKeyUp' ),
(name:'keydown'; eventType:etEvent; propertyName:'OnDOMKeyDown'),
(name:'keypress'; eventType:etEvent; propertyName:'OnDOMKeyPress'),
(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:''; eventType:etNone; propertyName:'')
);
begin
inherited Create(browser);
@ -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;

View File

@ -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

View File

@ -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
]);

View File

@ -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

View File

@ -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)"/>

View File

@ -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}';

View File

@ -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;

View File

@ -36,11 +36,7 @@ unit nsGeckoStrings;
interface
uses
nsConsts, nsTypes;
type
nsAString = ^nsStringContainer;
nsString = nsAString;
nsStringContainer = record

View File

@ -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;
try
ret.fs:=TFileStream.Create(name,fmOpenRead, fmShareDenyWrite);
result:=true;
ret.bufPos := 0;
ret.bufMax := -1;
except
ret.fs:=nil;
end;
ret.bufPos := 0;
ret.bufMax := -1;
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
move(ParamStr(0)[1],buf^,min(bufLen,Length(ParamStr(0))));
lastSlash := NS_StrRScan(buf, '\');
if Assigned(lastSlash) then
begin
lastSlash := NS_StrRScan(buf, '\');
if Assigned(lastSlash) then
begin
lastSlash^ := #0;
Result := True;
end;
lastSlash^ := #0;
Result := True;
end;
end;
{$ENDIF}
procedure ZeroArray(out AArray; const ASize: SizeInt);
begin
{$PUSH}{$HINTS OFF}
FillByte(AArray,ASize,0);
{$POP}
end;
end.

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -3,7 +3,7 @@ unit nsXPCOM;
interface
uses
nsConsts, nsGeckoStrings, nsTypes;
nsGeckoStrings, nsTypes;
const
NS_ISUPPORTS_IID: TGUID = '{00000000-0000-0000-c000-000000000046}';

View File

@ -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;

View File

@ -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;