mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 06:11:37 +00:00
Fix for bug#66334 - Viewsource needs to be a protocol handler
r=valeski,sr=rpotts
This commit is contained in:
parent
2c58e0142a
commit
b9342d088b
@ -181,6 +181,8 @@ NS_IMETHODIMP nsDSURIContentListener::CanHandleContent(const char* aContentType,
|
||||
|| nsCRT::strcasecmp(aContentType, "image/tiff") == 0
|
||||
|| nsCRT::strcasecmp(aContentType, "application/http-index-format") == 0)
|
||||
*aCanHandleContent = PR_TRUE;
|
||||
else if (PL_strcasestr(aContentType, "; x-view-type=view-source") != nsnull)
|
||||
*aCanHandleContent = PR_TRUE;
|
||||
}
|
||||
else
|
||||
*aCanHandleContent = PR_FALSE;
|
||||
|
@ -136,10 +136,7 @@ nsDocShell::nsDocShell() :
|
||||
mAllowPlugins(PR_TRUE),
|
||||
mAllowJavascript(PR_TRUE),
|
||||
mAllowMetaRedirects(PR_TRUE),
|
||||
mAppType(nsIDocShell::APP_TYPE_UNKNOWN),
|
||||
mViewMode(viewNormal),
|
||||
mLastViewMode(viewNormal),
|
||||
mRestoreViewMode(PR_FALSE),
|
||||
mAppType(nsIDocShell::APP_TYPE_UNKNOWN),
|
||||
mBusyFlags(BUSY_FLAGS_NONE),
|
||||
mEODForCurrentDocument (PR_FALSE),
|
||||
mURIResultedInDocument(PR_FALSE),
|
||||
@ -459,7 +456,7 @@ nsDocShell::LoadURI(nsIURI* aURI, nsIDocShellLoadInfo* aLoadInfo, PRUint32 aLoad
|
||||
}
|
||||
if (shEntry) {
|
||||
// Load is from SH. SH does normal load only
|
||||
mViewMode = viewNormal;
|
||||
|
||||
rv = LoadHistoryEntry(shEntry, loadType);
|
||||
} else {
|
||||
rv = InternalLoad(aURI, referrer, owner, inheritOwner, stopActiveDoc, (const char*) target, nsnull,
|
||||
@ -763,33 +760,6 @@ NS_IMETHODIMP nsDocShell::SetAppType(PRUint32 aAppType)
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDocShell::GetViewMode(PRInt32* aViewMode)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aViewMode);
|
||||
|
||||
*aViewMode = mViewMode;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDocShell::SetViewMode(PRInt32 aViewMode)
|
||||
{
|
||||
NS_ENSURE_ARG((viewNormal == aViewMode) || (viewSource == aViewMode));
|
||||
|
||||
PRBool reload = PR_FALSE;
|
||||
|
||||
if((mViewMode != aViewMode) && mCurrentURI)
|
||||
reload = PR_TRUE;
|
||||
|
||||
mViewMode = aViewMode;
|
||||
|
||||
if(reload)
|
||||
{
|
||||
Reload(LOAD_FLAGS_NONE);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsDocShell::GetZoom(float* zoom)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(zoom);
|
||||
@ -2870,9 +2840,13 @@ nsresult nsDocShell::NewContentViewerObj(const char* aContentType,
|
||||
//XXX This should probably be some category thing....
|
||||
char id[256];
|
||||
PR_snprintf(id, sizeof(id), NS_DOCUMENT_LOADER_FACTORY_CONTRACTID_PREFIX "%s;1?type=%s",
|
||||
(const char*)((viewSource == mViewMode) ? "view-source" : "view"),
|
||||
(const char*)"view",
|
||||
aContentType);
|
||||
|
||||
// Note that we're always passing in "view" for the component id above
|
||||
// and to the docLoaderFactory->CreateInstance() at the end of this method.
|
||||
// nsLayoutDLF makes the determination if it should be a "view-source"
|
||||
|
||||
// Create an instance of the document-loader-factory
|
||||
nsCOMPtr<nsIDocumentLoaderFactory> docLoaderFactory(do_CreateInstance(id));
|
||||
if(!docLoaderFactory)
|
||||
@ -2896,7 +2870,7 @@ nsresult nsDocShell::NewContentViewerObj(const char* aContentType,
|
||||
|
||||
// Now create an instance of the content viewer
|
||||
NS_ENSURE_SUCCESS(docLoaderFactory->CreateInstance(
|
||||
(viewSource == mViewMode) ? "view-source" : "view",
|
||||
"view",
|
||||
aOpenedChannel, aLoadGroup, aContentType,
|
||||
NS_STATIC_CAST(nsIContentViewerContainer*, this), nsnull,
|
||||
aContentHandler, aViewer), NS_ERROR_FAILURE);
|
||||
@ -3173,29 +3147,6 @@ NS_IMETHODIMP nsDocShell::CreateFixupURI(const PRUnichar* aStringURI,
|
||||
// Eliminate embedded newlines, which single-line text fields now allow:
|
||||
uriString.StripChars("\r\n");
|
||||
|
||||
// XXX nasty hack to check for the view-source: prefix
|
||||
//
|
||||
// The long term way and probably CORRECT way to do this is to write a
|
||||
// protocol handler for the view-source: schema and have that feed back a
|
||||
// content type that the docshell recognizes to mean to use viewSource mode.
|
||||
//
|
||||
const char cViewSource[] = "view-source:";
|
||||
if (uriString.EqualsWithConversion(cViewSource, PR_TRUE, sizeof(cViewSource) - 1))
|
||||
{
|
||||
// Strip the view-source: prefix and set the docshell's view mode
|
||||
nsAutoString newUri;
|
||||
uriString.Mid(newUri, sizeof(cViewSource) - 1, -1);
|
||||
uriString = newUri;
|
||||
mLastViewMode = mViewMode;
|
||||
mViewMode = viewSource;
|
||||
mRestoreViewMode = PR_TRUE;
|
||||
}
|
||||
else if (mRestoreViewMode)
|
||||
{
|
||||
mRestoreViewMode = PR_FALSE;
|
||||
mViewMode = mLastViewMode;
|
||||
}
|
||||
|
||||
// Create the fixup object if necessary
|
||||
if (!mURIFixup)
|
||||
{
|
||||
@ -3594,10 +3545,6 @@ NS_IMETHODIMP nsDocShell::DoChannelLoad(nsIChannel *aChannel, nsURILoadCommand a
|
||||
(void)aChannel->GetLoadFlags(&loadFlags);
|
||||
loadFlags |= nsIChannel::LOAD_DOCUMENT_URI;
|
||||
|
||||
// "View source" always wants the currently cached content.
|
||||
if ( mViewMode == viewSource ) {
|
||||
loadFlags |= nsIRequest::LOAD_FROM_CACHE;
|
||||
} else {
|
||||
// Load attributes depend on load type...
|
||||
switch ( mLoadType )
|
||||
{
|
||||
@ -3637,7 +3584,6 @@ NS_IMETHODIMP nsDocShell::DoChannelLoad(nsIChannel *aChannel, nsURILoadCommand a
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
(void) aChannel->SetLoadFlags(loadFlags);
|
||||
|
||||
|
@ -95,6 +95,11 @@ enum LoadType {
|
||||
LOAD_REFRESH = MAKE_LOAD_TYPE(LOAD_CMD_NORMAL, nsIWebNavigation::LOAD_FLAGS_IS_REFRESH)
|
||||
};
|
||||
|
||||
/* internally used ViewMode types */
|
||||
enum ViewMode {
|
||||
viewNormal = 0x0,
|
||||
viewSource = 0x1
|
||||
};
|
||||
|
||||
//*****************************************************************************
|
||||
//*** nsRefreshTimer
|
||||
@ -289,9 +294,6 @@ protected:
|
||||
PRBool mAllowJavascript;
|
||||
PRBool mAllowMetaRedirects;
|
||||
PRUint32 mAppType;
|
||||
PRInt32 mViewMode;
|
||||
PRInt32 mLastViewMode;
|
||||
PRBool mRestoreViewMode;
|
||||
PRInt32 mChildOffset; // Offset in the parent's child list.
|
||||
PRUint32 mBusyFlags;
|
||||
// Reference to the SHEntry for this docshell until the page is destroyed.
|
||||
|
@ -162,17 +162,6 @@ interface nsIDocShell : nsISupports
|
||||
|
||||
attribute unsigned long appType;
|
||||
|
||||
/*
|
||||
Definitions for the viewModes the docShell can be in.
|
||||
*/
|
||||
const long viewNormal=0;
|
||||
const long viewSource=1;
|
||||
|
||||
/*
|
||||
This is the mode that the docShell is in for viewing when a load occurs.
|
||||
*/
|
||||
attribute long viewMode;
|
||||
|
||||
/**
|
||||
* Set/Get the document scale factor. When setting this attribute, a
|
||||
* NS_ERROR_NOT_IMPLEMENTED error may be returned by implementations
|
||||
|
@ -63,12 +63,14 @@ static char* gHTMLTypes[] = {
|
||||
"text/rtf",
|
||||
"text/cpp",
|
||||
"text/css",
|
||||
"text/html; x-view-type=view-source",
|
||||
0
|
||||
};
|
||||
|
||||
static char* gXMLTypes[] = {
|
||||
"text/xml",
|
||||
"application/xml",
|
||||
"text/xml; x-view-type=view-source",
|
||||
0
|
||||
};
|
||||
|
||||
@ -243,8 +245,40 @@ nsLayoutDLF::CreateInstance(const char *aCommand,
|
||||
}
|
||||
}
|
||||
|
||||
// Check aContentType to see if it's a view-source type
|
||||
//
|
||||
// If it's a "view-source:", aContentType will be of the form
|
||||
//
|
||||
// <orig_type>; x-view-type=view-source
|
||||
//
|
||||
// where <orig_type> can be text/html, text/xml etc.
|
||||
//
|
||||
|
||||
nsCAutoString strContentType; strContentType.Append(aContentType);
|
||||
PRInt32 idx = strContentType.Find("; x-view-type=view-source", PR_TRUE, 0, -1);
|
||||
if(idx != -1)
|
||||
{ // Found "; x-view-type=view-source" param in content type.
|
||||
|
||||
// Set aCommand to view-source
|
||||
|
||||
aCommand = "view-source";
|
||||
|
||||
// Null terminate at the ";" in "text/html; x-view-type=view-source"
|
||||
// The idea is to end up with the original content type i.e. without
|
||||
// the x-view-type param was added to it.
|
||||
|
||||
strContentType.SetCharAt('\0', idx);
|
||||
|
||||
aContentType = strContentType.get(); //This will point to the "original" mime type
|
||||
}
|
||||
|
||||
if(0==PL_strcmp(aCommand,"view-source")) {
|
||||
#ifdef VIEW_SOURCE_HTML
|
||||
NS_ENSURE_ARG(aChannel);
|
||||
// It's a view-source. Reset channel's content type to the original
|
||||
// type so as not to choke the parser when it asks the channel
|
||||
// for the content type during the parse phase
|
||||
aChannel->SetContentType(aContentType);
|
||||
aContentType=gHTMLTypes[0];
|
||||
#else
|
||||
if(0==PL_strcmp(aContentType,gHTMLTypes[1])) {
|
||||
|
@ -38,6 +38,7 @@ SHARED_LIBRARY_LIBS = \
|
||||
$(DIST)/lib/libnkftp_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/libnkfinger_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/libnkdatetm_s.$(LIB_SUFFIX) \
|
||||
$(DIST)/lib/libnkviewsource_s.$(LIB_SUFFIX) \
|
||||
$(NULL)
|
||||
|
||||
LOCAL_INCLUDES = \
|
||||
@ -45,6 +46,7 @@ LOCAL_INCLUDES = \
|
||||
-I$(srcdir)/../protocol/ftp/src \
|
||||
-I$(srcdir)/../protocol/finger/src \
|
||||
-I$(srcdir)/../protocol/datetime/src \
|
||||
-I$(srcdir)/../protocol/viewsource/src \
|
||||
$(NULL)
|
||||
|
||||
EXTRA_DSO_LDOPTS = \
|
||||
|
@ -38,6 +38,7 @@ LLIBS= \
|
||||
$(DIST)\lib\nkftp_s.lib \
|
||||
$(DIST)\lib\nkfinger_s.lib \
|
||||
$(DIST)\lib\nkdatetm_s.lib \
|
||||
$(DIST)\lib\nkviewsource_s.lib \
|
||||
$(LIBNSPR)
|
||||
|
||||
INCS = $(INCS) \
|
||||
@ -46,6 +47,7 @@ INCS = $(INCS) \
|
||||
-I$(DEPTH)\netwerk\protocol\ftp\src \
|
||||
-I$(DEPTH)\netwerk\protocol\finger\src \
|
||||
-I$(DEPTH)\netwerk\protocol\datetime\src \
|
||||
-I$(DEPTH)\netwerk\protocol\viewsource\src \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "nsFtpProtocolHandler.h"
|
||||
#include "nsFingerHandler.h"
|
||||
#include "nsDateTimeHandler.h"
|
||||
#include "nsViewSourceHandler.h"
|
||||
|
||||
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsFtpProtocolHandler, Init);
|
||||
|
||||
@ -59,6 +60,13 @@ static nsModuleComponentInfo gNetModuleInfo[] = {
|
||||
NS_DATETIMEHANDLER_CID,
|
||||
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "datetime",
|
||||
nsDateTimeHandler::Create
|
||||
},
|
||||
|
||||
// from netwerk/protocol/viewsource:
|
||||
{ "The ViewSource Protocol Handler",
|
||||
NS_VIEWSOURCEHANDLER_CID,
|
||||
NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "view-source",
|
||||
nsViewSourceHandler::Create
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -27,7 +27,7 @@ VPATH = @srcdir@
|
||||
include $(DEPTH)/config/autoconf.mk
|
||||
|
||||
DIRS = about data file ftp http keyword jar res \
|
||||
datetime finger gopher
|
||||
datetime finger gopher viewsource
|
||||
|
||||
include $(topsrcdir)/config/rules.mk
|
||||
|
||||
|
@ -35,6 +35,7 @@ DIRS= \
|
||||
res \
|
||||
finger \
|
||||
gopher \
|
||||
viewsource \
|
||||
$(NULL)
|
||||
|
||||
include <$(DEPTH)\config\rules.mak>
|
||||
|
Loading…
Reference in New Issue
Block a user