зеркало из https://github.com/mozilla/pjs.git
Making Gecko a UserControl class so that it can be placed easily in form controls in .NET apps. Not part of the build.
This commit is contained in:
Родитель
3f9a09add1
Коммит
7bf484d796
|
@ -105,117 +105,6 @@ Mozilla::Embedding::ThrowIfFailed(nsresult rv)
|
|||
#pragma unmanaged
|
||||
|
||||
#define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"
|
||||
|
||||
bool ResizeEmbedding(HWND hWnd, nsIWebBrowserChrome* chrome);
|
||||
nsresult CreateBrowserWindow(HWND hWnd, PRUint32 aChromeFlags,
|
||||
nsIWebBrowserChrome *aParent,
|
||||
nsIWebBrowserChrome **aNewWindow);
|
||||
nsCOMPtr<nsIWebBrowserChrome> chrome;
|
||||
|
||||
void
|
||||
InitializeEmbedding()
|
||||
{
|
||||
nsresult rv = NS_InitEmbedding(nsnull, nsnull);
|
||||
ThrowIfFailed(rv);
|
||||
}
|
||||
|
||||
void
|
||||
TerminateEmbedding()
|
||||
{
|
||||
nsresult rv = NS_TermEmbedding();
|
||||
ThrowIfFailed(rv);
|
||||
}
|
||||
|
||||
nsresult
|
||||
CreateBrowserWindow(HWND hWnd, PRUint32 aChromeFlags,
|
||||
nsIWebBrowserChrome *aParent,
|
||||
nsIWebBrowserChrome **aNewWindow)
|
||||
{
|
||||
WebBrowserChrome * chrome = new WebBrowserChrome();
|
||||
if (!chrome)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// the interface to return and one addref, which we assume will be
|
||||
// immediately released
|
||||
CallQueryInterface(NS_STATIC_CAST(nsIWebBrowserChrome*, chrome), aNewWindow);
|
||||
// now an extra addref; the window owns itself (to be released by
|
||||
// WebBrowserChromeUI::Destroy)
|
||||
NS_ADDREF(*aNewWindow);
|
||||
|
||||
chrome->SetChromeFlags(aChromeFlags);
|
||||
|
||||
// Insert the browser
|
||||
nsCOMPtr<nsIWebBrowser> newBrowser;
|
||||
chrome->CreateBrowser(hWnd, -1, -1, -1, -1, getter_AddRefs(newBrowser));
|
||||
if (!newBrowser)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
// Place it where we want it.
|
||||
ResizeEmbedding(hWnd, NS_STATIC_CAST(nsIWebBrowserChrome*, chrome));
|
||||
|
||||
// if opened as chrome, it'll be made visible after the chrome has loaded.
|
||||
// otherwise, go ahead and show it now.
|
||||
if (!(aChromeFlags & nsIWebBrowserChrome::CHROME_OPENAS_CHROME))
|
||||
::ShowWindow(hWnd, SW_RESTORE);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
OpenWebPage(HWND hWnd, const wchar_t *url)
|
||||
{
|
||||
if (!chrome)
|
||||
{
|
||||
nsresult rv = CreateBrowserWindow(hWnd, nsIWebBrowserChrome::CHROME_ALL,
|
||||
nsnull, getter_AddRefs(chrome));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
SetWindowLong(hWnd, GWL_USERDATA,
|
||||
(LONG)NS_STATIC_CAST(nsIWebBrowserChrome*, chrome));
|
||||
|
||||
// Start loading a page
|
||||
nsCOMPtr<nsIWebBrowser> newBrowser;
|
||||
chrome->GetWebBrowser(getter_AddRefs(newBrowser));
|
||||
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(newBrowser));
|
||||
|
||||
return webNav->LoadURI(url, nsIWebNavigation::LOAD_FLAGS_NONE, nsnull,
|
||||
nsnull, nsnull);
|
||||
}
|
||||
|
||||
bool
|
||||
ResizeEmbedding(HWND hWnd, nsIWebBrowserChrome* chrome)
|
||||
{
|
||||
if (!chrome)
|
||||
{
|
||||
chrome = (nsIWebBrowserChrome *)GetWindowLong(hWnd, GWL_USERDATA);
|
||||
if (!chrome)
|
||||
return false;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIEmbeddingSiteWindow> embeddingSite = do_QueryInterface(chrome);
|
||||
|
||||
|
||||
RECT rect;
|
||||
GetClientRect(hWnd, &rect);
|
||||
|
||||
// Make sure the browser is visible and sized
|
||||
nsCOMPtr<nsIWebBrowser> webBrowser;
|
||||
chrome->GetWebBrowser(getter_AddRefs(webBrowser));
|
||||
nsCOMPtr<nsIBaseWindow> webBrowserAsWin = do_QueryInterface(webBrowser);
|
||||
if (webBrowserAsWin)
|
||||
{
|
||||
webBrowserAsWin->SetPositionAndSize(rect.left,
|
||||
rect.top,
|
||||
rect.right - rect.left,
|
||||
rect.bottom - rect.top,
|
||||
PR_TRUE);
|
||||
webBrowserAsWin->SetVisibility(PR_TRUE);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
// WebBrowserChrome::nsISupports
|
||||
//*****************************************************************************
|
||||
|
@ -419,14 +308,10 @@ WebBrowserChrome::CreateBrowser(HWND hWnd, PRInt32 aX, PRInt32 aY, PRInt32 aCX,
|
|||
|
||||
#pragma managed
|
||||
|
||||
Gecko::Gecko(Form *aForm)
|
||||
: mForm(aForm)
|
||||
{
|
||||
if (!sIsInitialized) {
|
||||
InitializeEmbedding();
|
||||
|
||||
sIsInitialized = true;
|
||||
}
|
||||
Gecko::Gecko()
|
||||
: mChrome(nsnull)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -438,21 +323,100 @@ Gecko::TermEmbedding()
|
|||
|
||||
sIsInitialized = false;
|
||||
|
||||
TerminateEmbedding();
|
||||
}
|
||||
|
||||
void
|
||||
Gecko::OpenURL(String *url)
|
||||
{
|
||||
const wchar_t __pin * pURL = PtrToStringChars(url);
|
||||
|
||||
nsresult rv = OpenWebPage((HWND)mForm->Handle.ToInt32(), pURL);
|
||||
nsresult rv = NS_TermEmbedding();
|
||||
ThrowIfFailed(rv);
|
||||
}
|
||||
|
||||
void
|
||||
Gecko::Resize()
|
||||
Gecko::OpenURL(String *aUrl)
|
||||
{
|
||||
ResizeEmbedding((HWND)mForm->Handle.ToInt32(), NULL);
|
||||
if (!sIsInitialized) {
|
||||
nsresult rv = NS_InitEmbedding(nsnull, nsnull);
|
||||
ThrowIfFailed(rv);
|
||||
|
||||
sIsInitialized = true;
|
||||
}
|
||||
|
||||
const wchar_t __pin * url = PtrToStringChars(aUrl);
|
||||
nsresult rv;
|
||||
|
||||
HWND hWnd = (HWND)Handle.ToPointer();
|
||||
|
||||
if (!mChrome) {
|
||||
CreateBrowserWindow(nsIWebBrowserChrome::CHROME_ALL, nsnull);
|
||||
}
|
||||
|
||||
// Start loading a page
|
||||
nsCOMPtr<nsIWebBrowser> newBrowser;
|
||||
mChrome->GetWebBrowser(getter_AddRefs(newBrowser));
|
||||
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(newBrowser));
|
||||
|
||||
rv = webNav->LoadURI(url, nsIWebNavigation::LOAD_FLAGS_NONE, nsnull, nsnull,
|
||||
nsnull);
|
||||
|
||||
ThrowIfFailed(rv);
|
||||
}
|
||||
|
||||
void
|
||||
Gecko::OnResize(EventArgs *e)
|
||||
{
|
||||
if (mChrome) {
|
||||
nsCOMPtr<nsIEmbeddingSiteWindow> embeddingSite =
|
||||
do_QueryInterface(mChrome);
|
||||
|
||||
RECT rect;
|
||||
GetClientRect((HWND)Handle.ToPointer(), &rect);
|
||||
|
||||
// Make sure the browser is visible and sized
|
||||
nsCOMPtr<nsIWebBrowser> webBrowser;
|
||||
mChrome->GetWebBrowser(getter_AddRefs(webBrowser));
|
||||
nsCOMPtr<nsIBaseWindow> webBrowserAsWin = do_QueryInterface(webBrowser);
|
||||
if (webBrowserAsWin) {
|
||||
webBrowserAsWin->SetPositionAndSize(rect.left,
|
||||
rect.top,
|
||||
rect.right - rect.left,
|
||||
rect.bottom - rect.top,
|
||||
PR_TRUE);
|
||||
webBrowserAsWin->SetVisibility(PR_TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
UserControl::OnResize(e);
|
||||
}
|
||||
|
||||
void
|
||||
Gecko::CreateBrowserWindow(PRUint32 aChromeFlags, nsIWebBrowserChrome *aParent)
|
||||
{
|
||||
WebBrowserChrome * chrome = new WebBrowserChrome();
|
||||
if (!chrome) {
|
||||
throw new OutOfMemoryException();
|
||||
}
|
||||
|
||||
mChrome = chrome;
|
||||
NS_ADDREF(mChrome);
|
||||
|
||||
// XXX: Is this really needed?
|
||||
// now an extra addref; the window owns itself (to be released by
|
||||
// WebBrowserChromeUI::Destroy)
|
||||
NS_ADDREF(mChrome);
|
||||
|
||||
chrome->SetChromeFlags(aChromeFlags);
|
||||
|
||||
HWND hWnd = (HWND)Handle.ToPointer();
|
||||
|
||||
// Insert the browser
|
||||
nsCOMPtr<nsIWebBrowser> newBrowser;
|
||||
chrome->CreateBrowser(hWnd, -1, -1, -1, -1, getter_AddRefs(newBrowser));
|
||||
if (!newBrowser) {
|
||||
ThrowIfFailed(NS_ERROR_FAILURE);
|
||||
}
|
||||
|
||||
// Place it where we want it.
|
||||
OnResize(0);
|
||||
|
||||
// if opened as chrome, it'll be made visible after the chrome has loaded.
|
||||
// otherwise, go ahead and show it now.
|
||||
if (!(aChromeFlags & nsIWebBrowserChrome::CHROME_OPENAS_CHROME))
|
||||
::ShowWindow(hWnd, SW_RESTORE);
|
||||
}
|
||||
|
||||
|
|
|
@ -46,22 +46,33 @@
|
|||
using namespace System;
|
||||
using namespace System::Windows::Forms;
|
||||
|
||||
class nsIWebBrowserChrome;
|
||||
|
||||
namespace Mozilla
|
||||
{
|
||||
namespace Embedding
|
||||
{
|
||||
public __gc class Gecko
|
||||
// .NET UI control class that can be placed in a Windows Form
|
||||
// using DevStudio.NET's GUI.
|
||||
|
||||
public __gc class Gecko : public System::Windows::Forms::UserControl
|
||||
{
|
||||
public:
|
||||
Gecko(Form *Form);
|
||||
Gecko();
|
||||
|
||||
static void TermEmbedding();
|
||||
|
||||
void OpenURL(String *url);
|
||||
void Resize();
|
||||
|
||||
protected:
|
||||
// Overriden System::Windows::Forms::Control methods
|
||||
void OnResize(EventArgs *e);
|
||||
|
||||
private:
|
||||
Form *mForm;
|
||||
void CreateBrowserWindow(PRUint32 aChromeFlags,
|
||||
nsIWebBrowserChrome *aParent);
|
||||
|
||||
nsIWebBrowserChrome *mChrome;
|
||||
|
||||
static bool sIsInitialized = false;
|
||||
}; // class Gecko
|
||||
|
|
|
@ -48,7 +48,7 @@ INCLUDES = \
|
|||
-I${MOZ_OBJ_DIR}/dist/include/windowwatcher \
|
||||
-I${MOZ_OBJ_DIR}/dist/include/xpconnect
|
||||
|
||||
DEPS = DotNETEmbed.h Makefile
|
||||
DEPS = DotNETEmbed.h Makefile
|
||||
|
||||
CPP_FILES = \
|
||||
DotNETEmbed.cpp \
|
||||
|
@ -66,13 +66,10 @@ DotNETEmbed.dll: ${OBJ_FILES} DotNETEmbed.snk ${DEPS}
|
|||
@echo
|
||||
cp DotNETEmbed.dll ${MOZ_OBJ_DIR}/dist/bin
|
||||
cp DotNETEmbed.pdb ${MOZ_OBJ_DIR}/dist/bin
|
||||
# regasm -silent DotNETEmbed.dll
|
||||
# @echo
|
||||
# gacutil.exe -silent -i DotNETEmbed.dll
|
||||
# @echo
|
||||
# @touch vc7/Debug/*
|
||||
# cp DotNETEmbed.dll vc7/Debug
|
||||
# @echo
|
||||
regasm DotNETEmbed.dll
|
||||
@echo
|
||||
gacutil.exe -i DotNETEmbed.dll
|
||||
@echo
|
||||
|
||||
DotNETEmbed.obj: DotNETEmbed.cpp umWebChrome.h ${DEPS}
|
||||
${CXX} ${CXXFLAGS} ${OUTPUT_OPTION} DotNETEmbed.cpp
|
||||
|
|
Загрузка…
Ссылка в новой задаче