From bbc91e44557aca78f8bfb733a56be62fd411bce1 Mon Sep 17 00:00:00 2001 From: "jst%netscape.com" Date: Sat, 24 May 2003 06:52:20 +0000 Subject: [PATCH] Making Gecko a UserControl class so that it can be placed easily in form controls in .NET apps. Not part of the build. git-svn-id: svn://10.0.0.236/trunk@142889 18797224-902f-48f8-a5cc-f745e15eee43 --- .../wrappers/DotNETEmbed/DotNETEmbed.cpp | 222 ++++++++---------- .../wrappers/DotNETEmbed/DotNETEmbed.h | 19 +- .../embedding/wrappers/DotNETEmbed/Makefile | 13 +- 3 files changed, 113 insertions(+), 141 deletions(-) diff --git a/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.cpp b/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.cpp index 6972949157f..4f8d8df5826 100644 --- a/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.cpp +++ b/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.cpp @@ -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 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 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 newBrowser; - chrome->GetWebBrowser(getter_AddRefs(newBrowser)); - nsCOMPtr 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 embeddingSite = do_QueryInterface(chrome); - - - RECT rect; - GetClientRect(hWnd, &rect); - - // Make sure the browser is visible and sized - nsCOMPtr webBrowser; - chrome->GetWebBrowser(getter_AddRefs(webBrowser)); - nsCOMPtr 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 newBrowser; + mChrome->GetWebBrowser(getter_AddRefs(newBrowser)); + nsCOMPtr 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 embeddingSite = + do_QueryInterface(mChrome); + + RECT rect; + GetClientRect((HWND)Handle.ToPointer(), &rect); + + // Make sure the browser is visible and sized + nsCOMPtr webBrowser; + mChrome->GetWebBrowser(getter_AddRefs(webBrowser)); + nsCOMPtr 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 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); } diff --git a/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.h b/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.h index d8a85ec3343..a204b4ccbde 100644 --- a/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.h +++ b/mozilla/embedding/wrappers/DotNETEmbed/DotNETEmbed.h @@ -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 diff --git a/mozilla/embedding/wrappers/DotNETEmbed/Makefile b/mozilla/embedding/wrappers/DotNETEmbed/Makefile index cab360a8f7a..5699e5d8e80 100644 --- a/mozilla/embedding/wrappers/DotNETEmbed/Makefile +++ b/mozilla/embedding/wrappers/DotNETEmbed/Makefile @@ -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