18022, bookmark doc charset caching

r=rjc, ftang, a=ftang
This commit is contained in:
jbetak%netscape.com 2000-06-01 01:08:28 +00:00
parent 5f6d28e7e3
commit d5d399e4ba
10 changed files with 174 additions and 33 deletions

View File

@ -85,6 +85,8 @@ enum eParserDocType {
typedef enum {
kCharsetUninitialized = 0,
kCharsetFromWeakDocTypeDefault,
kCharsetFromCache,
kCharsetFromBookmarks,
kCharsetFromUserDefault ,
kCharsetFromDocTypeDefault,
kCharsetFromParentFrame,

View File

@ -85,6 +85,8 @@ enum eParserDocType {
typedef enum {
kCharsetUninitialized = 0,
kCharsetFromWeakDocTypeDefault,
kCharsetFromCache,
kCharsetFromBookmarks,
kCharsetFromUserDefault ,
kCharsetFromDocTypeDefault,
kCharsetFromParentFrame,

View File

@ -139,10 +139,15 @@ function UpdateBookmarksLastVisitedDate(event)
{
try
{
var wnd = document.commandDispatcher.focusedWindow;
if (window == wnd) wnd = window.content;
var docCharset = wnd.document.characterSet;
// if the URL is bookmarked, update its "Last Visited" date
var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
if (bmks) bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
if (bmks) bmks.UpdateBookmarkLastVisitedDate(window.content.location.href);
if (bmks) bmks.UpdateBookmarkLastVisitedDate(window.content.location.href, docCharset);
}
catch(ex)
{
@ -879,12 +884,17 @@ function RevealSearchPanel()
function BrowserAddBookmark(url,title)
{
var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
var wnd = document.commandDispatcher.focusedWindow;
if (window == wnd) wnd = window.content;
var docCharset = wnd.document.characterSet;
bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
if ((title == null) || (title == ""))
{
title = url;
}
bmks.AddBookmark(url, title, bmks.BOOKMARK_DEFAULT_TYPE);
bmks.AddBookmark(url, title, bmks.BOOKMARK_DEFAULT_TYPE, docCharset);
dump("BrowserAddBookmark: " + docCharset + "\n");
}
// Set up a lame hack to avoid opening two bookmarks.

View File

@ -37,9 +37,11 @@ interface nsIBookmarksService : nsISupports
void ReadBookmarks();
boolean IsBookmarked(in string aURI);
void AddBookmark(in string aURI, in wstring aTitle, in long bmType);
void UpdateBookmarkLastVisitedDate(in string aURL);
void AddBookmark(in string aURI, in wstring aTitle, in long bmType, in wstring docCharset);
void UpdateBookmarkLastVisitedDate(in string aURL, in wstring docCharset);
string FindShortcut(in wstring aName);
wstring GetLastCharset(in string aURI);
};
%{C++

View File

@ -149,7 +149,7 @@ function saveFind()
var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
if (bmks) bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
if (bmks) bmks.AddBookmark(searchURL, searchTitle, bmks.BOOKMARK_FIND_TYPE);
if (bmks) bmks.AddBookmark(searchURL, searchTitle, bmks.BOOKMARK_FIND_TYPE, null);
return(true);
}

View File

@ -142,6 +142,7 @@ static const char kBookmarkCommand[] = "http://home.netscape.com/NC
PRInt32 gRefCnt;
nsIRDFService *gRDF;
nsIRDFContainerUtils *gRDFC;
nsICharsetAlias* gCharsetAlias;
nsIRDFResource *kNC_Bookmark;
nsIRDFResource *kNC_BookmarkSeparator;
@ -168,6 +169,7 @@ nsIRDFResource *kWEB_Status;
nsIRDFResource *kWEB_LastPingDate;
nsIRDFResource *kWEB_LastPingETag;
nsIRDFResource *kWEB_LastPingModDate;
nsIRDFResource *kWEB_LastCharset;
nsIRDFResource *kWEB_LastPingContentLen;
nsIRDFResource *kNC_Parent;
@ -205,6 +207,13 @@ bm_AddRefGlobals()
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get RDF container utils");
if (NS_FAILED(rv)) return rv;
rv = nsServiceManager::GetService(kCharsetAliasCID,
NS_GET_IID(nsICharsetAlias),
(nsISupports**) &gCharsetAlias);
NS_ASSERTION(NS_SUCCEEDED(rv), "unable to get charset alias service");
if (NS_FAILED(rv)) return rv;
gRDF->GetResource(kURINC_BookmarksRoot, &kNC_BookmarksRoot);
gRDF->GetResource(kURINC_IEFavoritesRoot, &kNC_IEFavoritesRoot);
gRDF->GetResource(kURINC_NewBookmarkFolder, &kNC_NewBookmarkFolder);
@ -227,6 +236,7 @@ bm_AddRefGlobals()
gRDF->GetResource(WEB_NAMESPACE_URI "LastModifiedDate", &kWEB_LastModifiedDate);
gRDF->GetResource(WEB_NAMESPACE_URI "LastVisitDate", &kWEB_LastVisitDate);
gRDF->GetResource(WEB_NAMESPACE_URI "LastCharset", &kWEB_LastCharset);
gRDF->GetResource(WEB_NAMESPACE_URI "Schedule", &kWEB_Schedule);
gRDF->GetResource(WEB_NAMESPACE_URI "status", &kWEB_Status);
@ -271,6 +281,12 @@ bm_ReleaseGlobals()
gRDFC = nsnull;
}
if (gCharsetAlias)
{
nsServiceManager::ReleaseService(kCharsetAliasCID, gCharsetAlias);
gCharsetAlias = nsnull;
}
NS_IF_RELEASE(kNC_Bookmark);
NS_IF_RELEASE(kNC_BookmarkSeparator);
NS_IF_RELEASE(kNC_BookmarkAddDate);
@ -291,14 +307,15 @@ bm_ReleaseGlobals()
NS_IF_RELEASE(kRDF_nextVal);
NS_IF_RELEASE(kWEB_LastModifiedDate);
NS_IF_RELEASE(kWEB_LastVisitDate);
NS_IF_RELEASE(kNC_Parent);
NS_IF_RELEASE(kWEB_Schedule);
NS_IF_RELEASE(kWEB_Status);
NS_IF_RELEASE(kWEB_LastPingDate);
NS_IF_RELEASE(kWEB_LastPingETag);
NS_IF_RELEASE(kWEB_LastPingModDate);
NS_IF_RELEASE(kWEB_LastPingContentLen);
NS_IF_RELEASE(kNC_Parent);
NS_IF_RELEASE(kWEB_LastCharset);
NS_IF_RELEASE(kNC_BookmarkCommand_NewBookmark);
NS_IF_RELEASE(kNC_BookmarkCommand_NewFolder);
NS_IF_RELEASE(kNC_BookmarkCommand_NewSeparator);
@ -391,7 +408,8 @@ public:
PRInt32 aLastModifiedDate,
const char* aShortcutURL,
nsIRDFResource* aNodeType,
nsIRDFResource** bookmarkNode);
nsIRDFResource** bookmarkNode,
const PRUnichar* aCharset);
nsresult SetIEFavoritesRoot(const char *IEFavoritesRootURL)
{
@ -535,6 +553,7 @@ static const char kTargetEquals[] = "TARGET=\"";
static const char kAddDateEquals[] = "ADD_DATE=\"";
static const char kLastVisitEquals[] = "LAST_VISIT=\"";
static const char kLastModifiedEquals[] = "LAST_MODIFIED=\"";
static const char kLastCharsetEquals[] = "LAST_CHARSET=\"";
static const char kShortcutURLEquals[] = "SHORTCUTURL=\"";
static const char kScheduleEquals[] = "SCHEDULE=\"";
static const char kLastPingEquals[] = "LAST_PING=\"";
@ -908,11 +927,10 @@ BookmarkParser::ParseMetaTag(const nsString &aLine, nsIUnicodeDecoder **decoder)
content.Mid(charset, start, content.Length() - start);
if (charset.Length() < 1) return(NS_ERROR_UNEXPECTED);
NS_WITH_SERVICE(nsICharsetAlias, calias, kCharsetAliasCID, &rv);
if (NS_SUCCEEDED(rv) && (calias))
if (gCharsetAlias)
{
nsAutoString charsetName;
if (NS_SUCCEEDED(rv = calias->GetPreferred(charset, charsetName)))
if (NS_SUCCEEDED(rv = gCharsetAlias->GetPreferred(charset, charsetName)))
{
if (charsetName.Length() > 0)
{
@ -1044,16 +1062,31 @@ BookmarkParser::ParseBookmark(const nsString &aLine, const nsCOMPtr<nsIRDFContai
}
}
// 7. Parse the shortcut URL (and always lowercase them before storing internally)
// 7. Parse the last doc charset
PRUnichar* docCharset = nsnull;
{
nsAutoString s;
ParseAttribute(aLine, kLastCharsetEquals, sizeof(kLastCharsetEquals) - 1, s);
if ((s.Length() > 0) && gCharsetAlias)
{
nsresult rv = gCharsetAlias->GetPreferred(s, s);
if (NS_SUCCEEDED(rv) && (s.Length()>0))
docCharset = s.ToNewUnicode();
}
}
// 8. Parse the shortcut URL (and always lowercase them before storing internally)
nsAutoString shortcut;
ParseAttribute(aLine, kShortcutURLEquals, sizeof(kShortcutURLEquals) -1, shortcut);
shortcut.ToLowerCase();
// 8. Parse the schedule
// 9. Parse the schedule
nsAutoString schedule;
ParseAttribute(aLine, kScheduleEquals, sizeof(kScheduleEquals) -1, schedule);
// 9. Parse the last ping date
// 10. Parse the last ping date
PRInt32 lastPingDate = 0;
{
nsAutoString s;
@ -1064,19 +1097,19 @@ BookmarkParser::ParseBookmark(const nsString &aLine, const nsCOMPtr<nsIRDFContai
}
}
// 10. Parse the ping ETag
// 11. Parse the ping ETag
nsAutoString pingETag;
ParseAttribute(aLine, kPingETagEquals, sizeof(kPingETagEquals) -1, pingETag);
// 11. Parse the ping LastMod date
// 12. Parse the ping LastMod date
nsAutoString pingLastMod;
ParseAttribute(aLine, kPingLastModEquals, sizeof(kPingLastModEquals) -1, pingLastMod);
// 12. Parse the Ping Content Length
// 13. Parse the Ping Content Length
nsAutoString pingContentLength;
ParseAttribute(aLine, kPingContentLenEquals, sizeof(kPingContentLenEquals) -1, pingContentLength);
// 13. Parse the Ping Status
// 14. Parse the Ping Status
nsAutoString pingStatus;
ParseAttribute(aLine, kPingStatusEquals, sizeof(kPingStatusEquals) -1, pingStatus);
@ -1094,7 +1127,7 @@ BookmarkParser::ParseBookmark(const nsString &aLine, const nsCOMPtr<nsIRDFContai
char *cShortcutURL = shortcut.ToNewCString(); // Note: can be null
rv = AddBookmark(aContainer, cURL, name.GetUnicode(), addDate, lastVisitDate,
lastModifiedDate, cShortcutURL, nodeType, bookmarkNode);
lastModifiedDate, cShortcutURL, nodeType, bookmarkNode, docCharset);
if (NS_SUCCEEDED(rv))
{
@ -1214,8 +1247,7 @@ BookmarkParser::ParseBookmark(const nsString &aLine, const nsCOMPtr<nsIRDFContai
}
// Now create the bookmark
// Now create the bookmark
nsresult
BookmarkParser::AddBookmark(nsCOMPtr<nsIRDFContainer> aContainer,
const char* aURL,
@ -1225,7 +1257,8 @@ BookmarkParser::AddBookmark(nsCOMPtr<nsIRDFContainer> aContainer,
PRInt32 aLastModifiedDate,
const char* aShortcutURL,
nsIRDFResource* aNodeType,
nsIRDFResource** bookmarkNode)
nsIRDFResource** bookmarkNode,
const PRUnichar* aCharset)
{
nsresult rv;
nsAutoString fullURL; fullURL.AssignWithConversion(aURL);
@ -1299,6 +1332,23 @@ BookmarkParser::AddBookmark(nsCOMPtr<nsIRDFContainer> aContainer,
AssertTime(bookmark, kWEB_LastVisitDate, aLastVisitDate);
AssertTime(bookmark, kWEB_LastModifiedDate, aLastModifiedDate);
if ((nsnull != aCharset) && (*aCharset != PRUnichar('\0')))
{
nsCOMPtr<nsIRDFLiteral> charsetliteral;
if (NS_FAILED(rv = gRDF->GetLiteral(aCharset, getter_AddRefs(charsetliteral))))
{
NS_ERROR("unable to create literal for bookmark document charset");
}
if (NS_SUCCEEDED(rv))
{
rv = mDataSource->Assert(bookmark, kWEB_LastCharset, charsetliteral, PR_TRUE);
if (rv != NS_RDF_ASSERTION_ACCEPTED)
{
NS_ERROR("unable to set bookmark document charset");
}
}
}
if ((nsnull != aShortcutURL) && (*aShortcutURL != '\0'))
{
nsCOMPtr<nsIRDFLiteral> shortcutLiteral;
@ -1328,7 +1378,6 @@ BookmarkParser::AddBookmark(nsCOMPtr<nsIRDFContainer> aContainer,
}
nsresult
BookmarkParser::ParseBookmarkHeader(const nsString &aLine,
const nsCOMPtr<nsIRDFContainer> &aContainer,
@ -2209,7 +2258,6 @@ void
nsBookmarksService::FireTimer(nsITimer* aTimer, void* aClosure)
{
nsBookmarksService *bmks = NS_STATIC_CAST(nsBookmarksService *, aClosure);
nsresult rv;
if (!bmks) return;
if ((bmks->mBookmarksAvailable == PR_TRUE) && (bmks->mDirty == PR_TRUE))
@ -2219,6 +2267,7 @@ nsBookmarksService::FireTimer(nsITimer* aTimer, void* aClosure)
if (bmks->busySchedule == PR_FALSE)
{
nsresult rv;
nsCOMPtr<nsIRDFResource> bookmark;
if (NS_SUCCEEDED(rv = bmks->GetBookmarkToPing(getter_AddRefs(bookmark))) && (bookmark))
{
@ -2763,16 +2812,20 @@ NS_IMPL_QUERY_INTERFACE6(nsBookmarksService,
NS_IMETHODIMP
nsBookmarksService::AddBookmark(const char *aURI, const PRUnichar *aOptionalTitle, PRInt32 bmType)
nsBookmarksService::AddBookmark(const char *aURI,
const PRUnichar *aOptionalTitle,
PRInt32 bmType,
const PRUnichar *aCharset)
{
// XXX Constructing a parser object to do this is bad.
// We need to factor AddBookmark() into its own little
// routine or something.
nsresult rv;
BookmarkParser parser;
parser.Init(nsnull, mInner, mPersonalToolbarName);
nsresult rv;
nsCOMPtr<nsIRDFContainer> container;
rv = nsComponentManager::CreateInstance(kRDFContainerCID,
@ -2808,14 +2861,15 @@ nsBookmarksService::AddBookmark(const char *aURI, const PRUnichar *aOptionalTitl
LL_L2I(now32, now64);
rv = parser.AddBookmark(container, aURI, aOptionalTitle, now32,
0L, 0L, nsnull, kNC_Bookmark, nsnull);
0L, 0L, nsnull, kNC_Bookmark, nsnull, aCharset);
if (NS_FAILED(rv)) return(rv);
mDirty = PR_TRUE;
Flush();
return(NS_OK);
return(NS_OK);
}
@ -2863,9 +2917,50 @@ nsBookmarksService::IsBookmarked(const char *aURI, PRBool *isBookmarkedFlag)
}
NS_IMETHODIMP
nsBookmarksService::GetLastCharset(const char *aURI, PRUnichar **aLastCharset)
{
if (!aURI) return(NS_ERROR_UNEXPECTED);
if (!mInner) return(NS_ERROR_UNEXPECTED);
NS_PRECONDITION(aLastCharset != nsnull, "null ptr");
if (!aLastCharset) return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsIRDFResource> bookmark;
nsresult rv = nsnull;
if (NS_SUCCEEDED(rv = gRDF->GetResource(aURI, getter_AddRefs(bookmark) )))
{
PRBool isBookmark = PR_FALSE;
// Note: always use mInner!! Otherwise, could get into an infinite loop
// due to Assert/Change calling UpdateBookmarkLastModifiedDate()
if (NS_SUCCEEDED(rv = mInner->HasAssertion(bookmark, kRDF_type, kNC_Bookmark,
PR_TRUE, &isBookmark)) && (isBookmark == PR_TRUE))
{
nsCOMPtr<nsIRDFNode> lastCharactersetNode;
if (NS_SUCCEEDED(rv = mInner->GetTarget(bookmark, kWEB_LastCharset, PR_TRUE,
getter_AddRefs(lastCharactersetNode))) && (rv != NS_RDF_NO_VALUE))
{
nsCOMPtr<nsIRDFLiteral> charsetLiteral = do_QueryInterface(lastCharactersetNode);
if (!charsetLiteral) return(NS_ERROR_NO_INTERFACE);
if (NS_FAILED(rv = charsetLiteral->GetValue(aLastCharset))) return(rv);
if (!*aLastCharset) return(NS_ERROR_NULL_POINTER);
return(NS_OK);
}
}
}
*aLastCharset = nsnull;
return NS_RDF_NO_VALUE;
}
NS_IMETHODIMP
nsBookmarksService::UpdateBookmarkLastVisitedDate(const char *aURL)
nsBookmarksService::UpdateBookmarkLastVisitedDate(const char *aURL, const PRUnichar *aCharset)
{
nsCOMPtr<nsIRDFResource> bookmark;
nsresult rv;
@ -2896,6 +2991,31 @@ nsBookmarksService::UpdateBookmarkLastVisitedDate(const char *aURL)
rv = mInner->Assert(bookmark, kWEB_LastVisitDate, now, PR_TRUE);
}
//piggy-backing last charset...
if ((nsnull != aCharset) && (*aCharset != PRUnichar('\0')))
{
nsCOMPtr<nsIRDFLiteral> charsetliteral;
if (NS_FAILED(rv = gRDF->GetLiteral(aCharset, getter_AddRefs(charsetliteral))))
{
NS_ERROR("unable to create literal for bookmark document charset");
}
if (NS_SUCCEEDED(rv))
{
nsCOMPtr<nsIRDFNode> lastCharacterset;
if (NS_SUCCEEDED(rv = mInner->GetTarget(bookmark, kWEB_LastCharset, PR_TRUE,
getter_AddRefs(lastCharacterset))) && (rv != NS_RDF_NO_VALUE))
{
rv = mInner->Change(bookmark, kWEB_LastCharset, lastCharacterset, charsetliteral);
}
else
{
rv = mInner->Assert(bookmark, kWEB_LastCharset, charsetliteral, PR_TRUE);
}
}
}
// also update bookmark's "status"!
nsCOMPtr<nsIRDFNode> currentStatusNode;
if (NS_SUCCEEDED(rv = mInner->GetTarget(bookmark, kWEB_Status, PR_TRUE,
@ -2907,6 +3027,8 @@ nsBookmarksService::UpdateBookmarkLastVisitedDate(const char *aURL)
// mDirty = PR_TRUE;
}
}
}
return(rv);
@ -4554,6 +4676,9 @@ nsBookmarksService::WriteBookmarksContainer(nsIRDFDataSource *ds, nsOutputFileSt
// output PING_LAST_MODIFIED
WriteBookmarkProperties(ds, strm, child, kWEB_LastPingModDate, kPingLastModEquals, PR_FALSE);
// output LAST_CHARSET
WriteBookmarkProperties(ds, strm, child, kWEB_LastCharset, kLastCharsetEquals, PR_FALSE);
// output PING_CONTENT_LEN
WriteBookmarkProperties(ds, strm, child, kWEB_LastPingContentLen, kPingContentLenEquals, PR_FALSE);

View File

@ -99,7 +99,7 @@ var browserRemoteControl = {
if ( !aURL ) return(false);
if ( aTitle )
{
bookmarkService.AddBookmark(aURL, aTitle, bookmarkService.BOOKMARK_DEFAULT_TYPE );
bookmarkService.AddBookmark(aURL, aTitle, bookmarkService.BOOKMARK_DEFAULT_TYPE, null );
}
else
{

View File

@ -87,7 +87,7 @@ function saveSearch()
var bmks = Components.classes["component://netscape/browser/bookmarks-service"].getService();
if (bmks) bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
if (bmks) bmks.AddBookmark(searchURL, searchTitle, bmks.BOOKMARK_FIND_TYPE);
if (bmks) bmks.AddBookmark(searchURL, searchTitle, bmks.BOOKMARK_FIND_TYPE, null);
return(true);
}

View File

@ -97,7 +97,7 @@ function saveSearch()
if (bmks) bmks = bmks.QueryInterface(Components.interfaces.nsIBookmarksService);
var searchTitle = "Search: '" + gText + "' using " + gSites;
if (bmks) bmks.AddBookmark(searchURL, searchTitle, bmks.BOOKMARK_SEARCH_TYPE);
if (bmks) bmks.AddBookmark(searchURL, searchTitle, bmks.BOOKMARK_SEARCH_TYPE, null);
return(true);
}

View File

@ -1002,7 +1002,7 @@ function saveSearch()
if( !textNode ) return(false);
var searchTitle = "Search: '" + lastSearchText + "'"; // using " + gSites;
if (bmks) bmks.AddBookmark(lastSearchURI, searchTitle, bmks.BOOKMARK_SEARCH_TYPE);
if (bmks) bmks.AddBookmark(lastSearchURI, searchTitle, bmks.BOOKMARK_SEARCH_TYPE, null);
return(true);
}