diff --git a/mozilla/uriloader/base/nsIURIContentListener.idl b/mozilla/uriloader/base/nsIURIContentListener.idl index 02dfbfb1eba..a2f16404a74 100644 --- a/mozilla/uriloader/base/nsIURIContentListener.idl +++ b/mozilla/uriloader/base/nsIURIContentListener.idl @@ -28,6 +28,7 @@ */ #include "nsISupports.idl" +#include "nsIURILoader.idl" interface nsIProtocolHandler; interface nsIChannel; @@ -64,7 +65,8 @@ interface nsIURIContentListener : nsISupports this parameter. */ - void doContent(in string aContentType, in string aCommand, + void doContent(in string aContentType, + in nsURILoadCommand aCommand, in string aWindowTarget, in nsIChannel aOpenedChannel, out nsIStreamListener aContentHandler, @@ -74,6 +76,8 @@ interface nsIURIContentListener : nsISupports aDesiredContentType --> yes, we can accept aContentType but we would like it converted to aDesiredContentType. This argument can be null if you want the content directly as aContentType */ - boolean canHandleContent(in string aContentType, in string aCommand, - in string aWindowTarget, out string aDesiredContentType); + boolean canHandleContent(in string aContentType, + in nsURILoadCommand aCommand, + in string aWindowTarget, + out string aDesiredContentType); }; diff --git a/mozilla/uriloader/base/nsIURILoader.idl b/mozilla/uriloader/base/nsIURILoader.idl index 9647129f265..95872961475 100644 --- a/mozilla/uriloader/base/nsIURILoader.idl +++ b/mozilla/uriloader/base/nsIURILoader.idl @@ -49,6 +49,8 @@ interface nsIChannel; interface nsIStreamListener; interface nsIInputStream; +typedef long nsURILoadCommand; + [scriptable, uuid(40AECB53-8B65-11d3-989D-001083010E9B)] interface nsIURILoader : nsISupports { @@ -64,6 +66,9 @@ interface nsIURILoader : nsISupports /* OpenURI requires the following parameters..... aURI --> the uri you wish to open + aCommand --> describes the context of the url. most often, you want to pass viewNormal here. + but if it the action was from a user click or you want to view source, or you want + a new window, these are all passed in via aCommand. aWindowTarget -> the name of the desired target window (can be null) aWindowContext --> if you are running the url from a doc shell or a web shell, this is your window context. If you have a content listener @@ -81,6 +86,7 @@ interface nsIURILoader : nsISupports */ void openURI(in nsIURI aURI, + in nsURILoadCommand aCommand, in string aWindowTarget, in nsISupports aWindowContext, in nsIURI aReferringURI, @@ -92,6 +98,7 @@ interface nsIURILoader : nsISupports adapterBinding -> the local IP address to bind to*/ void openURIVia(in nsIURI aURI, + in nsURILoadCommand aCommand, in string aWindowTarget, in nsISupports aWindowContext, in nsIURI aReferringURI, @@ -99,10 +106,17 @@ interface nsIURILoader : nsISupports out nsISupports aCurrentOpenContext, in unsigned long adapterBinding); + + /* these are nsURILoadCommand */ + const long viewNormal = 0; + const long viewSource = 1; + const long viewUserClick = 2; + const long viewNewWindow = 3; + /* mscott -> I'm going to move this out into a separate private interface */ void dispatchContent(in string aContentType, - in string aCommand, + in nsURILoadCommand aCommand, in string aWindowTarget, in nsIChannel aChannel, in nsISupports aCtxt, @@ -120,6 +134,7 @@ interface nsIURILoader : nsISupports interface nsPIURILoaderWithPostData : nsISupports { void openURIWithPostData(in nsIURI aURI, + in nsURILoadCommand aCommand, in string aWindowTarget, in nsISupports aWindowContext, in nsIURI aReferringURI, @@ -132,6 +147,7 @@ interface nsPIURILoaderWithPostData : nsISupports adapterBinding -> the local IP address to bind to*/ void openURIWithPostDataVia(in nsIURI aURI, + in nsURILoadCommand aCommand, in string aWindowTarget, in nsISupports aWindowContext, in nsIURI aReferringURI, diff --git a/mozilla/uriloader/base/nsURILoader.cpp b/mozilla/uriloader/base/nsURILoader.cpp index 7f0a6c98fc9..0ecbb734cb5 100644 --- a/mozilla/uriloader/base/nsURILoader.cpp +++ b/mozilla/uriloader/base/nsURILoader.cpp @@ -60,6 +60,7 @@ public: NS_DECL_ISUPPORTS nsresult Open(nsIURI *aURL, + nsURILoadCommand aCommand, const char * aWindowTarget, nsISupports * aWindowContext, nsIURI * aReferringURI, @@ -83,6 +84,7 @@ protected: protected: nsCOMPtr m_contentListener; nsCOMPtr m_targetStreamListener; + nsURILoadCommand mCommand; nsCString m_windowTarget; }; @@ -90,6 +92,7 @@ NS_IMPL_ADDREF(nsDocumentOpenInfo); NS_IMPL_RELEASE(nsDocumentOpenInfo); NS_INTERFACE_MAP_BEGIN(nsDocumentOpenInfo) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStreamObserver) NS_INTERFACE_MAP_ENTRY(nsIStreamObserver) NS_INTERFACE_MAP_ENTRY(nsIStreamListener) NS_INTERFACE_MAP_END @@ -112,6 +115,7 @@ nsresult nsDocumentOpenInfo::Init(nsISupports * aWindowContext) } nsresult nsDocumentOpenInfo::Open(nsIURI *aURI, + nsURILoadCommand aCommand, const char * aWindowTarget, nsISupports * aWindowContext, nsIURI * aReferringURI, @@ -128,6 +132,7 @@ nsresult nsDocumentOpenInfo::Open(nsIURI *aURI, // store any local state m_windowTarget = aWindowTarget; + mCommand = aCommand; // get the requestor for the window context... nsCOMPtr requestor = do_QueryInterface(aWindowContext); @@ -228,7 +233,7 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIChannel * aChannel, nsISupports { nsCOMPtr aContentListener; nsXPIDLCString aDesiredContentType; - rv = pURILoader->DispatchContent(aContentType, "view", m_windowTarget, + rv = pURILoader->DispatchContent(aContentType, mCommand, m_windowTarget, aChannel, aCtxt, m_contentListener, getter_Copies(aDesiredContentType), @@ -243,7 +248,7 @@ nsresult nsDocumentOpenInfo::DispatchContent(nsIChannel * aChannel, nsISupports else contentTypeToUse = aContentType; - rv = aContentListener->DoContent(contentTypeToUse, "view", m_windowTarget, + rv = aContentListener->DoContent(contentTypeToUse, mCommand, m_windowTarget, aChannel, getter_AddRefs(aContentStreamListener), &aAbortProcess); @@ -305,6 +310,7 @@ NS_IMPL_ADDREF(nsURILoader); NS_IMPL_RELEASE(nsURILoader); NS_INTERFACE_MAP_BEGIN(nsURILoader) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIURILoader) NS_INTERFACE_MAP_ENTRY(nsIURILoader) NS_INTERFACE_MAP_ENTRY(nsPIURILoaderWithPostData) NS_INTERFACE_MAP_END @@ -329,17 +335,19 @@ NS_IMETHODIMP nsURILoader::UnRegisterContentListener(nsIURIContentListener * aCo } NS_IMETHODIMP nsURILoader::OpenURI(nsIURI *aURI, + nsURILoadCommand aCommand, const char * aWindowTarget, nsISupports * aWindowContext, nsIURI *aReferringURI, nsISupports *aOpenContext, nsISupports **aCurrentOpenContext) { - return OpenURIVia(aURI, aWindowTarget, aWindowContext, aReferringURI, aOpenContext, + return OpenURIVia(aURI, aCommand, aWindowTarget, aWindowContext, aReferringURI, aOpenContext, aCurrentOpenContext, 0 /* ip address */); } NS_IMETHODIMP nsURILoader::OpenURIVia(nsIURI *aURI, + nsURILoadCommand aCommand, const char * aWindowTarget, nsISupports * aWindowContext, nsIURI *aReferringURI, @@ -348,11 +356,12 @@ NS_IMETHODIMP nsURILoader::OpenURIVia(nsIURI *aURI, PRUint32 aLocalIP) { // forward our call - return OpenURIWithPostDataVia(aURI, aWindowTarget, aWindowContext, aReferringURI, nsnull /* post stream */, + return OpenURIWithPostDataVia(aURI, aCommand, aWindowTarget, aWindowContext, aReferringURI, nsnull /* post stream */, aOpenContext,aCurrentOpenContext, aLocalIP); } NS_IMETHODIMP nsURILoader::OpenURIWithPostData(nsIURI *aURI, + nsURILoadCommand aCommand, const char *aWindowTarget, nsISupports * aWindowContext, nsIURI *aReferringURI, @@ -360,12 +369,13 @@ NS_IMETHODIMP nsURILoader::OpenURIWithPostData(nsIURI *aURI, nsISupports *aOpenContext, nsISupports **aCurrentOpenContext) { - return OpenURIWithPostDataVia(aURI, aWindowTarget, aWindowContext, aReferringURI, + return OpenURIWithPostDataVia(aURI, aCommand, aWindowTarget, aWindowContext, aReferringURI, aPostDataStream, aOpenContext, aCurrentOpenContext, 0); } NS_IMETHODIMP nsURILoader::OpenURIWithPostDataVia(nsIURI *aURI, + nsURILoadCommand aCommand, const char *aWindowTarget, nsISupports * aWindowContext, nsIURI *aReferringURI, @@ -389,7 +399,7 @@ NS_IMETHODIMP nsURILoader::OpenURIWithPostDataVia(nsIURI *aURI, loader->Init(aWindowContext); // Extra Info // now instruct the loader to go ahead and open the url - rv = loader->Open(aURI, aWindowTarget, aWindowContext, + rv = loader->Open(aURI, aCommand, aWindowTarget, aWindowContext, aReferringURI, aPostDataStream, aOpenContext, aCurrentOpenContext); NS_RELEASE(loader); @@ -398,7 +408,7 @@ NS_IMETHODIMP nsURILoader::OpenURIWithPostDataVia(nsIURI *aURI, nsresult nsURILoader::DispatchContent(const char * aContentType, - const char * aCommand, + nsURILoadCommand aCommand, const char * aWindowTarget, nsIChannel * aChannel, nsISupports * aCtxt, @@ -456,7 +466,19 @@ nsresult nsURILoader::DispatchContent(const char * aContentType, nsCOMPtr aContentHandler; rv = nsComponentManager::CreateInstance(handlerProgID, nsnull, NS_GET_IID(nsIContentHandler), getter_AddRefs(aContentHandler)); if (NS_SUCCEEDED(rv)) // we did indeed have a content handler for this type!! yippee... - rv = aContentHandler->HandleContent(aContentType, aCommand, aWindowTarget, aChannel); + rv = aContentHandler->HandleContent(aContentType, "view", aWindowTarget, aChannel); + else if (aContentListener) + { + // BIG TIME HACK ALERT!!!!! WE NEED THIS HACK IN PLACE UNTIL OUR NEW UNKNOWN CONTENT + // HANDLER COMES ONLINE!!! + // Until that day, if we couldn't find a handler for the content type, then go back to the listener who + // originated the url request and force them to handle the content....this forces us through the old code + // path for unknown content types which brings up the file save as dialog... + *aContentListenerToUse = aContentListener; + NS_IF_ADDREF(*aContentListenerToUse); + rv = NS_OK; + } + return rv; }