backout darin's checkin from around noon yesterday to remove the regression

in 161921
This commit is contained in:
leaf%mozilla.org 2002-08-09 23:46:19 +00:00
Родитель 94f729957d
Коммит 9c78570990
43 изменённых файлов: 453 добавлений и 463 удалений

Просмотреть файл

@ -73,7 +73,7 @@
#include "nsISupportsPrimitives.h"
#include "nsIServiceManagerUtils.h"
#include "nsPromiseFlatString.h"
#include "nsNetUtil.h"
#include "nsIIOService.h"
#include "nsIFile.h"
#include "nsIWebNavigation.h"
#include "nsIDragDropOverride.h"
@ -313,12 +313,13 @@ nsContentAreaDragDrop::ExtractURLFromData(const nsACString & inFlavor, nsISuppor
}
}
else if ( inFlavor.Equals(kFileMime) ) {
// the data is a file. Use the necko parsing utils to get a file:// url
// the data is a file. Use the IOService to get a file:// url
// from the OS data.
nsCOMPtr<nsIIOService> ioService(do_GetService("@mozilla.org/network/io-service;1"));
nsCOMPtr<nsIFile> file(do_QueryInterface(inDataWrapper));
if ( file ) {
if ( ioService && file ) {
nsCAutoString url;
NS_GetURLSpecFromFile(file, url);
ioService->GetURLSpecFromFile(file, url);
outURL = NS_ConvertUTF8toUCS2(url);
}
}

Просмотреть файл

@ -485,8 +485,8 @@ function MakeRelativeUrl(url)
// Get just the file path part of the urls
var docPath = IOService.newURI(docUrl, null, null).path;
var urlPath = IOService.newURI(inputUrl, null, null).path;
var docPath = IOService.extractUrlPart(docUrl, IOService.url_Path);
var urlPath = IOService.extractUrlPart(inputUrl, IOService.url_Path);
// We only return "urlPath", so we can convert
// the entire docPath for case-insensitive comparisons
@ -653,9 +653,9 @@ function GetDocumentUrl()
}
// Extract the scheme (e.g., 'file', 'http') from a URL string
function GetScheme(urlspec)
function GetScheme(url)
{
var resultUrl = TrimString(urlspec);
var resultUrl = TrimString(url);
// Unsaved document URL has no acceptable scheme yet
if (!resultUrl || IsUrlAboutBlank(resultUrl))
return "";
@ -670,13 +670,13 @@ function GetScheme(urlspec)
var scheme = "";
try {
// This fails if there's no scheme
scheme = IOService.extractScheme(resultUrl);
scheme = IOService.extractScheme(resultUrl, {schemeStartPos:0}, {schemeEndPos:0});
} catch (e) {}
return scheme ? scheme.toLowerCase() : "";
}
function GetHost(urlspec)
function GetHost(url)
{
if (!url)
return "";
@ -687,13 +687,13 @@ function GetHost(urlspec)
var host = "";
try {
host = IOService.newURI(urlspec, null, null).host;
host = IOService.extractUrlPart(url, IOService.url_Host);
} catch (e) {}
return host;
}
function GetUsername(urlspec)
function GetUsername(url)
{
if (!url)
return "";
@ -704,15 +704,15 @@ function GetUsername(urlspec)
var username = "";
try {
username = IOService.newURI(urlspec, null, null).username;
username = IOService.extractUrlPart(url, IOService.url_Username);
} catch (e) {}
return username;
}
function GetFilename(urlspec)
function GetFilename(url)
{
if (!urlspec || IsUrlAboutBlank(urlspec))
if (!url || IsUrlAboutBlank(url))
return "";
var IOService = GetIOService();
@ -722,12 +722,12 @@ function GetFilename(urlspec)
var filename;
try {
uri = IOService.newURI(urlspec, null, null);
if (uri)
filename = IOService.extractUrlPart(url, IOService.url_FileBaseName);
if (filename)
{
var url = uri.QueryInterface(Components.interfaces.nsIURL);
if (url)
filename = url.fileName;
var ext = IOService.extractUrlPart(url, IOService.url_FileExtension);
if (ext)
filename += "."+ext;
}
} catch (e) {}
@ -737,11 +737,11 @@ function GetFilename(urlspec)
// Return the url without username and password
// Optional output objects return extracted username and password strings
// This uses just string routines via nsIIOServices
function StripUsernamePassword(urlspec, usernameObj, passwordObj)
function StripUsernamePassword(url, usernameObj, passwordObj)
{
urlspec = TrimString(urlspec);
if (!urlspec || IsUrlAboutBlank(urlspec))
return urlspec;
url = TrimString(url);
if (!url || IsUrlAboutBlank(url))
return url;
if (usernameObj)
usernameObj.value = "";
@ -749,17 +749,16 @@ function StripUsernamePassword(urlspec, usernameObj, passwordObj)
passwordObj.value = "";
// "@" must exist else we will never detect username or password
var atIndex = urlspec.indexOf("@");
var atIndex = url.indexOf("@");
if (atIndex > 0)
{
try {
var IOService = GetIOService();
if (!IOService)
return urlspec;
return url;
var uri = IOService.newURI(urlspec, null, null);
var username = uri.username;
var password = uri.password;
var username = IOService.extractUrlPart(url, IOService.url_Username);
var password = IOService.extractUrlPart(url, IOService.url_Password);
if (usernameObj && username)
usernameObj.value = username;
@ -767,79 +766,79 @@ function StripUsernamePassword(urlspec, usernameObj, passwordObj)
passwordObj.value = password;
if (username)
{
var usernameStart = urlspec.indexOf(username);
var usernameStart = url.indexOf(username);
if (usernameStart != -1)
return urlspec.slice(0, usernameStart) + urlspec.slice(atIndex+1);
return url.slice(0, usernameStart) + url.slice(atIndex+1);
}
} catch (e) {}
}
return urlspec;
return url;
}
function StripPassword(urlspec, passwordObj)
function StripPassword(url, passwordObj)
{
urlspec = TrimString(urlspec);
if (!urlspec || IsUrlAboutBlank(urlspec))
return urlspec;
url = TrimString(url);
if (!url || IsUrlAboutBlank(url))
return url;
if (passwordObj)
passwordObj.value = "";
// "@" must exist else we will never detect password
var atIndex = urlspec.indexOf("@");
var atIndex = url.indexOf("@");
if (atIndex > 0)
{
try {
var IOService = GetIOService();
if (!IOService)
return urlspec;
return url;
var password = IOService.newURI(urlspec, null, null).password;
var password = IOService.extractUrlPart(url, IOService.url_Password);
if (passwordObj && password)
passwordObj.value = password;
if (password)
{
// Find last ":" before "@"
var colon = urlspec.lastIndexOf(":", atIndex);
var colon = url.lastIndexOf(":", atIndex);
if (colon != -1)
{
// Include the "@"
return urlspec.slice(0, colon) + urlspec.slice(atIndex);
return url.slice(0, colon) + url.slice(atIndex);
}
}
} catch (e) {}
}
return urlspec;
return url;
}
// Version to use when you have an nsIURI object
function StripUsernamePasswordFromURI(uri)
{
var urlspec = "";
var url = "";
if (uri)
{
try {
urlspec = uri.spec;
url = uri.spec;
var userPass = uri.userPass;
if (userPass)
{
start = urlspec.indexOf(userPass);
urlspec = urlspec.slice(0, start) + urlspec.slice(start+userPass.length+1);
start = url.indexOf(userPass);
url = url.slice(0, start) + url.slice(start+userPass.length+1);
}
} catch (e) {}
}
return urlspec;
return url;
}
function InsertUsernameIntoUrl(urlspec, username)
function InsertUsernameIntoUrl(url, username)
{
if (!urlspec || !username)
return urlspec;
if (!url || !username)
return url;
try {
var ioService = GetIOService();
var URI = ioService.newURI(urlspec, window.editorShell.GetDocumentCharacterSet(), null);
var URI = ioService.newURI(url, window.editorShell.GetDocumentCharacterSet(), null);
URI.username = username;
return URI.spec;
} catch (e) {}

Просмотреть файл

@ -1306,6 +1306,7 @@ cookie_SetCookieString(nsIURI * curURL, nsIPrompt *aPrompter, const char * setCo
}
/* generate the message for the nag box */
PRUnichar * new_string=0;
int count = cookie_Count(host_from_header);
prev_cookie = cookie_CheckForPrevCookie
(path_from_header, host_from_header, name_from_header);
@ -1494,8 +1495,9 @@ COOKIE_SetCookieStringFromHttp(nsIURI * curURL, nsIURI * firstURL, nsIPrompt *aP
status = cookie_P3PDecision(curURL, firstURL, aHttpChannel);
if (status == nsICookie::STATUS_REJECTED) {
nsCOMPtr<nsIObserverService> os(do_GetService("@mozilla.org/observer-service;1"));
if (os)
os->NotifyObservers(nsnull, "cookieIcon", NS_ConvertASCIItoUCS2("on").get());
if (os) {
nsresult rv = os->NotifyObservers(nsnull, "cookieIcon", NS_ConvertASCIItoUCS2("on").get());
}
return;
}
}
@ -1655,7 +1657,7 @@ COOKIE_Read() {
}
cookie_CookieStruct *new_cookie, *tmp_cookie_ptr;
size_t new_len;
nsCAutoString buffer;
nsAutoString buffer;
PRBool added_to_list;
nsFileSpec dirSpec;
nsresult rv = CKutil_ProfileDirectory(dirSpec);
@ -1682,7 +1684,7 @@ COOKIE_Read() {
added_to_list = PR_FALSE;
if ( !buffer.IsEmpty() ) {
char firstChar = buffer.CharAt(0);
PRUnichar firstChar = buffer.CharAt(0);
if (firstChar == '#' || firstChar == nsCRT::CR ||
firstChar == nsCRT::LF || firstChar == 0) {
continue;
@ -1698,7 +1700,7 @@ COOKIE_Read() {
(cookieIndex=buffer.FindChar('\t', nameIndex)+1) == 0 ) {
continue;
}
nsCAutoString host, isDomain, path, isSecure, expires, name, cookie;
nsAutoString host, isDomain, path, isSecure, expires, name, cookie;
buffer.Mid(host, hostIndex, isDomainIndex-hostIndex-1);
buffer.Mid(isDomain, isDomainIndex, pathIndex-isDomainIndex-1);
buffer.Mid(path, pathIndex, secureIndex-pathIndex-1);
@ -1718,12 +1720,12 @@ COOKIE_Read() {
new_cookie->cookie = ToNewCString(cookie);
new_cookie->host = ToNewCString(host);
new_cookie->path = ToNewCString(path);
if (isDomain.Equals(NS_LITERAL_CSTRING("TRUE"))) {
if (isDomain.Equals(NS_LITERAL_STRING("TRUE"))) {
new_cookie->isDomain = PR_TRUE;
} else {
new_cookie->isDomain = PR_FALSE;
}
if (isSecure.Equals(NS_LITERAL_CSTRING("TRUE"))) {
if (isSecure.Equals(NS_LITERAL_STRING("TRUE"))) {
new_cookie->isSecure = PR_TRUE;
} else {
new_cookie->isSecure = PR_FALSE;
@ -1902,12 +1904,17 @@ COOKIE_Remove
(PL_strcmp(cookie->name, name) == 0) &&
(PL_strcmp(cookie->path, path) == 0)) {
if (blocked && cookie->host) {
char * hostname = nsnull;
char * hostnameAfterDot = cookie->host;
while (*hostnameAfterDot == '.') {
hostnameAfterDot++;
}
if (NS_SUCCEEDED(PERMISSION_Read()))
Permission_AddHost(nsDependentCString(hostnameAfterDot), PR_FALSE, COOKIEPERMISSION, PR_TRUE);
CKutil_StrAllocCopy(hostname, hostnameAfterDot);
if (hostname) {
if (NS_SUCCEEDED(PERMISSION_Read())) {
Permission_AddHost(hostname, PR_FALSE, COOKIEPERMISSION, PR_TRUE);
}
}
}
cookie_list->RemoveElementAt(count);
deleteCookie((void*)cookie, nsnull);

Просмотреть файл

@ -44,12 +44,10 @@
#include "nsISupports.idl"
interface nsIURI;
[scriptable, uuid(D60B3710-166D-11d5-A542-0010A401EB10)]
interface nsIImgManager : nsISupports
{
void block(in nsIURI imageURL);
void block(in string imageURL);
};
%{ C++

Просмотреть файл

@ -48,11 +48,11 @@
[scriptable, uuid(4F6B5E00-0C36-11d5-A535-0010A401EB10)]
interface nsIPermissionManager : nsISupports
{
void add(in AUTF8String objectURL, in boolean permission, in PRInt32 type);
boolean testForBlocking(in AUTF8String objectURL, in PRInt32 type);
void add(in string objectURL, in boolean permission, in PRInt32 type);
boolean testForBlocking(in string objectURL, in PRInt32 type);
void removeAll();
readonly attribute nsISimpleEnumerator enumerator;
void remove(in AUTF8String host, in PRInt32 type);
void remove(in string host, in PRInt32 type);
};
%{ C++

Просмотреть файл

@ -45,7 +45,6 @@
#include "nsIPref.h"
#include "nsIServiceManager.h"
#include "nsIIOService.h"
#include "nsIURI.h"
#define image_behaviorPref "network.image.imageBehavior"
#define image_warningPref "network.image.warnAboutImages"
@ -211,13 +210,17 @@ IMAGE_BlockedInMail()
}
PUBLIC nsresult
IMAGE_Block(nsIURI* imageURI)
{
if (!imageURI) {
IMAGE_Block(const char* imageURL,
nsIIOService* ioService) {
if (!imageURL || !(*imageURL)) {
return NS_ERROR_NULL_POINTER;
}
nsCAutoString hostPort;
imageURI->GetHostPort(hostPort);
Permission_AddHost(hostPort, PR_FALSE, IMAGEPERMISSION, PR_TRUE);
nsresult rv = NS_OK;
nsCAutoString host;
NS_ASSERTION(ioService, "IOService not available");
rv = ioService->ExtractUrlPart(nsDependentCString(imageURL),
nsIIOService::url_Host |
nsIIOService::url_Port, host);
Permission_AddHost((char*)host.get(), PR_FALSE, IMAGEPERMISSION, PR_TRUE);
return NS_OK;
}

Просмотреть файл

@ -41,12 +41,10 @@
#include "nsString.h"
class nsIURI;
extern nsresult IMAGE_CheckForPermission
(const char * hostname, const char * firstHostname, PRBool *permission);
extern PRBool IMAGE_BlockedInMail(void);
extern nsresult IMAGE_Block(nsIURI * imageURI);
extern nsresult IMAGE_Block(const char * imageURL, nsIIOService *ioService);
extern void IMAGE_RegisterPrefCallbacks(void);
#endif /* IMAGES_H */

Просмотреть файл

@ -92,9 +92,9 @@ nsresult nsImgManager::Init()
}
NS_IMETHODIMP nsImgManager::Block(nsIURI* imageURI)
NS_IMETHODIMP nsImgManager::Block(const char * imageURL)
{
::IMAGE_Block(imageURI);
::IMAGE_Block(imageURL,mIOService);
return NS_OK;
}

Просмотреть файл

@ -47,7 +47,7 @@
#include "nsIPrompt.h"
#include "nsIObserverService.h"
#include "nsPermission.h"
#include "nsNetUtil.h"
#include "nsNetCID.h"
static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID);
@ -129,26 +129,19 @@ nsresult nsPermissionManager::Init()
observerService->AddObserver(this, "profile-before-change", PR_FALSE);
observerService->AddObserver(this, "profile-do-change", PR_FALSE);
}
mIOService = do_GetIOService();
mIOService = do_GetService(NS_IOSERVICE_CONTRACTID, &rv);
return rv;
}
NS_IMETHODIMP nsPermissionManager::Add
(const nsACString & objectURI, PRBool permission, PRInt32 type) {
// XXX ideally we should change this interface to pass nsIURI
nsCOMPtr<nsIURI> uri;
NS_NewURI(getter_AddRefs(uri), objectURI, nsnull, nsnull, mIOService);
::PERMISSION_Add(uri, permission, type);
(const char * objectURL, PRBool permission, PRInt32 type) {
::PERMISSION_Add(objectURL, permission, type, mIOService);
return NS_OK;
}
NS_IMETHODIMP nsPermissionManager::TestForBlocking
(const nsACString &objectURI, PRInt32 type, PRBool* blocked) {
// XXX ideally we should change this interface to pass nsIURI
nsCOMPtr<nsIURI> uri;
NS_NewURI(getter_AddRefs(uri), objectURI, nsnull, nsnull, mIOService);
::PERMISSION_TestForBlocking(uri, blocked, type);
(const char * objectURL, PRInt32 type, PRBool* blocked) {
::PERMISSION_TestForBlocking(objectURL, blocked, type, mIOService);
return NS_OK;
}
@ -169,7 +162,7 @@ NS_IMETHODIMP nsPermissionManager::GetEnumerator(nsISimpleEnumerator * *entries)
return NS_OK;
}
NS_IMETHODIMP nsPermissionManager::Remove(const nsACString & host, PRInt32 type) {
NS_IMETHODIMP nsPermissionManager::Remove(const char* host, PRInt32 type) {
::PERMISSION_Remove(host, type);
return NS_OK;
}

Просмотреть файл

@ -50,7 +50,7 @@
#include "nsVoidArray.h"
#include "prmem.h"
#include "nsAppDirectoryServiceDefs.h"
#include "nsIURI.h"
#include "nsIIOService.h"
#include "nsNetCID.h"
#include "nsTextFormatter.h"
@ -212,12 +212,14 @@ Permission_Check(
/* see if we need to remember this decision */
if (rememberChecked) {
char * hostname2 = NULL;
/* ignore leading periods in host name */
const char * hostnameAfterDot = hostname;
while (hostnameAfterDot && (*hostnameAfterDot == '.')) {
hostnameAfterDot++;
}
Permission_AddHost(nsDependentCString(hostnameAfterDot), permission, type, PR_TRUE);
CKutil_StrAllocCopy(hostname2, hostnameAfterDot);
Permission_AddHost(hostname2, permission, type, PR_TRUE);
}
if (rememberChecked != permission_GetRememberChecked(type)) {
permission_SetRememberChecked(type, rememberChecked);
@ -229,12 +231,14 @@ Permission_Check(
}
PUBLIC nsresult
Permission_AddHost(const nsAFlatCString & host, PRBool permission, PRInt32 type, PRBool save) {
Permission_AddHost(char * host, PRBool permission, PRInt32 type, PRBool save) {
/* create permission list if it does not yet exist */
if(!permission_list) {
permission_list = new nsVoidArray();
if(!permission_list)
if(!permission_list) {
Recycle(host);
return NS_ERROR_OUT_OF_MEMORY;
}
}
/* find existing entry for host */
@ -245,13 +249,14 @@ Permission_AddHost(const nsAFlatCString & host, PRBool permission, PRInt32 type,
for (i = 0; i < hostCount; ++i) {
hostStruct = NS_STATIC_CAST(permission_HostStruct*, permission_list->ElementAt(i));
if (hostStruct) {
if (PL_strcasecmp(host.get(),hostStruct->host)==0) {
if (PL_strcasecmp(host,hostStruct->host)==0) {
/* host found in list */
Recycle(host);
HostFound = PR_TRUE;
break;
#ifdef alphabetize
} else if (PL_strcasecmp(host.get(), hostStruct->host) < 0) {
} else if (PL_strcasecmp(host, hostStruct->host) < 0) {
/* need to insert new entry here */
break;
@ -264,12 +269,15 @@ Permission_AddHost(const nsAFlatCString & host, PRBool permission, PRInt32 type,
/* create a host structure for the host */
hostStruct = PR_NEW(permission_HostStruct);
if (!hostStruct)
if (!hostStruct) {
Recycle(host);
return NS_ERROR_FAILURE;
hostStruct->host = ToNewCString(host);
}
hostStruct->host = host;
hostStruct->permissionList = new nsVoidArray();
if(!hostStruct->permissionList) {
PR_Free(hostStruct);
Recycle(host);
return NS_ERROR_FAILURE;
}
@ -314,7 +322,7 @@ Permission_AddHost(const nsAFlatCString & host, PRBool permission, PRInt32 type,
}
PRIVATE void
permission_Unblock(const char * host, PRInt32 type) {
permission_Unblock(char * host, PRInt32 type) {
/* nothing to do if permission list does not exist */
if(!permission_list) {
@ -448,7 +456,7 @@ PERMISSION_Read() {
if(!permission_list) {
return NS_ERROR_OUT_OF_MEMORY;
}
nsCAutoString buffer;
nsAutoString buffer;
nsFileSpec dirSpec;
nsresult rv = CKutil_ProfileDirectory(dirSpec);
if (NS_FAILED(rv)) {
@ -469,7 +477,7 @@ PERMISSION_Read() {
*/
while(CKutil_GetLine(strm,buffer) != -1) {
if ( !buffer.IsEmpty() ) {
char firstChar = buffer.CharAt(0);
PRUnichar firstChar = buffer.CharAt(0);
if (firstChar == '#' || firstChar == nsCRT::CR ||
firstChar == nsCRT::LF || firstChar == 0) {
continue;
@ -489,9 +497,10 @@ PERMISSION_Read() {
hostIndex++;
}
nsDependentCSubstring host(buffer, hostIndex, permissionIndex-hostIndex-1);
nsAutoString host;
buffer.Mid(host, hostIndex, permissionIndex-hostIndex-1);
nsCAutoString permissionString;
nsAutoString permissionString;
for (;;) {
if (nextPermissionIndex == buffer.Length()+1) {
break;
@ -499,8 +508,6 @@ PERMISSION_Read() {
if ((nextPermissionIndex=buffer.FindChar('\t', permissionIndex)+1) == 0) {
nextPermissionIndex = buffer.Length()+1;
}
// XXX would like to use nsDependentCSubstring to avoid this allocation,
// but it unfortunately doesn't provide the CharAt method.
buffer.Mid(permissionString, permissionIndex, nextPermissionIndex-permissionIndex-1);
permissionIndex = nextPermissionIndex;
@ -524,13 +531,13 @@ PERMISSION_Read() {
* a host value of "@@@@" is a special code designating the
* state of the nag-box's checkmark
*/
if (host.Equals(NS_LITERAL_CSTRING("@@@@"))) {
if (host.Equals(NS_LITERAL_STRING("@@@@"))) {
if (!permissionString.IsEmpty()) {
permission_SetRememberChecked(type, permission);
}
} else {
if (!permissionString.IsEmpty()) {
rv = Permission_AddHost(PromiseFlatCString(host), permission, type, PR_FALSE);
rv = Permission_AddHost(ToNewCString(host), permission, type, PR_FALSE);
if (NS_FAILED(rv)) {
strm.close();
return rv;
@ -624,7 +631,7 @@ permission_remove (PRInt32 hostNumber, PRInt32 type) {
}
PUBLIC void
PERMISSION_Remove(const nsACString & host, PRInt32 type) {
PERMISSION_Remove(const char* host, PRInt32 type) {
/* get to the indicated host in the list */
if (permission_list) {
@ -635,7 +642,7 @@ PERMISSION_Remove(const nsACString & host, PRInt32 type) {
hostStruct =
NS_STATIC_CAST(permission_HostStruct*, permission_list->ElementAt(hostCount));
NS_ASSERTION(hostStruct, "corrupt permission list");
if (host.Equals(hostStruct->host)) {
if ((PL_strcmp(hostStruct->host, host) == 0)) {
/* get to the indicated permission in the list */
PRInt32 typeCount = hostStruct->permissionList->Count();
@ -693,14 +700,17 @@ PERMISSION_DeletePersistentUserData(void)
}
PUBLIC void
PERMISSION_Add(nsIURI * objectURI, PRBool permission, PRInt32 type) {
if (!objectURI) {
PERMISSION_Add(const char * objectURL, PRBool permission, PRInt32 type,
nsIIOService* ioService) {
if (!objectURL) {
return;
}
nsCAutoString hostPort;
objectURI->GetHostPort(hostPort);
if (hostPort.IsEmpty())
return;
nsresult rv = NS_OK;
nsCAutoString host;
NS_ASSERTION(ioService, "IOService not available");
rv = ioService->ExtractUrlPart(nsDependentCString(objectURL),
nsIIOService::url_Host |
nsIIOService::url_Port, host);
/*
* if permission is false, it will be added to the permission list
@ -708,32 +718,34 @@ PERMISSION_Add(nsIURI * objectURI, PRBool permission, PRInt32 type) {
* true permission being added
*/
if (permission) {
const char * hostPtr = hostPort.get();
char * hostPtr = (char *)host.get();
while (PR_TRUE) {
permission_Unblock(hostPtr, type);
hostPtr = PL_strchr(hostPtr, '.');
if (!hostPtr) {
break;
}
hostPtr++; /* get past the period */
hostPtr++; /* get passed the period */
}
return;
}
Permission_AddHost(hostPort, permission, type, PR_TRUE);
Permission_AddHost(ToNewCString(host), permission, type, PR_TRUE);
}
PUBLIC void
PERMISSION_TestForBlocking(nsIURI * objectURI, PRBool* blocked, PRInt32 type) {
if (!objectURI) {
PERMISSION_TestForBlocking(const char * objectURL, PRBool* blocked, PRInt32 type,
nsIIOService* ioService) {
if (!objectURL) {
return;
}
nsresult rv = NS_OK;
nsCAutoString hostPort;
objectURI->GetHostPort(hostPort);
if (hostPort.IsEmpty())
return;
nsCAutoString host;
NS_ASSERTION(ioService, "IOService not available");
rv = ioService->ExtractUrlPart(nsDependentCString(objectURL),
nsIIOService::url_Host |
nsIIOService::url_Port, host);
const char * hostPtr = hostPort.get();
const char * hostPtr = host.get();
while (PR_TRUE) {
PRBool permission;
rv = permission_CheckFromList(hostPtr, permission, type);

Просмотреть файл

@ -40,8 +40,7 @@
#define PERMISSIONS_H
#include "nsString.h"
class nsIURI;
#include "nsIIOService.h"
#define COOKIEPERMISSION 0
#define IMAGEPERMISSION 1
@ -57,8 +56,8 @@ typedef enum {
class nsIPrompt;
extern nsresult PERMISSION_Read();
extern void PERMISSION_Add(nsIURI * objectURI, PRBool permission, PRInt32 type);
extern void PERMISSION_TestForBlocking(nsIURI * objectURL, PRBool* blocked, PRInt32 type);
extern void PERMISSION_Add(const char * objectURL, PRBool permission, PRInt32 type, nsIIOService* ioService);
extern void PERMISSION_TestForBlocking(const char * objectURL, PRBool* blocked, PRInt32 type, nsIIOService* ioService);
extern void PERMISSION_RemoveAll();
extern void PERMISSION_DeletePersistentUserData(void);
@ -66,13 +65,13 @@ extern PRInt32 PERMISSION_HostCount();
extern PRInt32 PERMISSION_TypeCount(PRInt32 host);
extern nsresult PERMISSION_Enumerate
(PRInt32 hostNumber, PRInt32 typeNumber, char **host, PRInt32 *type, PRBool *capability);
extern void PERMISSION_Remove(const nsACString & host, PRInt32 type);
extern void PERMISSION_Remove(const char* host, PRInt32 type);
extern PRBool Permission_Check
(nsIPrompt *aPrompter, const char * hostname, PRInt32 type,
PRBool warningPref, const char * message_string, int count_for_message);
extern nsresult Permission_AddHost
(const nsAFlatCString &host, PRBool permission, PRInt32 type, PRBool save);
(char * host, PRBool permission, PRInt32 type, PRBool save);
//extern void Permission_Free(PRInt32 hostNumber, PRInt32 type, PRBool save);
extern void Permission_Save();

Просмотреть файл

@ -79,7 +79,7 @@ ckutil_getChar(nsInputFileStream& strm, char& c) {
* strip carriage returns and line feeds from end of line
*/
PUBLIC PRInt32
CKutil_GetLine(nsInputFileStream& strm, nsACString& aLine) {
CKutil_GetLine(nsInputFileStream& strm, nsString& aLine) {
/* read the line */
aLine.Truncate();
@ -93,7 +93,7 @@ CKutil_GetLine(nsInputFileStream& strm, nsACString& aLine) {
}
if (c != '\r') {
aLine.Append(c);
aLine.Append(PRUnichar(c));
}
}
return 0;

Просмотреть файл

@ -42,7 +42,7 @@
#include "nsString.h"
#include "nsFileStream.h"
extern PRInt32 CKutil_GetLine(nsInputFileStream& strm, nsACString& aLine);
extern PRInt32 CKutil_GetLine(nsInputFileStream& strm, nsString& aLine);
extern PRUnichar* CKutil_Localize(const PRUnichar *genericString);
extern nsresult CKutil_ProfileDirectory(nsFileSpec& dirSpec);
extern char * CKutil_StrAllocCopy(char *&destination, const char *source);

Просмотреть файл

@ -184,7 +184,7 @@ function LoadSignons() {
.getService(Components.interfaces.nsIIOService);
var username;
try {
username = ioService.newURI(host, null, null).username;
username = ioService.extractUrlPart(host, ioService.url_Username, unused, unused);
} catch(e) {
username = "";
}

Просмотреть файл

@ -449,6 +449,10 @@ nsWalletlibService::OnStateChange(nsIWebProgress* aWebProgress,
return NS_OK;
}
nsCAutoString spec;
rv = uri->GetSpec(spec);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIDOMHTMLCollection> forms;
rv = htmldoc->GetForms(getter_AddRefs(forms));
if (NS_FAILED(rv) || (forms == nsnull)) return rv;
@ -525,7 +529,7 @@ nsWalletlibService::OnStateChange(nsIWebProgress* aWebProgress,
wwatch->GetNewPrompter(0, getter_AddRefs(prompter));
}
if (prompter) {
SINGSIGN_RestoreSignonData(prompter, uri, nameString, &valueString, elementNumber++);
SINGSIGN_RestoreSignonData(prompter, spec.get(), nameString, &valueString, elementNumber++);
}
if (valueString) {
value = valueString;

Просмотреть файл

@ -2067,23 +2067,34 @@ si_RememberSignonData
PUBLIC void
SINGSIGN_RememberSignonData
(nsIPrompt* dialog, nsIURI* passwordRealm, nsVoidArray * signonData,
(nsIPrompt* dialog, const char* passwordRealm, nsVoidArray * signonData,
nsIDOMWindowInternal* window)
{
if (!passwordRealm)
return;
nsCAutoString strippedRealm;
nsCOMPtr<nsIIOService> ioService = do_GetService(NS_IOSERVICE_CONTRACTID);
if (!ioService) return;
/* Hacky security check: If address is of a scheme that
* doesn't support hostnames, we have no host to get the signon data from,
* so we must not attempt to restore the signon data (bug 159484) */
nsresult rv = passwordRealm->GetHost(strippedRealm);
if (NS_FAILED(rv))
return;
doesn't support hostnames, we have no host to get the signon data from,
so we must not attempt to restore the signon data (bug 159484)
*/
nsCOMPtr<nsIURI> uri;
nsresult result = ioService->NewURI(nsDependentCString(passwordRealm),
nsnull, nsnull, getter_AddRefs(uri));
if (NS_FAILED(result)) {
return;
}
nsCAutoString tempHost;
result = uri->GetHost(tempHost);
if (NS_FAILED(result)) {
return;
}
if (!strippedRealm.IsEmpty())
ioService->ExtractUrlPart(nsDependentCString(passwordRealm), nsIIOService::url_Host, strippedRealm);
if (!strippedRealm.IsEmpty()) {
si_RememberSignonData(dialog, strippedRealm.get(), signonData, window);
}
}
PRIVATE void
@ -2191,20 +2202,29 @@ si_RestoreSignonData(nsIPrompt* dialog, const char* passwordRealm, const PRUnich
}
PUBLIC void
SINGSIGN_RestoreSignonData(nsIPrompt* dialog, nsIURI* passwordRealm, const PRUnichar* name, PRUnichar** value, PRUint32 elementNumber) {
if (!passwordRealm)
return;
SINGSIGN_RestoreSignonData(nsIPrompt* dialog, const char* passwordRealm, const PRUnichar* name, PRUnichar** value, PRUint32 elementNumber) {
nsCAutoString strippedRealm;
nsCOMPtr<nsIIOService> ioService = do_GetService(NS_IOSERVICE_CONTRACTID);
if (!ioService) return;
/* Hacky security check: If address is of a scheme that
* doesn't support hostnames, we have no host to get the signon data from,
* so we must not attempt to restore the signon data (bug 159484) */
nsresult rv = passwordRealm->GetHost(strippedRealm);
if (NS_FAILED(rv))
return;
doesn't support hostnames, we have no host to get the signon data from,
so we must not attempt to restore the signon data (bug 159484)
*/
nsCOMPtr<nsIURI> uri;
nsresult result = ioService->NewURI(nsDependentCString(passwordRealm),
nsnull, nsnull, getter_AddRefs(uri));
if (NS_FAILED(result)) {
return;
}
nsCAutoString tempHost;
result = uri->GetHost(tempHost);
if (NS_FAILED(result)) {
return;
}
si_RestoreSignonData(dialog, strippedRealm.get(), name, value, elementNumber);
ioService->ExtractUrlPart(nsDependentCString(passwordRealm), nsIIOService::url_Host, strippedRealm);
si_RestoreSignonData(dialog, (char*)strippedRealm.get(), name, value, elementNumber);
}
/*

Просмотреть файл

@ -50,8 +50,6 @@
#include "nsIPref.h"
#include "nsIDOMWindowInternal.h"
class nsIURI;
/* Duplicates defines as in nsIPrompt.idl -- keep in sync! */
#define SINGSIGN_SAVE_PASSWORD_NEVER 0
#define SINGSIGN_SAVE_PASSWORD_FOR_SESSION 1
@ -80,7 +78,7 @@ extern void
SINGSIGN_SignonViewerReturn(const nsString& results);
extern void
SINGSIGN_RestoreSignonData(nsIPrompt* dialog, nsIURI* passwordRealm, const PRUnichar* name, PRUnichar** value, PRUint32 elementNumber);
SINGSIGN_RestoreSignonData(nsIPrompt* dialog, const char* passwordRealm, const PRUnichar* name, PRUnichar** value, PRUint32 elementNumber);
extern nsresult
SINGSIGN_PromptUsernameAndPassword
@ -162,7 +160,7 @@ SINGSIGN_ReencryptAll();
extern void
SINGSIGN_RememberSignonData
(nsIPrompt* dialog, nsIURI* uri, nsVoidArray * signonData, nsIDOMWindowInternal* window);
(nsIPrompt* dialog, const char* URLName, nsVoidArray * signonData, nsIDOMWindowInternal* window);
PR_END_EXTERN_C

Просмотреть файл

@ -3912,6 +3912,7 @@ WLLT_OnSubmit(nsIContent* currentForm, nsIDOMWindowInternal* window) {
nsCOMPtr<nsIDOMHTMLFormElement> currentFormNode(do_QueryInterface(currentForm));
/* get url name as ascii string */
nsCAutoString URLName;
nsAutoString strippedURLNameUCS2;
nsCOMPtr<nsIDocument> doc;
currentForm->GetDocument(*getter_AddRefs(doc));
@ -3923,6 +3924,7 @@ WLLT_OnSubmit(nsIContent* currentForm, nsIDOMWindowInternal* window) {
if (!docURL || wallet_IsFromCartman(docURL)) {
return;
}
(void)docURL->GetSpec(URLName);
wallet_GetHostFile(docURL, strippedURLNameUCS2);
nsCAutoString strippedURLNameUTF8 = NS_ConvertUCS2toUTF8(strippedURLNameUCS2);
@ -4125,7 +4127,7 @@ WLLT_OnSubmit(nsIContent* currentForm, nsIDOMWindowInternal* window) {
wwatch->GetNewPrompter(0, getter_AddRefs(dialog));
if (dialog) {
SINGSIGN_RememberSignonData(dialog, docURL, signonData, window);
SINGSIGN_RememberSignonData(dialog, (char*)URLName.get(), signonData, window);
}
}
PRInt32 count2 = signonData->Count();

Просмотреть файл

@ -40,7 +40,7 @@
#include "nsIComponentManager.h"
#include "nsIServiceManager.h"
#include "nsISupportsArray.h"
#include "nsNetUtil.h"
#include "nsIIOService.h"
#include "prmem.h"
#include "plstr.h"
@ -965,14 +965,13 @@ nsMessengerMigrator::Convert4XUri(const char *old_uri, PRBool for_news, const ch
nsXPIDLCString hostname;
nsXPIDLCString username;
nsCOMPtr<nsIURI> uri;
rv = NS_NewURI(getter_AddRefs(uri), nsDependentCString(old_uri));
nsCOMPtr<nsIIOService> ioService = do_GetService(NS_IOSERVICE_CONTRACTID);
if (!ioService) return NS_ERROR_FAILURE;
rv = ioService->ExtractUrlPart(nsDependentCString(old_uri), nsIIOService::url_Host, hostname);
if (NS_FAILED(rv)) return rv;
rv = uri->GetHost(hostname);
if (NS_FAILED(rv)) return rv;
rv = uri->GetUsername(username);
rv = ioService->ExtractUrlPart(nsDependentCString(old_uri), nsIIOService::url_Username, username);
if (NS_FAILED(rv)) return rv;
// in 4.x, mac and windows stored the URI as IMAP://<hostname>

Просмотреть файл

@ -178,10 +178,10 @@ nsresult nsMsgAttachment::DeleteAttachment()
nsresult rv;
PRBool isAFile = PR_FALSE;
nsCOMPtr<nsIFile> urlFile;
nsCOMPtr<nsILocalFile> urlFile(do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
if (NS_SUCCEEDED(rv))
{
rv = NS_GetFileFromURLSpec(mUrl, getter_AddRefs(urlFile));
NS_InitFileFromURLSpec(urlFile, mUrl);
if (NS_SUCCEEDED(rv))
{
PRBool bExists = PR_FALSE;

Просмотреть файл

@ -25,7 +25,6 @@
#include "nsIServiceManager.h"
#include "nsIZipReader.h"
#include "nsReadableUtils.h"
#include "nsURLHelper.h"
////////////////////////////////////////////////////////////////////////////////
@ -92,11 +91,11 @@ NS_IMETHODIMP
nsJARURI::SetSpec(const nsACString &aSpec)
{
nsresult rv;
nsCOMPtr<nsIIOService> ioServ(do_GetIOService(&rv));
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
if (NS_FAILED(rv)) return rv;
nsCAutoString scheme;
rv = ::ExtractURLScheme(aSpec, nsnull, nsnull, &scheme);
rv = serv->ExtractScheme(aSpec, scheme);
if (NS_FAILED(rv)) return rv;
if (strcmp("jar", scheme.get()) != 0)
@ -120,16 +119,16 @@ nsJARURI::SetSpec(const nsACString &aSpec)
begin.advance(4);
rv = ioServ->NewURI(Substring(begin, delim_begin), mCharsetHint.get(), nsnull, getter_AddRefs(mJARFile));
rv = serv->NewURI(Substring(begin, delim_begin), mCharsetHint.get(), nsnull, getter_AddRefs(mJARFile));
if (NS_FAILED(rv)) return rv;
// skip over any extra '/' chars
while (*delim_end == '/')
++delim_end;
rv = ::ResolveRelativePath(Substring(delim_end, end),
NS_LITERAL_CSTRING(""),
mJAREntry);
rv = serv->ResolveRelativePath(Substring(delim_end, end),
NS_LITERAL_CSTRING(""),
mJAREntry);
return rv;
}
@ -328,8 +327,11 @@ nsJARURI::Resolve(const nsACString &relativePath, nsACString &result)
{
nsresult rv;
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
if (NS_FAILED(rv)) return rv;
nsCAutoString scheme;
rv = ::ExtractURLScheme(relativePath, nsnull, nsnull, &scheme);
rv = serv->ExtractScheme(relativePath, scheme);
if (NS_SUCCEEDED(rv)) {
// then aSpec is absolute
result = relativePath;
@ -344,8 +346,8 @@ nsJARURI::Resolve(const nsACString &relativePath, nsACString &result)
path = "";
nsCAutoString resolvedEntry;
rv = ::ResolveRelativePath(relativePath, path,
resolvedEntry);
rv = serv->ResolveRelativePath(relativePath, path,
resolvedEntry);
if (NS_FAILED(rv)) return rv;
return FormatSpec(resolvedEntry, result);
@ -383,11 +385,13 @@ nsJARURI::GetJAREntry(nsACString &entryPath)
NS_IMETHODIMP
nsJARURI::SetJAREntry(const nsACString &entryPath)
{
nsresult rv;
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
if (NS_FAILED(rv)) return rv;
mJAREntry.Truncate();
return ::ResolveRelativePath(entryPath,
NS_LITERAL_CSTRING(""),
mJAREntry);
return serv->ResolveRelativePath(entryPath, NS_LITERAL_CSTRING(""), mJAREntry);
}
////////////////////////////////////////////////////////////////////////////////

Просмотреть файл

@ -6542,23 +6542,15 @@ nsPluginHostImpl::CreateTmpFileToPost(const char *postDataURL, char **pTmpFileNa
nsresult rv;
PRInt64 fileSize;
nsCAutoString filename;
// stat file == get size & convert file:///c:/ to c: if needed
nsCOMPtr<nsIFile> inFile;
rv = NS_GetFileFromURLSpec(nsDependentCString(postDataURL),
getter_AddRefs(inFile));
if (NS_FAILED(rv)) {
nsCOMPtr<nsILocalFile> localFile;
rv = NS_NewNativeLocalFile(nsDependentCString(postDataURL), PR_FALSE,
getter_AddRefs(localFile));
if (NS_FAILED(rv)) return rv;
inFile = localFile;
}
rv = inFile->GetFileSize(&fileSize);
if (NS_FAILED(rv)) return rv;
rv = inFile->GetNativePath(filename);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsILocalFile> inFile = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv);
if (NS_FAILED(rv) ||
(NS_FAILED(rv = NS_InitFileFromURLSpec(inFile, nsDependentCString(postDataURL))) &&
NS_FAILED(rv = inFile->InitWithNativePath(nsDependentCString(postDataURL)))) ||
NS_FAILED(rv = inFile->GetFileSize(&fileSize)) ||
NS_FAILED(rv = inFile->GetNativePath(filename))
)
return rv;
if (!LL_IS_ZERO(fileSize)) {
nsCOMPtr<nsIInputStream> inStream;
rv = NS_NewLocalFileInputStream(getter_AddRefs(inStream), inFile);

Просмотреть файл

@ -40,48 +40,33 @@
interface nsIProtocolHandler;
interface nsIChannel;
interface nsIURI;
interface nsIURLParser;
interface nsIFile;
/**
* nsIIOService provides a set of utility functions for necko. The interface
* duplicates many of the nsIProtocolHandler methods in a protocol handler
* independent way (e.g., NewURI sniffs the scheme to determine which protocol
* handler's NewURI should be invoked). nsIIOService also provides a set of
* URL parsing utility functions. These are provided to make the programmers
* job easier and in some cases to improve performance by eliminating
* intermediate data structures and interfaces.
*
* @status UNDER_REVIEW
*/
[scriptable, uuid(ab7c3a84-d488-11d3-8cda-0060b0fc14a3)]
interface nsIIOService : nsISupports
{
/*************************************************************************
* Protocol handler utilities
*/
/**
* Returns a protocol handler for a given URI scheme.
*
* @param aScheme the URI scheme
* @return reference to corresponding nsIProtocolHandler
* @param scheme URI scheme
* @return reference to nsIProtcolHandler
*/
nsIProtocolHandler getProtocolHandler(in string aScheme);
nsIProtocolHandler getProtocolHandler(in string scheme);
/**
* Returns the protocol flags for a given scheme.
*
* @param aScheme the URI scheme
* @return value of corresponding nsIProtocolHandler::protocolFlags
* @param scheme URI scheme
* @return returns unsigned long for protocol flags
*/
unsigned long getProtocolFlags(in string aScheme);
unsigned long getProtocolFlags(in string scheme);
/**
* This method constructs a new URI by first determining the scheme
* of the URI spec, and then delegating the construction of the URI
* to the protocol handler for that scheme. QueryInterface can be used
* on the resulting URI object to obtain a more specific type of URI.
*
* @see nsIProtocolHandler::newURI
*/
nsIURI newURI(in AUTF8String aSpec,
@ -89,23 +74,32 @@ interface nsIIOService : nsISupports
in nsIURI aBaseURI);
/**
* This method constructs a new URI from a nsIFile.
* This method constructs a new file URI
*
* @param aFile specifies the file path
* @param aFile nsIFile from which to make an URI from
* @return reference to a new nsIURI object
*/
nsIURI newFileURI(in nsIFile aFile);
/**
* Creates a channel for a given URI.
* Creates a channel for a given URI. The notificationCallbacks argument
* is used to obtain the appropriate callbacks for the URI's protocol
* from the application.
*
* @param aURI nsIURI from which to make a channel
* @return reference to the new nsIChannel object
* @param originalURI - Specifies the original URI which caused the
* creation of this channel. This can occur when the construction of
* one channel (e.g. for resource:) causes another channel to be created
* on its behalf (e.g. a file: channel), or if a redirect occurs,
* causing the current URL to become different from the original URL.
* If NULL, the aURI parameter will be used as the originalURI instead.
*
* @param aURI nsIURI to make a channel from
* @return a reference to the new nsIChannel object
*/
nsIChannel newChannelFromURI(in nsIURI aURI);
/**
* Equivalent to newChannelFromURI(newURI(...))
* Shortcut equivalent to newChannelFromURI(newURI(...))
*/
nsIChannel newChannel(in AUTF8String aSpec,
in string aOriginCharset,
@ -121,56 +115,91 @@ interface nsIIOService : nsISupports
attribute boolean offline;
/**
* Checks if a port number is banned. This involves consulting a black-
* list of port numbers corresponding to services that may be easily
* exploitable. If the given port is found on the black-list, then the
* protocol handler (corresponding to aScheme) will be asked if it wishes
* to override the IO service's decision to block the port. This gives
* the protocol handler ultimate control over its own security policy
* while ensuring reasonable, default protection.
* Checks if a port number is banned.
*
* @see nsIProtocolHandler::allowPort
* |allowPort| will check a list of "known-to-do-bad-things"
* port numbers. If the given port is found on the blacklist,
* |allowPort| will ask the protocol handler if it wishes to override.
* Scheme can be null.
*/
boolean allowPort(in long aPort, in string aScheme);
boolean allowPort(in long port, in string scheme);
/*************************************************************************
* URL parsing utilities
*
* The set of methods provided here is intentionally limited. Most of
* Necko's URL parsing functionality is provided via nsIURI. This is
* done to ensure a common point of access to URL parsing, which is
* protocol dependent. Do not try to parse a random URL string as the
* result will likely differ (perhaps only in some subtle way) from the
* value of the corresponding nsIURI attribute. Violating this rule
* may make your code vulnerable to various kinds of security exploits.
* DON'T RISK IT! --darin
*/
////////////////////////////////////////////////////////////////////////////
// URL parsing utilities
/**
* Utility to extract the scheme from a URL string, consistently and
* according to spec (see RFC 2396).
* Utility for protocol implementors -- extracts the scheme from a URL
* string, consistently and according to spec.
*
* @param aSpec the URL string to parse
* @return URL scheme
* @param urlString the URL string to parse
* @return scheme
*
* @throws NS_ERROR_MALFORMED_URI if URL string is not of the right form.
* @throws NS_ERROR_MALFORMED_URI if urlString is not of the right form.
*/
ACString extractScheme(in AUTF8String urlString);
/**
* Converts the nsIFile to the corresponding URL string. NOTE: under
* some platforms this is a lossy conversion (e.g., Mac Carbon build).
* If the nsIFile is a local file, then the result will be a file://
* URL string.
* returns the protocol specific URL parser
*/
nsIURLParser getParserForScheme(in string scheme);
/**
* @param urlString absolute URL path.
* @param flags combination of url_XXX flags.
*
* The resulting string may contain URL-escaped characters.
* @throws NS_ERROR_MALFORMED_URI if urlString is not of the right form.
*/
AUTF8String extractUrlPart(in AUTF8String urlString, in short flags);
/**
* Constants for the mask in the call to extractUrlPart
*
* XXX these should really be enumerated in left-to-right order!
*/
const short url_Scheme = (1<<0);
const short url_Username = (1<<1);
const short url_Password = (1<<2);
const short url_Host = (1<<3);
const short url_Directory = (1<<4);
const short url_FileBaseName = (1<<5);
const short url_FileExtension = (1<<6);
const short url_Param = (1<<7);
const short url_Query = (1<<8);
const short url_Ref = (1<<9);
const short url_Path = (1<<10);
const short url_Port = (1<<11);
/**
* Resolves a relative path string containing "." and ".."
* with respect to a base path (assumed to already be resolved).
* For example, resolving "../../foo/./bar/../baz.html" w.r.t.
* "/a/b/c/d/e/" yields "/a/b/c/foo/baz.html". Attempting to
* ascend above the base results in the NS_ERROR_MALFORMED_URI
* exception. If basePath is null, it treats it as "/".
*
* @param relativePath a relative URI
* @param basePath a base URI
*
* @return a new string, representing canonical uri
*/
AUTF8String resolveRelativePath(in AUTF8String relativePath,
in AUTF8String basePath);
/**
* conversions between nsILocalFile and a file url string
*/
/**
* gets a file:// url out of an nsIFile
* @param file the file to extract the path from
* @return a file:// style url string
*/
AUTF8String getURLSpecFromFile(in nsIFile file);
/**
* Converts the URL string into the corresponding nsIFile if possible.
* A local file will be created if the URL string begins with file://.
* Sets the native path of the file given the url string
* @param file the file to initialize with the given spec
* @param url the url string which will be used to initialize the file
*/
nsIFile getFileFromURLSpec(in AUTF8String url);
void initFileFromURLSpec(in nsIFile file, in AUTF8String url);
};

Просмотреть файл

@ -739,8 +739,8 @@ NS_NewProxyInfo(const char* type, const char* host, PRInt32 port, nsIProxyInfo*
}
inline nsresult
NS_GetFileFromURLSpec(const nsACString &inURL, nsIFile **result,
nsIIOService *ioService=nsnull)
NS_InitFileFromURLSpec(nsIFile* aFile, const nsACString &inURL,
nsIIOService *ioService=nsnull)
{
nsCOMPtr<nsIIOService> serv;
if (ioService == nsnull) {
@ -749,7 +749,7 @@ NS_GetFileFromURLSpec(const nsACString &inURL, nsIFile **result,
if (NS_FAILED(rv)) return rv;
ioService = serv.get();
}
return ioService->GetFileFromURLSpec(inURL, result);
return ioService->InitFileFromURLSpec(aFile, inURL);
}
inline nsresult

Просмотреть файл

@ -479,7 +479,8 @@ nsIOService::ExtractScheme(const nsACString &inURI, nsACString &scheme)
return ExtractURLScheme(inURI, nsnull, nsnull, &scheme);
}
NS_METHOD
/* nsIURLParser getParserForScheme (in string scheme); */
NS_IMETHODIMP
nsIOService::GetParserForScheme(const char *scheme, nsIURLParser **_retval)
{
nsresult rv;
@ -548,7 +549,6 @@ nsIOService::GetParserForScheme(const char *scheme, nsIURLParser **_retval)
return NS_OK;
}
#if 0
static inline void
ExtractUrlPart_Helper(const nsACString &src, PRUint32 pos, PRInt32 len, nsACString &result)
{
@ -706,7 +706,6 @@ nsIOService::ExtractUrlPart(const nsACString &urlString, PRInt16 flag, nsACStrin
}
return NS_OK;
}
#endif
NS_IMETHODIMP
nsIOService::GetProtocolFlags(const char* scheme, PRUint32 *flags)
@ -905,6 +904,77 @@ nsIOService::AllowPort(PRInt32 inPort, const char *scheme, PRBool *_retval)
*_retval = PR_TRUE;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////
// URL parsing utilities
NS_IMETHODIMP
nsIOService::ResolveRelativePath(const nsACString &relativePath, const nsACString &basePath,
nsACString &result)
{
nsCAutoString name;
nsCAutoString path(basePath);
PRBool needsDelim = PR_FALSE;
if ( !path.IsEmpty() ) {
PRUnichar last = path.Last();
needsDelim = !(last == '/' || last == '\\' );
}
nsACString::const_iterator beg, end;
relativePath.BeginReading(beg);
relativePath.EndReading(end);
PRBool stop = PR_FALSE;
char c;
for (; !stop; ++beg) {
c = (beg == end) ? '\0' : *beg;
//printf("%c [name=%s] [path=%s]\n", c, name.get(), path.get());
switch (c) {
case '\0':
case '#':
case ';':
case '?':
stop = PR_TRUE;
// fall through...
case '/':
case '\\':
// delimiter found
if (name.Equals("..")) {
// pop path
// If we already have the delim at end, then
// skip over that when searching for next one to the left
PRInt32 offset = path.Length() - (needsDelim ? 1 : 2);
PRInt32 pos = path.RFind("/", PR_FALSE, offset);
if (pos > 0)
path.Truncate(pos + 1);
else
return NS_ERROR_MALFORMED_URI;
}
else if (name.Equals(".") || name.Equals("")) {
// do nothing
}
else {
// append name to path
if (needsDelim)
path += "/";
path += name;
needsDelim = PR_TRUE;
}
name = "";
break;
default:
// append char to name
name += c;
}
}
// append anything left on relativePath (e.g. #..., ;..., ?...)
if (c != '\0')
path += Substring(--beg, end);
result = path;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

Просмотреть файл

@ -100,8 +100,6 @@ protected:
NS_METHOD CacheURLParser(const char *scheme,
nsIURLParser* hdlr);
NS_METHOD GetParserForScheme(const char *scheme, nsIURLParser **);
// Prefs wrangling
void PrefsChanged(nsIPrefBranch *prefs, const char *pref = nsnull);
void GetPrefBranch(nsIPrefBranch **);

Просмотреть файл

@ -110,13 +110,12 @@ nsIOService::GetURLSpecFromFile(nsIFile *aFile, nsACString &aURL)
}
NS_IMETHODIMP
nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
nsIOService::InitFileFromURLSpec(nsIFile *aFile, const nsACString &aURL)
{
nsresult rv;
NS_ENSURE_ARG(result);
nsCOMPtr<nsILocalFile> localFile(
do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
nsCOMPtr<nsILocalFile> localFile = do_QueryInterface(aFile, &rv);
if (NS_FAILED(rv)) {
NS_ERROR("Only nsILocalFile supported right now");
return rv;
@ -153,9 +152,5 @@ nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
path.Cut(0, 1);
// assuming path is encoded in the native charset
rv = localFile->InitWithNativePath(path);
if (NS_FAILED(rv)) return rv;
NS_ADDREF(*result = localFile);
return NS_OK;
return localFile->InitWithNativePath(path);
}

Просмотреть файл

@ -96,12 +96,11 @@ nsIOService::GetURLSpecFromFile(nsIFile *aFile, nsACString &result)
}
NS_IMETHODIMP
nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
nsIOService::InitFileFromURLSpec(nsIFile *aFile, const nsACString &aURL)
{
nsresult rv;
nsCOMPtr<nsILocalFile> localFile(
do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
nsCOMPtr<nsILocalFile> localFile = do_QueryInterface(aFile, &rv);
if (NS_FAILED(rv)) {
NS_ERROR("Only nsILocalFile supported right now");
return rv;
@ -134,11 +133,7 @@ nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
path.Cut(0, 1);
// assuming path is encoded in the native charset
rv = localFile->InitWithNativePath(path);
if (NS_FAILED(rv)) return rv;
NS_ADDREF(*result = localFile);
return NS_OK;
return localFile->InitWithNativePath(path);
}
static int isleadbyte(int c)

Просмотреть файл

@ -80,12 +80,11 @@ nsIOService::GetURLSpecFromFile(nsIFile *aFile, nsACString &result)
}
NS_IMETHODIMP
nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
nsIOService::InitFileFromURLSpec(nsIFile* aFile, const nsACString &aURL)
{
nsresult rv;
nsCOMPtr<nsILocalFile> localFile(
do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
nsCOMPtr<nsILocalFile> localFile = do_QueryInterface(aFile, &rv);
if (NS_FAILED(rv)) {
NS_ERROR("Only nsILocalFile supported right now");
return rv;
@ -108,9 +107,5 @@ nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
NS_UnescapeURL(path);
// assuming path is encoded in the native charset
rv = localFile->InitWithNativePath(path);
if (NS_FAILED(rv)) return rv;
NS_ADDREF(*result = localFile);
return NS_OK;
return localFile->InitWithNativePath(path);
}

Просмотреть файл

@ -93,12 +93,11 @@ nsIOService::GetURLSpecFromFile(nsIFile *aFile, nsACString &result)
}
NS_IMETHODIMP
nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
nsIOService::InitFileFromURLSpec(nsIFile *aFile, const nsACString &aURL)
{
nsresult rv;
nsCOMPtr<nsILocalFile> localFile(
do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
nsCOMPtr<nsILocalFile> localFile = do_QueryInterface(aFile, &rv);
if (NS_FAILED(rv)) {
NS_ERROR("Only nsILocalFile supported right now");
return rv;
@ -131,9 +130,5 @@ nsIOService::GetFileFromURLSpec(const nsACString &aURL, nsIFile **result)
path.Cut(0, 1);
// assuming path is encoded in the native charset
rv = localFile->InitWithNativePath(path);
if (NS_FAILED(rv)) return rv;
NS_ADDREF(*result = localFile);
return NS_OK;
return localFile->InitWithNativePath(path);
}

Просмотреть файл

@ -57,7 +57,6 @@
static NS_DEFINE_CID(kThisImplCID, NS_THIS_STANDARDURL_IMPL_CID);
static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID);
nsIIOService *nsStandardURL::gIOService = nsnull;
nsIURLParser *nsStandardURL::gNoAuthParser = nsnull;
nsIURLParser *nsStandardURL::gAuthParser = nsnull;
nsIURLParser *nsStandardURL::gStdParser = nsnull;
@ -365,13 +364,6 @@ nsStandardURL::InitGlobalObjects()
NS_ADDREF(gStdParser);
}
nsCOMPtr<nsIIOService> serv(do_GetIOService());
NS_ASSERTION(serv, "failed getting IO service");
if (serv) {
gIOService = serv.get();
NS_ADDREF(gIOService);
}
nsCOMPtr<nsIPrefService> prefService( do_GetService(NS_PREFSERVICE_CONTRACTID) );
if (prefService) {
nsCOMPtr<nsIPrefBranch> prefBranch;
@ -390,7 +382,6 @@ nsStandardURL::InitGlobalObjects()
void
nsStandardURL::ShutdownGlobalObjects()
{
NS_IF_RELEASE(gIOService);
NS_IF_RELEASE(gNoAuthParser);
NS_IF_RELEASE(gAuthParser);
NS_IF_RELEASE(gStdParser);
@ -2178,20 +2169,23 @@ nsStandardURL::GetFile(nsIFile **result)
return NS_ERROR_FAILURE;
}
nsresult rv = gIOService->GetFileFromURLSpec(mSpec, getter_AddRefs(mFile));
nsresult rv;
nsCOMPtr<nsILocalFile> localFile(do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv));
if (NS_FAILED(rv)) return rv;
rv = NS_InitFileFromURLSpec(localFile, mSpec);
if (NS_FAILED(rv)) return rv;
#if defined(PR_LOGGING)
if (LOG_ENABLED()) {
nsCAutoString path;
mFile->GetNativePath(path);
localFile->GetNativePath(path);
LOG(("nsStandardURL::GetFile [this=%p spec=%s resulting_path=%s]\n",
this, mSpec.get(), path.get()));
}
#endif
NS_ADDREF(*result = mFile);
return NS_OK;
return CallQueryInterface(localFile, result);
}
NS_IMETHODIMP
@ -2204,7 +2198,7 @@ nsStandardURL::SetFile(nsIFile *file)
nsresult rv;
nsCAutoString url;
rv = gIOService->GetURLSpecFromFile(file, url);
rv = NS_GetURLSpecFromFile(file, url);
if (NS_FAILED(rv)) return rv;
rv = SetSpec(url);

Просмотреть файл

@ -49,7 +49,6 @@
#include "nsIURLParser.h"
#include "nsIUnicodeEncoder.h"
#include "nsIObserver.h"
#include "nsIIOService.h"
#include "nsCOMPtr.h"
class nsIBinaryInputStream;
@ -240,7 +239,6 @@ private:
// global objects. don't use COMPtr as its destructor will cause a
// coredump if we leak it.
static nsIIOService *gIOService;
static nsIURLParser *gNoAuthParser;
static nsIURLParser *gAuthParser;
static nsIURLParser *gStdParser;

Просмотреть файл

@ -355,73 +355,3 @@ IsValidScheme(const char *scheme, PRUint32 schemeLen)
return PR_TRUE;
}
nsresult
ResolveRelativePath(const nsACString &relativePath,
const nsACString &basePath,
nsACString &result)
{
nsCAutoString name;
nsCAutoString path(basePath);
PRBool needsDelim = PR_FALSE;
if ( !path.IsEmpty() ) {
PRUnichar last = path.Last();
needsDelim = !(last == '/' || last == '\\' );
}
nsACString::const_iterator beg, end;
relativePath.BeginReading(beg);
relativePath.EndReading(end);
PRBool stop = PR_FALSE;
char c;
for (; !stop; ++beg) {
c = (beg == end) ? '\0' : *beg;
//printf("%c [name=%s] [path=%s]\n", c, name.get(), path.get());
switch (c) {
case '\0':
case '#':
case ';':
case '?':
stop = PR_TRUE;
// fall through...
case '/':
case '\\':
// delimiter found
if (name.Equals("..")) {
// pop path
// If we already have the delim at end, then
// skip over that when searching for next one to the left
PRInt32 offset = path.Length() - (needsDelim ? 1 : 2);
PRInt32 pos = path.RFind("/", PR_FALSE, offset);
if (pos > 0)
path.Truncate(pos + 1);
else
return NS_ERROR_MALFORMED_URI;
}
else if (name.Equals(".") || name.Equals("")) {
// do nothing
}
else {
// append name to path
if (needsDelim)
path += "/";
path += name;
needsDelim = PR_TRUE;
}
name = "";
break;
default:
// append char to name
name += c;
}
}
// append anything left on relativePath (e.g. #..., ;..., ?...)
if (c != '\0')
path += Substring(--beg, end);
result = path;
return NS_OK;
}

Просмотреть файл

@ -74,21 +74,4 @@ inline PRBool IsValidScheme(const nsAFlatCString &scheme)
return IsValidScheme(scheme.get(), scheme.Length());
}
/**
* Resolves a relative path string containing "." and ".."
* with respect to a base path (assumed to already be resolved).
* For example, resolving "../../foo/./bar/../baz.html" w.r.t.
* "/a/b/c/d/e/" yields "/a/b/c/foo/baz.html". Attempting to
* ascend above the base results in the NS_ERROR_MALFORMED_URI
* exception. If basePath is null, it treats it as "/".
*
* @param relativePath a relative URI
* @param basePath a base URI
*
* @return a new string, representing canonical uri
*/
nsresult ResolveRelativePath(const nsACString &relativePath,
const nsACString &basePath,
nsACString &result);
#endif

Просмотреть файл

@ -57,19 +57,6 @@
{0x93, 0x37, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40} \
}
// service implementing nsIURLParsingUtils.
#define NS_URLPARSINGUTILS_CLASSNAME \
"nsURLParsingUtils"
#define NS_URLPARSINGUTILS_CONTRACTID \
"@mozilla.org/network/url-parsing-utils;1"
#define NS_URLPARSINGUTILS_CID \
{ /* bb567799-182e-443f-8c01-d1f97ceb51c8 */ \
0xbb567799, \
0x182e, \
0x443f, \
{0x8c, 0x01, 0xd1, 0xf9, 0x7c, 0xeb, 0x51, 0xc8} \
}
// component implementing nsILoadGroup.
#define NS_LOADGROUP_CLASSNAME \
"nsLoadGroup"

Просмотреть файл

@ -598,10 +598,6 @@ static const nsModuleComponentInfo gNetModuleInfo[] = {
NS_IOSERVICE_CID,
NS_IOSERVICE_CONTRACTID,
nsIOService::Create },
{ NS_URLPARSINGUTILS_CLASSNAME,
NS_URLPARSINGUTILS_CID,
NS_URLPARSINGUTILS_CONTRACTID,
nsIOService::Create }, // yes, same class implements both services
{ "File Transport Service",
NS_FILETRANSPORTSERVICE_CID,
"@mozilla.org/network/file-transport-service;1",

Просмотреть файл

@ -45,9 +45,6 @@ CPPSRCS = \
nsJARURI.cpp \
$(NULL)
LOCAL_INCLUDES = \
-I$(srcdir)/../../../base/src
# we don't want the shared lib, but we want to force the creation of a
# static lib.
FORCE_STATIC_LIB = 1

Просмотреть файл

@ -25,7 +25,6 @@
#include "nsIServiceManager.h"
#include "nsIZipReader.h"
#include "nsReadableUtils.h"
#include "nsURLHelper.h"
////////////////////////////////////////////////////////////////////////////////
@ -92,11 +91,11 @@ NS_IMETHODIMP
nsJARURI::SetSpec(const nsACString &aSpec)
{
nsresult rv;
nsCOMPtr<nsIIOService> ioServ(do_GetIOService(&rv));
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
if (NS_FAILED(rv)) return rv;
nsCAutoString scheme;
rv = ::ExtractURLScheme(aSpec, nsnull, nsnull, &scheme);
rv = serv->ExtractScheme(aSpec, scheme);
if (NS_FAILED(rv)) return rv;
if (strcmp("jar", scheme.get()) != 0)
@ -120,16 +119,16 @@ nsJARURI::SetSpec(const nsACString &aSpec)
begin.advance(4);
rv = ioServ->NewURI(Substring(begin, delim_begin), mCharsetHint.get(), nsnull, getter_AddRefs(mJARFile));
rv = serv->NewURI(Substring(begin, delim_begin), mCharsetHint.get(), nsnull, getter_AddRefs(mJARFile));
if (NS_FAILED(rv)) return rv;
// skip over any extra '/' chars
while (*delim_end == '/')
++delim_end;
rv = ::ResolveRelativePath(Substring(delim_end, end),
NS_LITERAL_CSTRING(""),
mJAREntry);
rv = serv->ResolveRelativePath(Substring(delim_end, end),
NS_LITERAL_CSTRING(""),
mJAREntry);
return rv;
}
@ -328,8 +327,11 @@ nsJARURI::Resolve(const nsACString &relativePath, nsACString &result)
{
nsresult rv;
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
if (NS_FAILED(rv)) return rv;
nsCAutoString scheme;
rv = ::ExtractURLScheme(relativePath, nsnull, nsnull, &scheme);
rv = serv->ExtractScheme(relativePath, scheme);
if (NS_SUCCEEDED(rv)) {
// then aSpec is absolute
result = relativePath;
@ -344,8 +346,8 @@ nsJARURI::Resolve(const nsACString &relativePath, nsACString &result)
path = "";
nsCAutoString resolvedEntry;
rv = ::ResolveRelativePath(relativePath, path,
resolvedEntry);
rv = serv->ResolveRelativePath(relativePath, path,
resolvedEntry);
if (NS_FAILED(rv)) return rv;
return FormatSpec(resolvedEntry, result);
@ -383,11 +385,13 @@ nsJARURI::GetJAREntry(nsACString &entryPath)
NS_IMETHODIMP
nsJARURI::SetJAREntry(const nsACString &entryPath)
{
nsresult rv;
nsCOMPtr<nsIIOService> serv(do_GetIOService(&rv));
if (NS_FAILED(rv)) return rv;
mJAREntry.Truncate();
return ::ResolveRelativePath(entryPath,
NS_LITERAL_CSTRING(""),
mJAREntry);
return serv->ResolveRelativePath(entryPath, NS_LITERAL_CSTRING(""), mJAREntry);
}
////////////////////////////////////////////////////////////////////////////////

Просмотреть файл

@ -91,7 +91,14 @@ nsResURL::GetFile(nsIFile **result)
rv = gResHandler->ResolveURI(this, spec);
if (NS_FAILED(rv)) return rv;
return NS_GetFileFromURLSpec(spec, result, gResHandler->mIOService);
nsCOMPtr<nsILocalFile> localFile =
do_CreateInstance(NS_LOCAL_FILE_CONTRACTID, &rv);
if (NS_FAILED(rv)) return rv;
rv = NS_InitFileFromURLSpec(localFile, spec);
if (NS_FAILED(rv)) return rv;
return CallQueryInterface(localFile, result);
}
//----------------------------------------------------------------------------

Просмотреть файл

@ -62,8 +62,6 @@ private:
nsSupportsHashtable mSubstitutions;
nsCOMPtr<nsIIOService> mIOService;
friend class nsResURL;
};
#endif /* nsResProtocolHandler_h___ */

Просмотреть файл

@ -246,9 +246,9 @@ FileSystemDataSource::isDirURI(nsIRDFResource* source)
rv = source->GetValueConst(&uri);
if (NS_FAILED(rv)) return(PR_FALSE);
nsCOMPtr<nsIFile> aDir;
nsCOMPtr<nsILocalFile> aDir = do_CreateInstance(NS_LOCAL_FILE_CONTRACTID);
rv = NS_GetFileFromURLSpec(nsDependentCString(uri), getter_AddRefs(aDir));
rv = NS_InitFileFromURLSpec(aDir, nsDependentCString(uri));
if (NS_FAILED(rv)) return(PR_FALSE);
PRBool isDirFlag = PR_FALSE;

Просмотреть файл

@ -763,11 +763,10 @@ nsGlobalHistory::AddNewPageToDatabase(const char *aURL,
SetRowValue(row, kToken_LastVisitDateColumn, aDate);
SetRowValue(row, kToken_FirstVisitDateColumn, aDate);
nsCOMPtr<nsIURI> uri;
NS_NewURI(getter_AddRefs(uri), nsDependentCString(aURL), nsnull, nsnull);
nsCAutoString hostname;
if (uri)
uri->GetHost(hostname);
nsCOMPtr<nsIIOService> ioService = do_GetService(NS_IOSERVICE_CONTRACTID);
if (!ioService) return NS_ERROR_FAILURE;
ioService->ExtractUrlPart(nsDependentCString(aURL), nsIIOService::url_Host, hostname);
SetRowValue(row, kToken_HostnameColumn, hostname.get());

Просмотреть файл

@ -653,27 +653,18 @@ nsUrlbarHistory::VerifyAndCreateEntry(const PRUnichar * aSearchItem, const PRUni
searchStrLen = nsCRT::strlen(aSearchItem);
nsresult rv;
nsCOMPtr<nsIURI> uri;
NS_NewURI(getter_AddRefs(uri), NS_ConvertUCS2toUTF8(aSearchItem));
nsCAutoString filePath;
if (uri) {
nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
if (url)
url->GetFilePath(filePath);
}
nsCOMPtr<nsIIOService> ioService = do_GetService(NS_IOSERVICE_CONTRACTID);
if (!ioService) return NS_ERROR_FAILURE;
ioService->ExtractUrlPart(NS_ConvertUCS2toUTF8(aSearchItem), nsIIOService::url_Path, filePath);
// Don't bother checking for hostname if the search string
// already has a filepath;
if (filePath.Length() > 1) {
return NS_OK;
}
NS_NewURI(getter_AddRefs(uri), NS_ConvertUCS2toUTF8(aMatchStr));
if (uri) {
nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
if (url)
url->GetFilePath(filePath);
}
ioService->ExtractUrlPart(NS_ConvertUCS2toUTF8(aMatchStr), nsIIOService::url_Path, filePath);
// If the match string doesn't have a filepath
// we need to do nothing here, return.