From 85575847043353feb2a61537e1646f68af23eb80 Mon Sep 17 00:00:00 2001 From: "rjc%netscape.com" Date: Sat, 15 Dec 2001 01:59:50 +0000 Subject: [PATCH] Fix bugs 113745, 113742 and 114811: all regarding "moz-icon:". Fix up XP_MAC code to use Mac OS's Icon Services, and expose platform icons in file:/// display and search panel (and search preferences panel). Mixture of r/srs: sdagley, ben, and smfr --- .../decoders/icon/mac/nsIconChannel.cpp | 437 ++++++++++++------ .../libpr0n/decoders/icon/mac/nsIconChannel.h | 11 +- rdf/datasource/src/nsFileSystemDataSource.cpp | 82 +++- xpfe/browser/resources/content/navigator.xul | 10 +- .../resources/content/navigatorOverlay.xul | 7 +- xpfe/components/directory/directory.xul | 2 + .../resources/content/pref-search.xul | 4 +- .../search/resources/search-panel.xul | 1 + .../search/src/nsInternetSearchService.cpp | 37 +- 9 files changed, 418 insertions(+), 173 deletions(-) diff --git a/modules/libpr0n/decoders/icon/mac/nsIconChannel.cpp b/modules/libpr0n/decoders/icon/mac/nsIconChannel.cpp index 417d1269938..552d6670bd1 100644 --- a/modules/libpr0n/decoders/icon/mac/nsIconChannel.cpp +++ b/modules/libpr0n/decoders/icon/mac/nsIconChannel.cpp @@ -17,7 +17,8 @@ * All Rights Reserved. * * Contributor(s): - * Scott MacGregor + * Scott MacGregor + * Robert John Churchill */ @@ -39,7 +40,10 @@ #include "nsIFileChannel.h" #include +#include +#include #include +#include // nsIconChannel methods nsIconChannel::nsIconChannel() @@ -144,7 +148,7 @@ nsresult nsIconChannel::ExtractIconInfoFromUrl(nsIFile ** aLocalFile, PRUint32 * nsCOMPtr fileURI; rv = iconURI->GetIconFile(getter_AddRefs(fileURI)); - if (NS_FAILED(rv) || !fileURI) return NS_OK; + if (NS_FAILED(rv) || !fileURI) return NS_OK; nsCOMPtr fileURL = do_QueryInterface(fileURI, &rv); if (NS_FAILED(rv) || !fileURL) return NS_OK; @@ -162,176 +166,343 @@ nsresult nsIconChannel::ExtractIconInfoFromUrl(nsIFile ** aLocalFile, PRUint32 * return NS_OK; } +nsresult +nsIconChannel::GetLockedIconData(IconFamilyHandle iconFamilyH, PRUint32 iconType, + Handle iconDataH, PRUint32 *iconDataSize) +{ + *iconDataSize = 0; + + if (::GetIconFamilyData(iconFamilyH, iconType, iconDataH) != noErr) + return(NS_ERROR_FAILURE); + + *iconDataSize = (PRUint32)::GetHandleSize(iconDataH); + if (*iconDataSize > 0) + { + ::HLock(iconDataH); + } + return(NS_OK); +} + + +nsresult +nsIconChannel::GetLockedIcons(IconFamilyHandle icnFamily, PRUint32 desiredImageSize, + Handle iconH, PRUint32 *dataCount, PRBool *isIndexedData, + Handle iconMaskH, PRUint32 *maskCount) +{ + // note: this code could be improved by: + // + // o adding support for icon scaling, i.e. if we want a + // 32x32 icon but can only get a 16x16 icon (or vice versa), + // scale the pixels appropriately + // + // o adding support for Mac OS X "huge" 128x128 icons with alpha + // which is also tricky as the alpha data defines the mask for the icon + + *dataCount = *maskCount = 0L; + + // make sure icon/mask handles are unlocked + // so that they can move in memory + HUnlock(iconH); + HUnlock(iconMaskH); + + // Note: Always try and get 32bit non-indexed icons first + // so that we don't have to worry about color palette issues + nsresult rv = GetLockedIconData(icnFamily, (desiredImageSize > 16) ? + kLarge32BitData : kSmall32BitData, + iconH, dataCount); + if (NS_SUCCEEDED(rv) && (*dataCount > 0)) + { + *isIndexedData = PR_FALSE; + } + else + { + // if couldn't get a 32bit non-indexed icon, + // then try getting an 8-bit icon + rv = GetLockedIconData(icnFamily, (desiredImageSize > 16) ? + kLarge8BitData : kSmall8BitData, + iconH, dataCount); + if (NS_SUCCEEDED(rv) && (*dataCount > 0)) + { + *isIndexedData = PR_TRUE; + } + } + + // if we have an icon, try getting a mask too + if (NS_SUCCEEDED(rv) && (*dataCount > 0)) + { + // moz-icons are RGB_A1, so get 1-bit icon mask + rv = GetLockedIconData(icnFamily, (desiredImageSize > 16) ? + kLarge1BitMask : kSmall1BitMask, + iconMaskH, maskCount); + if (NS_FAILED(rv) || (*maskCount == 0)) + { + // if we can't get a mask, the file's BNDL might be + // messed up, etc. Let's just fake a 1-bit mask + // which will blit the entire icon... its not perfect, + // but its better than no icon at all + *maskCount = (desiredImageSize > 16) ? 256 : 64; + rv = NS_OK; + } + } + return(rv); +} + + NS_IMETHODIMP nsIconChannel::AsyncOpen(nsIStreamListener *aListener, nsISupports *ctxt) { - nsXPIDLCString contentType; - nsXPIDLCString fileExtension; nsCOMPtr localFile; // file we want an icon for - PRUint32 desiredImageSize; - nsresult rv = ExtractIconInfoFromUrl(getter_AddRefs(localFile), &desiredImageSize, getter_Copies(contentType), getter_Copies(fileExtension)); - - nsCOMPtr localFileMac (do_QueryInterface(localFile, &rv)); + nsXPIDLCString contentType; + nsXPIDLCString fileExtension; + PRUint32 desiredImageSize; + nsresult rv = ExtractIconInfoFromUrl(getter_AddRefs(localFile), &desiredImageSize, + getter_Copies(contentType), getter_Copies(fileExtension)); + if (NS_FAILED(rv)) return(rv); + + // ensure that we DO NOT resolve aliases, very important for file views + nsCOMPtr aFileLocal = do_QueryInterface(localFile); + if (aFileLocal) + { + aFileLocal->SetFollowLinks(PR_FALSE); + } - nsCOMPtr mimeService (do_GetService(NS_MIMESERVICE_CONTRACTID, &rv)); - NS_ENSURE_SUCCESS(rv, rv); - - // if the file exists, then just go ahead and use the creator and file types for the file. - PRUint32 macType; - PRUint32 macCreator; PRBool fileExists = PR_FALSE; if (localFile) { localFile->Exists(&fileExists); - if (fileExists) - { - OSType macostype; - OSType macOSCreatorType; - localFileMac->GetFileTypeAndCreator(&macostype, &macOSCreatorType); - macType = macostype; - macCreator = macOSCreatorType; - } } - - if (!fileExists) + + IconRef icnRef = nsnull; + if (fileExists) { + // if the file exists, first try getting icons via Icon Services + nsCOMPtr localFileMac (do_QueryInterface(localFile, &rv)); + if (NS_FAILED(rv)) return(rv); + + FSSpec spec; + if (NS_FAILED(localFileMac->GetResolvedFSSpec(&spec))) + return(NS_ERROR_FAILURE); + + SInt16 label; + if (::GetIconRefFromFile (&spec, &icnRef, &label) != noErr) + return(NS_ERROR_FAILURE); + } + + // note: once we have an IconRef, + // we MUST release it before exiting this method! + + // start with zero-sized icons which ::GetIconFamilyData will resize + PRUint32 dataCount = 0L, maskCount = 0L; + Handle iconH = ::NewHandle(dataCount); + Handle iconMaskH = ::NewHandle(maskCount); + if (!iconH || !iconMaskH) + { + // sigh; REALLY low-mem, bail + if (iconH) ::DisposeHandle(iconH); + if (iconMaskH) ::DisposeHandle(iconMaskH); + return(NS_ERROR_OUT_OF_MEMORY); + } + + PRUint8 *iconBitmapData = nsnull, *maskBitmapData = nsnull; + + PRBool isIndexedData = PR_FALSE; + IconFamilyHandle icnFamily; + if (fileExists && (::IconRefToIconFamily(icnRef, + kSelectorAllAvailableData, &icnFamily) == noErr)) + { + GetLockedIcons(icnFamily, desiredImageSize, iconH, &dataCount, + &isIndexedData, iconMaskH, &maskCount); + if (dataCount > 0) + { + iconBitmapData = (PRUint8 *)*iconH; + if (maskCount > 0) maskBitmapData = (PRUint8 *)*iconMaskH; + } + ::DisposeHandle((Handle)icnFamily); + } + ::ReleaseIconRef(icnRef); + icnRef = nsnull; + + if (!dataCount) + { + // if file didn't exist, or couldn't get an appropriate + // icon resource, then try again by mimetype mapping + + nsCOMPtr mimeService (do_GetService(NS_MIMESERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + // if we were given an explicit content type, use it.... - nsCOMPtr mimeInfo; - if (*contentType.get()) - { - mimeService->GetFromMIMEType(contentType, getter_AddRefs(mimeInfo)); - } - if (!mimeInfo) // try to grab an extension for the dummy file in the url. + nsCOMPtr mimeInfo; + if (mimeService) { + if (*contentType.get()) + { + mimeService->GetFromMIMEType(contentType, getter_AddRefs(mimeInfo)); + } + if (!mimeInfo) // try to grab an extension for the dummy file in the url. + { mimeService->GetFromExtension(fileExtension, getter_AddRefs(mimeInfo)); + } } - if (!mimeInfo) return NS_ERROR_FAILURE; // we don't have enough info to fetch an application icon. - - // get the mac creator and file type for this mime object + + // if we don't have enough info to fetch an application icon, bail + if (!mimeInfo) + { + if (iconH) ::DisposeHandle(iconH); + if (iconMaskH) ::DisposeHandle(iconMaskH); + return NS_ERROR_FAILURE; + } + + // get the mac creator and file type for this mime object + PRUint32 macType; + PRUint32 macCreator; mimeInfo->GetMacType(&macType); mimeInfo->GetMacCreator(&macCreator); + + if (::GetIconRef(kOnSystemDisk, macCreator, macType, &icnRef) != noErr) + { + if (iconH) ::DisposeHandle(iconH); + if (iconMaskH) ::DisposeHandle(iconMaskH); + return(NS_ERROR_FAILURE); + } + + if (::IconRefToIconFamily(icnRef, kSelectorAllAvailableData, &icnFamily) == noErr) + { + GetLockedIcons(icnFamily, desiredImageSize, iconH, &dataCount, + &isIndexedData, iconMaskH, &maskCount); + if (dataCount > 0) + { + iconBitmapData = (PRUint8 *)*iconH; + if (maskCount > 0) maskBitmapData = (PRUint8 *)*iconMaskH; + } + ::DisposeHandle((Handle)icnFamily); + } + ::ReleaseIconRef(icnRef); + icnRef = nsnull; } - - // get a refernce to the desktop database - DTPBRec pb; - OSErr err = noErr; - - memset(&pb, 0, sizeof(DTPBRec)); - pb.ioCompletion = nil; - pb.ioVRefNum = 0; // default desktop volume - pb.ioNamePtr = nil; - err = PBDTGetPath(&pb); - if (err != noErr) return NS_ERROR_FAILURE; - - pb.ioFileCreator = macCreator; - pb.ioFileType = macType; - pb.ioCompletion = nil; - pb.ioTagInfo = 0; - - PRUint32 numPixelsInRow = 0; - if (desiredImageSize > 16) + + // note: we must have icon data, but it is OK to not + // have maskBitmapData (we fake a mask in that case) + if (!iconBitmapData) { - pb.ioDTReqCount = kLarge8BitIconSize; - pb.ioIconType = kLarge8BitIcon; - numPixelsInRow = 32; + if (iconH) DisposeHandle(iconH); + if (iconMaskH) DisposeHandle(iconMaskH); + return(NS_ERROR_FAILURE); } - else - { - pb.ioDTReqCount = kSmall8BitIconSize; - pb.ioIconType = kSmall8BitIcon; - numPixelsInRow = 16; - } - - // allocate a buffer large enough to handle the icon - PRUint8 * bitmapData = (PRUint8 *) nsMemory::Alloc (pb.ioDTReqCount); - pb.ioDTBuffer = (Ptr) bitmapData; - - err = PBDTGetIcon(&pb, false); - if (err != noErr) return NS_ERROR_FAILURE; // unable to fetch the icon.... - + + PRUint32 numPixelsInRow = (desiredImageSize > 16) ? 32 : 16; + PRUint8 *bitmapData = (PRUint8 *)iconBitmapData; + nsCString iconBuffer; iconBuffer.Assign((char) numPixelsInRow); iconBuffer.Append((char) numPixelsInRow); - CTabHandle cTabHandle = GetCTable(72); - if (!cTabHandle) return NS_ERROR_FAILURE; - - HLock((Handle) cTabHandle); - CTabPtr colTable = *cTabHandle; + + CTabHandle cTabHandle = nsnull; + CTabPtr colTable = nsnull; + if (isIndexedData) + { + // only need the CTable if we have an palette-indexed icon + cTabHandle = ::GetCTable(72); + if (!cTabHandle) + { + if (iconH) ::DisposeHandle(iconH); + if (iconMaskH) ::DisposeHandle(iconMaskH); + return NS_ERROR_FAILURE; + } + ::HLock((Handle) cTabHandle); + colTable = *cTabHandle; + } + RGBColor rgbCol; PRUint8 redValue, greenValue, blueValue; - - for (PRUint32 index = 0; index < pb.ioDTReqCount; index ++) + PRUint32 index = 0L; + while (index < dataCount) { + if (!isIndexedData) + { + // 32 bit icon data + iconBuffer.Append((char) bitmapData[index++]); + iconBuffer.Append((char) bitmapData[index++]); + iconBuffer.Append((char) bitmapData[index++]); + iconBuffer.Append((char) bitmapData[index++]); + } + else + { + // each byte in bitmapData needs to be converted from an 8 bit system color into + // 24 bit RGB data which our special icon image decoder can understand. + ColorSpec colSpec = colTable->ctTable[ bitmapData[index]]; + rgbCol = colSpec.rgb; - // each byte in bitmapData needs to be converted from an 8 bit system color into - // 24 bit RGB data which our special icon image decoder can understand. - ColorSpec colSpec = colTable->ctTable[ bitmapData[index]]; - rgbCol = colSpec.rgb; - - redValue = rgbCol.red & 0xff; - greenValue = rgbCol.green & 0xff; - blueValue = rgbCol.blue & 0xff; - - // for some reason the image code on the mac expects each RGB pixel value to be padded with a preceding byte. - // so add the padding here.... - iconBuffer.Append((char) 0); - iconBuffer.Append((char) redValue); - iconBuffer.Append((char) greenValue); - iconBuffer.Append((char) blueValue); + redValue = rgbCol.red & 0xff; + greenValue = rgbCol.green & 0xff; + blueValue = rgbCol.blue & 0xff; + + iconBuffer.Append((char) 0); // alpha channel byte + iconBuffer.Append((char) redValue); + iconBuffer.Append((char) greenValue); + iconBuffer.Append((char) blueValue); + index++; + } } - - HUnlock((Handle) cTabHandle); - DisposeCTable(cTabHandle); - nsMemory::Free(bitmapData); - - // now that the color bitmask is taken care of, we need to do the same thing again for the transparency - // bit mask.... - if (desiredImageSize > 16) + if (cTabHandle) { - pb.ioDTReqCount = kLargeIconSize; - pb.ioIconType = kLargeIcon; + ::HUnlock((Handle) cTabHandle); + ::DisposeCTable(cTabHandle); + } + + ::DisposeHandle(iconH); + iconH = nsnull; + + bitmapData = (PRUint8 *)maskBitmapData; + if (maskBitmapData) + { + // skip over ICN# data to get to mask + // which is half way into data + index = maskCount/2; + while (index < maskCount) + { + iconBuffer.Append((char) bitmapData[index]); + iconBuffer.Append((char) bitmapData[index + 1]); + + if (numPixelsInRow == 32) + { + iconBuffer.Append((char) bitmapData[index + 2]); + iconBuffer.Append((char) bitmapData[index + 3]); + index += 4; + } + else + { + iconBuffer.Append((char) 255); // 2 bytes of padding + iconBuffer.Append((char) 255); + index += 2; + } + } } else { - pb.ioDTReqCount = kSmallIconSize; - pb.ioIconType = kSmallIcon; + index = 0L; + while (index++ < maskCount) + { + // edgecase: without a mask, just blit entire icon + iconBuffer.Append((char) 255); + } } - - // allocate a buffer large enough to handle the icon - bitmapData = (PRUint8 *) nsMemory::Alloc (pb.ioDTReqCount); - pb.ioDTBuffer = (Ptr) bitmapData; - err = PBDTGetIcon(&pb, false); - PRUint32 index = pb.ioDTReqCount/2; - while (index < pb.ioDTReqCount) + + if (iconMaskH) { - iconBuffer.Append((char) bitmapData[index]); - iconBuffer.Append((char) bitmapData[index + 1]); - if (numPixelsInRow == 32) - { - iconBuffer.Append((char) bitmapData[index + 2]); - iconBuffer.Append((char) bitmapData[index + 3]); - index += 4; - } - else - { - iconBuffer.Append((char) 255); // 2 bytes of padding - iconBuffer.Append((char) 255); - index += 2; - } + ::DisposeHandle(iconMaskH); + iconMaskH = nsnull; } - - nsMemory::Free(bitmapData); - + // turn our nsString into a stream looking object... aListener->OnStartRequest(this, ctxt); - // turn our string into a stream... - nsCOMPtr streamSupports; - NS_NewByteInputStream(getter_AddRefs(streamSupports), iconBuffer.get(), iconBuffer.Length()); + // turn our string into a stream... + nsCOMPtr streamSupports; + NS_NewByteInputStream(getter_AddRefs(streamSupports), iconBuffer.get(), iconBuffer.Length()); - nsCOMPtr inputStr (do_QueryInterface(streamSupports)); - aListener->OnDataAvailable(this, ctxt, inputStr, 0, iconBuffer.Length()); - aListener->OnStopRequest(this, ctxt, NS_OK); + nsCOMPtr inputStr (do_QueryInterface(streamSupports)); + aListener->OnDataAvailable(this, ctxt, inputStr, 0, iconBuffer.Length()); + aListener->OnStopRequest(this, ctxt, NS_OK); return NS_OK; } diff --git a/modules/libpr0n/decoders/icon/mac/nsIconChannel.h b/modules/libpr0n/decoders/icon/mac/nsIconChannel.h index 593d2fd736f..63d952aabea 100644 --- a/modules/libpr0n/decoders/icon/mac/nsIconChannel.h +++ b/modules/libpr0n/decoders/icon/mac/nsIconChannel.h @@ -26,6 +26,7 @@ #include "nsIInterfaceRequestor.h" #include "nsIInterfaceRequestorUtils.h" #include "nsIURI.h" +#include class nsIFile; @@ -51,7 +52,15 @@ protected: nsCOMPtr mOwner; nsresult mStatus; - nsresult ExtractIconInfoFromUrl(nsIFile ** aLocalFile, PRUint32 * aDesiredImageSize, char ** aContentType, char ** aFileExtension); + nsresult ExtractIconInfoFromUrl(nsIFile ** aLocalFile, PRUint32 * aDesiredImageSize, + char ** aContentType, char ** aFileExtension); + + nsresult GetLockedIconData(IconFamilyHandle iconFamilyH, PRUint32 iconType, + Handle iconDataH, PRUint32 *iconDataSize); + + nsresult GetLockedIcons(IconFamilyHandle iconFamily, PRUint32 desiredImageSize, + Handle iconH, PRUint32 *dataCount, PRBool *isIndexedData, + Handle iconMaskH, PRUint32 *maskCount); }; diff --git a/rdf/datasource/src/nsFileSystemDataSource.cpp b/rdf/datasource/src/nsFileSystemDataSource.cpp index 5e247baac99..e435f7dfb09 100644 --- a/rdf/datasource/src/nsFileSystemDataSource.cpp +++ b/rdf/datasource/src/nsFileSystemDataSource.cpp @@ -100,6 +100,8 @@ static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID); #endif +#define NS_MOZICON_SCHEME "moz-icon:" + static const char kURINC_FileSystemRoot[] = "NC:FilesRoot"; @@ -116,6 +118,7 @@ private: static nsIRDFResource *kNC_Child; static nsIRDFResource *kNC_Name; static nsIRDFResource *kNC_URL; + static nsIRDFResource *kNC_Icon; static nsIRDFResource *kNC_Length; static nsIRDFResource *kWEB_LastMod; static nsIRDFResource *kNC_FileSystemObject; @@ -156,7 +159,7 @@ public: static nsresult GetVolumeList(nsISimpleEnumerator **aResult); static nsresult GetFolderList(nsIRDFResource *source, PRBool allowHidden, PRBool onlyFirst, nsISimpleEnumerator **aResult); static nsresult GetName(nsIRDFResource *source, nsIRDFLiteral** aResult); - static nsresult GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult); + static nsresult GetURL(nsIRDFResource *source, PRBool *isFavorite, nsIRDFLiteral** aResult); static nsresult GetFileSize(nsIRDFResource *source, nsIRDFInt** aResult); static nsresult GetLastMod(nsIRDFResource *source, nsIRDFDate** aResult); @@ -186,6 +189,7 @@ nsIRDFResource *FileSystemDataSource::kNC_FileSystemRoot; nsIRDFResource *FileSystemDataSource::kNC_Child; nsIRDFResource *FileSystemDataSource::kNC_Name; nsIRDFResource *FileSystemDataSource::kNC_URL; +nsIRDFResource *FileSystemDataSource::kNC_Icon; nsIRDFResource *FileSystemDataSource::kNC_Length; nsIRDFResource *FileSystemDataSource::kWEB_LastMod; nsIRDFResource *FileSystemDataSource::kNC_FileSystemObject; @@ -315,6 +319,7 @@ FileSystemDataSource::FileSystemDataSource(void) gRDFService->GetResource(NC_NAMESPACE_URI "child", &kNC_Child); gRDFService->GetResource(NC_NAMESPACE_URI "Name", &kNC_Name); gRDFService->GetResource(NC_NAMESPACE_URI "URL", &kNC_URL); + gRDFService->GetResource(NC_NAMESPACE_URI "Icon", &kNC_Icon); gRDFService->GetResource(NC_NAMESPACE_URI "Content-Length", &kNC_Length); gRDFService->GetResource(WEB_NAMESPACE_URI "LastModifiedDate", &kWEB_LastMod); gRDFService->GetResource(NC_NAMESPACE_URI "FileSystemObject", &kNC_FileSystemObject); @@ -344,6 +349,7 @@ FileSystemDataSource::~FileSystemDataSource (void) NS_RELEASE(kNC_Child); NS_RELEASE(kNC_Name); NS_RELEASE(kNC_URL); + NS_RELEASE(kNC_Icon); NS_RELEASE(kNC_Length); NS_RELEASE(kWEB_LastMod); NS_RELEASE(kNC_FileSystemObject); @@ -479,13 +485,33 @@ FileSystemDataSource::GetTarget(nsIRDFResource *source, else if (property == kNC_URL) { nsCOMPtr url; - rv = GetURL(source, getter_AddRefs(url)); + rv = GetURL(source, nsnull, getter_AddRefs(url)); if (NS_FAILED(rv)) return(rv); if (!url) rv = NS_RDF_NO_VALUE; if (rv == NS_RDF_NO_VALUE) return(rv); return url->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target); } + else if (property == kNC_Icon) + { + nsCOMPtr url; + PRBool isFavorite = PR_FALSE; + rv = GetURL(source, &isFavorite, getter_AddRefs(url)); + if (NS_FAILED(rv)) return(rv); + if (isFavorite || !url) rv = NS_RDF_NO_VALUE; + if (rv == NS_RDF_NO_VALUE) return(rv); + + const PRUnichar *uni = nsnull; + url->GetValueConst(&uni); + if (!uni) return(NS_RDF_NO_VALUE); + nsAutoString urlStr; + urlStr.Assign(NS_LITERAL_STRING(NS_MOZICON_SCHEME).get()); + urlStr.Append(uni); + + rv = gRDFService->GetLiteral(urlStr.get(), getter_AddRefs(url)); + if (NS_FAILED(rv) || !url) return(NS_RDF_NO_VALUE); + return url->QueryInterface(NS_GET_IID(nsIRDFNode), (void**) target); + } else if (property == kNC_Length) { nsCOMPtr fileSize; @@ -659,7 +685,7 @@ FileSystemDataSource::GetTargets(nsIRDFResource *source, else if (property == kNC_URL) { nsCOMPtr url; - rv = GetURL(source, getter_AddRefs(url)); + rv = GetURL(source, nsnull, getter_AddRefs(url)); if (NS_FAILED(rv)) return rv; nsISimpleEnumerator* result = new nsSingletonEnumerator(url); @@ -827,23 +853,33 @@ FileSystemDataSource::HasArcIn(nsIRDFNode *aNode, nsIRDFResource *aArc, PRBool * NS_IMETHODIMP FileSystemDataSource::HasArcOut(nsIRDFResource *aSource, nsIRDFResource *aArc, PRBool *result) { - if (aSource == kNC_FileSystemRoot) { - *result = (aArc == kNC_Child || aArc == kNC_pulse); - } - else if (isFileURI(aSource)) { - if (aArc == kNC_pulse) { - *result = PR_TRUE; - } - else if (isDirURI(aSource)) { -#ifdef XP_WIN - *result = isValidFolder(aSource); -#else - *result = PR_TRUE; -#endif - } - } - else { *result = PR_FALSE; + + if (aSource == kNC_FileSystemRoot) + { + *result = (aArc == kNC_Child || aArc == kNC_pulse); + } + else if (isFileURI(aSource)) + { + if (aArc == kNC_pulse) + { + *result = PR_TRUE; + } + else if (isDirURI(aSource)) + { +#ifdef XP_WIN + *result = isValidFolder(aSource); +#else + *result = PR_TRUE; +#endif + } + else if (aArc == kNC_pulse || aArc == kNC_Name || aArc == kNC_Icon || + aArc == kNC_URL || aArc == kNC_Length || aArc == kWEB_LastMod || + aArc == kNC_FileSystemObject || aArc == kRDF_InstanceOf || + aArc == kRDF_type) + { + *result = PR_TRUE; + } } return NS_OK; } @@ -906,8 +942,6 @@ FileSystemDataSource::ArcLabelsOut(nsIRDFResource *source, array->AppendElement(kNC_pulse); } - array->AppendElement(kRDF_type); - nsISimpleEnumerator* result = new nsArrayEnumerator(array); if (! result) return NS_ERROR_OUT_OF_MEMORY; @@ -1610,8 +1644,10 @@ FileSystemDataSource::getIEFavoriteURL(nsIRDFResource *source, nsString aFileURL nsresult -FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) +FileSystemDataSource::GetURL(nsIRDFResource *source, PRBool *isFavorite, nsIRDFLiteral** aResult) { + if (isFavorite) *isFavorite = PR_FALSE; + nsresult rv; const char *uri; rv = source->GetValueConst(&uri); @@ -1625,6 +1661,7 @@ FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) { if (url.Find(ieFavoritesDir) == 0) { + if (isFavorite) *isFavorite = PR_TRUE; rv = getIEFavoriteURL(source, url, aResult); return(rv); } @@ -1637,6 +1674,7 @@ FileSystemDataSource::GetURL(nsIRDFResource *source, nsIRDFLiteral** aResult) { if (url.Find(netPositiveDir) == 0) { + if (isFavorite) *isFavorite = PR_TRUE; rv = getNetPositiveURL(source, url, aResult); return(rv); } diff --git a/xpfe/browser/resources/content/navigator.xul b/xpfe/browser/resources/content/navigator.xul index 2b8e285b45b..330f701474b 100644 --- a/xpfe/browser/resources/content/navigator.xul +++ b/xpfe/browser/resources/content/navigator.xul @@ -289,6 +289,8 @@ Contributor(s): ______________________________________. --> @@ -302,6 +304,8 @@ Contributor(s): ______________________________________. --> @@ -318,6 +322,8 @@ Contributor(s): ______________________________________. --> - diff --git a/xpfe/browser/resources/content/navigatorOverlay.xul b/xpfe/browser/resources/content/navigatorOverlay.xul index 6ea60fdeb10..dc4487adb90 100644 --- a/xpfe/browser/resources/content/navigatorOverlay.xul +++ b/xpfe/browser/resources/content/navigatorOverlay.xul @@ -309,6 +309,8 @@ rdf:type="http://home.netscape.com/NC-rdf#Folder"> @@ -319,7 +321,10 @@ - diff --git a/xpfe/components/directory/directory.xul b/xpfe/components/directory/directory.xul index aec5668ce9e..d8a90a7fb37 100644 --- a/xpfe/components/directory/directory.xul +++ b/xpfe/components/directory/directory.xul @@ -44,6 +44,8 @@ loading="rdf:http://home.netscape.com/NC-rdf#loading" > diff --git a/xpfe/components/prefwindow/resources/content/pref-search.xul b/xpfe/components/prefwindow/resources/content/pref-search.xul index e59974f4cc3..50a0eaac95c 100755 --- a/xpfe/components/prefwindow/resources/content/pref-search.xul +++ b/xpfe/components/prefwindow/resources/content/pref-search.xul @@ -45,7 +45,9 @@ diff --git a/xpfe/components/search/resources/search-panel.xul b/xpfe/components/search/resources/search-panel.xul index 95510588a4d..fcc554f7199 100644 --- a/xpfe/components/search/resources/search-panel.xul +++ b/xpfe/components/search/resources/search-panel.xul @@ -81,6 +81,7 @@ diff --git a/xpfe/components/search/src/nsInternetSearchService.cpp b/xpfe/components/search/src/nsInternetSearchService.cpp index 7c0638694d6..b020367f57d 100755 --- a/xpfe/components/search/src/nsInternetSearchService.cpp +++ b/xpfe/components/search/src/nsInternetSearchService.cpp @@ -3771,24 +3771,33 @@ InternetSearchDataSource::SaveEngineInfoIntoGraph(nsIFile *file, nsIFile *icon, if (!searchRes) return(NS_ERROR_UNEXPECTED); if (!categoryRes) return(NS_ERROR_UNEXPECTED); + nsAutoString iconURL; if (icon) { - nsXPIDLCString iconPath; - icon->GetPath(getter_Copies(iconPath)); - nsFileSpec iconSpec((const char *)iconPath); - nsFileURL iconFileURL(iconSpec); - nsAutoString iconURL; - iconURL.AssignWithConversion(iconFileURL.GetURLString()); + nsXPIDLCString iconFileURL; + if (NS_FAILED(rv = icon->GetURL(getter_Copies(iconFileURL)))) + return(rv); + iconURL.AssignWithConversion(iconFileURL); + } +#ifdef XP_MAC + else if (file) + { + nsXPIDLCString fileURL; + if (NS_FAILED(rv = file->GetURL(getter_Copies(fileURL)))) + return(rv); + iconURL.Assign(NS_LITERAL_STRING("moz-icon:")); + iconURL.AppendWithConversion(fileURL); + } +#endif - // save icon url (if we have one) - if (iconURL.Length() > 0) + // save icon url (if we have one) + if (iconURL.Length() > 0) + { + nsCOMPtr iconLiteral; + if (NS_SUCCEEDED(rv = gRDFService->GetLiteral(iconURL.get(), + getter_AddRefs(iconLiteral)))) { - nsCOMPtr iconLiteral; - if (NS_SUCCEEDED(rv = gRDFService->GetLiteral(iconURL.get(), - getter_AddRefs(iconLiteral)))) - { - updateAtom(mInner, searchRes, kNC_Icon, iconLiteral, nsnull); - } + updateAtom(mInner, searchRes, kNC_Icon, iconLiteral, nsnull); } }