diff --git a/mozilla/docshell/base/nsWebShell.cpp b/mozilla/docshell/base/nsWebShell.cpp index f441b4983b5..429ec4c68fc 100644 --- a/mozilla/docshell/base/nsWebShell.cpp +++ b/mozilla/docshell/base/nsWebShell.cpp @@ -96,6 +96,7 @@ static PRLogModuleInfo* gLogModule = PR_NewLogModule("webshell"); #define WEB_TRACE_CALLS 0x1 #define WEB_TRACE_HISTORY 0x2 + #define WEB_LOG_TEST(_lm,_bit) (PRIntn((_lm)->level) & (_bit)) #ifdef NS_DEBUG @@ -128,6 +129,7 @@ static NS_DEFINE_CID(kGlobalHistoryCID, NS_GLOBALHISTORY_CID); static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); #endif // NECKO +static nsAutoString LinkCommand("linkclick"); //---------------------------------------------------------------------- class nsWebShell : public nsIWebShell, @@ -433,6 +435,8 @@ public: NS_IMETHOD GetIsInSHist(PRBool& aIsFrame); NS_IMETHOD GetURL(const PRUnichar** aURL); NS_IMETHOD SetURL(const PRUnichar* aURL); + NS_IMETHOD SetUrlDispatcher(nsIUrlDispatcher * anObserver); + NS_IMETHOD GetUrlDispatcher(nsIUrlDispatcher *& aResult); protected: @@ -451,6 +455,7 @@ protected: nsIWidget* mWindow; nsIDocumentLoader* mDocLoader; nsIDocumentLoaderObserver* mDocLoaderObserver; + nsIUrlDispatcher * mUrlDispatcher; #ifdef NECKO nsIPrompt* mPrompter; #else @@ -1323,6 +1328,25 @@ nsWebShell::GetDocLoaderObserver(nsIDocumentLoaderObserver*& aResult) } +NS_IMETHODIMP +nsWebShell::SetUrlDispatcher(nsIUrlDispatcher* aDispatcher) +{ + NS_IF_RELEASE(mUrlDispatcher); + + mUrlDispatcher = aDispatcher; + NS_IF_ADDREF(mUrlDispatcher); + return NS_OK; +} + + +NS_IMETHODIMP +nsWebShell::GetUrlDispatcher(nsIUrlDispatcher*& aResult) +{ + aResult = mUrlDispatcher; + NS_IF_ADDREF(mUrlDispatcher); + return NS_OK; +} + NS_IMETHODIMP nsWebShell::SetPrefs(nsIPref* aPrefs) { @@ -1955,6 +1979,48 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec, } + //Take care of mailto: url + nsIWebShell * root= nsnull; + PRInt32 index = urlSpec.Find("mailto:"); + PRBool isMail= PR_FALSE, isBrowser = PR_FALSE; + if (index == 0) { + isMail = PR_TRUE; + } + + + nsresult res = GetRootWebShell(root); + if (NS_SUCCEEDED(res) && root) { + nsIDocumentLoaderObserver * dlObserver = nsnull; + + res = root->GetDocLoaderObserver(dlObserver); + if (NS_SUCCEEDED(res) && dlObserver) { + isBrowser = PR_TRUE; + } + NS_IF_RELEASE(dlObserver); + } + + + /* Ask the URL dispatcher to take car of this URL only if it is a + * mailto: link clicked inside a browser or any link clicked + * inside a *non-browser* window. Note this mechanism s'd go away once + * we have the protocol registry and window manager available + */ + if (isMail || !isBrowser) { + //Ask the container to load the appropriate component for the URL. + + if (root) { + nsCOMPtr urlDispatcher = nsnull; + res = GetUrlDispatcher(*getter_AddRefs(urlDispatcher)); + if (NS_SUCCEEDED(res) && urlDispatcher) { + printf("calling HandleUrl\n"); + urlDispatcher->HandleUrl(LinkCommand.GetUnicode(), urlSpec.GetUnicode(), aPostData); + return NS_OK; + } + } + } + NS_IF_RELEASE(root); + + mURL = urlSpec.GetUnicode(); /* If this is one of the frames, get it from the top level shell */ diff --git a/mozilla/webshell/src/nsWebShell.cpp b/mozilla/webshell/src/nsWebShell.cpp index f441b4983b5..429ec4c68fc 100644 --- a/mozilla/webshell/src/nsWebShell.cpp +++ b/mozilla/webshell/src/nsWebShell.cpp @@ -96,6 +96,7 @@ static PRLogModuleInfo* gLogModule = PR_NewLogModule("webshell"); #define WEB_TRACE_CALLS 0x1 #define WEB_TRACE_HISTORY 0x2 + #define WEB_LOG_TEST(_lm,_bit) (PRIntn((_lm)->level) & (_bit)) #ifdef NS_DEBUG @@ -128,6 +129,7 @@ static NS_DEFINE_CID(kGlobalHistoryCID, NS_GLOBALHISTORY_CID); static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); #endif // NECKO +static nsAutoString LinkCommand("linkclick"); //---------------------------------------------------------------------- class nsWebShell : public nsIWebShell, @@ -433,6 +435,8 @@ public: NS_IMETHOD GetIsInSHist(PRBool& aIsFrame); NS_IMETHOD GetURL(const PRUnichar** aURL); NS_IMETHOD SetURL(const PRUnichar* aURL); + NS_IMETHOD SetUrlDispatcher(nsIUrlDispatcher * anObserver); + NS_IMETHOD GetUrlDispatcher(nsIUrlDispatcher *& aResult); protected: @@ -451,6 +455,7 @@ protected: nsIWidget* mWindow; nsIDocumentLoader* mDocLoader; nsIDocumentLoaderObserver* mDocLoaderObserver; + nsIUrlDispatcher * mUrlDispatcher; #ifdef NECKO nsIPrompt* mPrompter; #else @@ -1323,6 +1328,25 @@ nsWebShell::GetDocLoaderObserver(nsIDocumentLoaderObserver*& aResult) } +NS_IMETHODIMP +nsWebShell::SetUrlDispatcher(nsIUrlDispatcher* aDispatcher) +{ + NS_IF_RELEASE(mUrlDispatcher); + + mUrlDispatcher = aDispatcher; + NS_IF_ADDREF(mUrlDispatcher); + return NS_OK; +} + + +NS_IMETHODIMP +nsWebShell::GetUrlDispatcher(nsIUrlDispatcher*& aResult) +{ + aResult = mUrlDispatcher; + NS_IF_ADDREF(mUrlDispatcher); + return NS_OK; +} + NS_IMETHODIMP nsWebShell::SetPrefs(nsIPref* aPrefs) { @@ -1955,6 +1979,48 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec, } + //Take care of mailto: url + nsIWebShell * root= nsnull; + PRInt32 index = urlSpec.Find("mailto:"); + PRBool isMail= PR_FALSE, isBrowser = PR_FALSE; + if (index == 0) { + isMail = PR_TRUE; + } + + + nsresult res = GetRootWebShell(root); + if (NS_SUCCEEDED(res) && root) { + nsIDocumentLoaderObserver * dlObserver = nsnull; + + res = root->GetDocLoaderObserver(dlObserver); + if (NS_SUCCEEDED(res) && dlObserver) { + isBrowser = PR_TRUE; + } + NS_IF_RELEASE(dlObserver); + } + + + /* Ask the URL dispatcher to take car of this URL only if it is a + * mailto: link clicked inside a browser or any link clicked + * inside a *non-browser* window. Note this mechanism s'd go away once + * we have the protocol registry and window manager available + */ + if (isMail || !isBrowser) { + //Ask the container to load the appropriate component for the URL. + + if (root) { + nsCOMPtr urlDispatcher = nsnull; + res = GetUrlDispatcher(*getter_AddRefs(urlDispatcher)); + if (NS_SUCCEEDED(res) && urlDispatcher) { + printf("calling HandleUrl\n"); + urlDispatcher->HandleUrl(LinkCommand.GetUnicode(), urlSpec.GetUnicode(), aPostData); + return NS_OK; + } + } + } + NS_IF_RELEASE(root); + + mURL = urlSpec.GetUnicode(); /* If this is one of the frames, get it from the top level shell */