From d5d399e4baf5ba289d16c036637806640ef42d64 Mon Sep 17 00:00:00 2001 From: "jbetak%netscape.com" Date: Thu, 1 Jun 2000 01:08:28 +0000 Subject: [PATCH] 18022, bookmark doc charset caching r=rjc, ftang, a=ftang --- htmlparser/src/nsIParser.h | 2 + parser/htmlparser/src/nsIParser.h | 2 + xpfe/browser/resources/content/navigator.js | 14 +- .../bookmarks/public/nsIBookmarksService.idl | 6 +- .../components/bookmarks/resources/bm-find.js | 2 +- .../bookmarks/src/nsBookmarksService.cpp | 173 +++++++++++++++--- xpfe/components/remote/src/remoteControl.js | 2 +- xpfe/components/search/resources/find.js | 2 +- xpfe/components/search/resources/internet.js | 2 +- .../search/resources/search-panel.js | 2 +- 10 files changed, 174 insertions(+), 33 deletions(-) diff --git a/htmlparser/src/nsIParser.h b/htmlparser/src/nsIParser.h index 5abe62af7dc6..d3fd1a7cbbe1 100644 --- a/htmlparser/src/nsIParser.h +++ b/htmlparser/src/nsIParser.h @@ -85,6 +85,8 @@ enum eParserDocType { typedef enum { kCharsetUninitialized = 0, kCharsetFromWeakDocTypeDefault, + kCharsetFromCache, + kCharsetFromBookmarks, kCharsetFromUserDefault , kCharsetFromDocTypeDefault, kCharsetFromParentFrame, diff --git a/parser/htmlparser/src/nsIParser.h b/parser/htmlparser/src/nsIParser.h index 5abe62af7dc6..d3fd1a7cbbe1 100644 --- a/parser/htmlparser/src/nsIParser.h +++ b/parser/htmlparser/src/nsIParser.h @@ -85,6 +85,8 @@ enum eParserDocType { typedef enum { kCharsetUninitialized = 0, kCharsetFromWeakDocTypeDefault, + kCharsetFromCache, + kCharsetFromBookmarks, kCharsetFromUserDefault , kCharsetFromDocTypeDefault, kCharsetFromParentFrame, diff --git a/xpfe/browser/resources/content/navigator.js b/xpfe/browser/resources/content/navigator.js index 8439ab57b1c0..dbfc7499987a 100644 --- a/xpfe/browser/resources/content/navigator.js +++ b/xpfe/browser/resources/content/navigator.js @@ -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. diff --git a/xpfe/components/bookmarks/public/nsIBookmarksService.idl b/xpfe/components/bookmarks/public/nsIBookmarksService.idl index a2d94e730d23..2cdccd7ecef7 100644 --- a/xpfe/components/bookmarks/public/nsIBookmarksService.idl +++ b/xpfe/components/bookmarks/public/nsIBookmarksService.idl @@ -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++ diff --git a/xpfe/components/bookmarks/resources/bm-find.js b/xpfe/components/bookmarks/resources/bm-find.js index defb40d26ae8..a94a40a65f78 100755 --- a/xpfe/components/bookmarks/resources/bm-find.js +++ b/xpfe/components/bookmarks/resources/bm-find.js @@ -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); } diff --git a/xpfe/components/bookmarks/src/nsBookmarksService.cpp b/xpfe/components/bookmarks/src/nsBookmarksService.cpp index 543d8c607c95..653398015878 100644 --- a/xpfe/components/bookmarks/src/nsBookmarksService.cpp +++ b/xpfe/components/bookmarks/src/nsBookmarksService.cpp @@ -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 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 aContainer, const char* aURL, @@ -1225,7 +1257,8 @@ BookmarkParser::AddBookmark(nsCOMPtr 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 aContainer, AssertTime(bookmark, kWEB_LastVisitDate, aLastVisitDate); AssertTime(bookmark, kWEB_LastModifiedDate, aLastModifiedDate); + if ((nsnull != aCharset) && (*aCharset != PRUnichar('\0'))) + { + nsCOMPtr 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 shortcutLiteral; @@ -1328,7 +1378,6 @@ BookmarkParser::AddBookmark(nsCOMPtr aContainer, } - nsresult BookmarkParser::ParseBookmarkHeader(const nsString &aLine, const nsCOMPtr &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 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 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 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 lastCharactersetNode; + + if (NS_SUCCEEDED(rv = mInner->GetTarget(bookmark, kWEB_LastCharset, PR_TRUE, + getter_AddRefs(lastCharactersetNode))) && (rv != NS_RDF_NO_VALUE)) + { + nsCOMPtr 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 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 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 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 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); diff --git a/xpfe/components/remote/src/remoteControl.js b/xpfe/components/remote/src/remoteControl.js index 2987d90951ba..c5bf30991915 100644 --- a/xpfe/components/remote/src/remoteControl.js +++ b/xpfe/components/remote/src/remoteControl.js @@ -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 { diff --git a/xpfe/components/search/resources/find.js b/xpfe/components/search/resources/find.js index 7b9903e866a1..7e1b21dd8f42 100644 --- a/xpfe/components/search/resources/find.js +++ b/xpfe/components/search/resources/find.js @@ -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); } diff --git a/xpfe/components/search/resources/internet.js b/xpfe/components/search/resources/internet.js index e341fa15ca8a..6108d8f54c70 100644 --- a/xpfe/components/search/resources/internet.js +++ b/xpfe/components/search/resources/internet.js @@ -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); } \ No newline at end of file diff --git a/xpfe/components/search/resources/search-panel.js b/xpfe/components/search/resources/search-panel.js index 4c7cbebc628c..921dbbd35eea 100644 --- a/xpfe/components/search/resources/search-panel.js +++ b/xpfe/components/search/resources/search-panel.js @@ -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); }