зеркало из https://github.com/mozilla/gecko-dev.git
Bug 380689 - Import & Export separators titles. r=sspitzer.
This commit is contained in:
Родитель
1355c9bb8a
Коммит
eb9309e413
|
@ -117,6 +117,7 @@ static NS_DEFINE_CID(kParserCID, NS_PARSER_CID);
|
|||
#define KEY_SHORTCUTURL_LOWER "shortcuturl"
|
||||
#define KEY_POST_DATA_LOWER "post_data"
|
||||
#define KEY_ID_LOWER "id"
|
||||
#define KEY_NAME_LOWER "name"
|
||||
|
||||
#define LOAD_IN_SIDEBAR_ANNO NS_LITERAL_CSTRING("bookmarkProperties/loadInSidebar")
|
||||
#define DESCRIPTION_ANNO NS_LITERAL_CSTRING("bookmarkProperties/description")
|
||||
|
@ -378,7 +379,7 @@ protected:
|
|||
void HandleHeadEnd();
|
||||
void HandleLinkBegin(const nsIParserNode& node);
|
||||
void HandleLinkEnd();
|
||||
void HandleSeparator();
|
||||
void HandleSeparator(const nsIParserNode& node);
|
||||
|
||||
// This is a list of frames. We really want a recursive parser, but the HTML
|
||||
// parser gives us tags as a stream. This implements all the state on a stack
|
||||
|
@ -576,7 +577,7 @@ BookmarkContentSink::AddLeaf(const nsIParserNode& aNode)
|
|||
CurFrame().mPreviousText.Append(PRUnichar(' '));
|
||||
break;
|
||||
case eHTMLTag_hr:
|
||||
HandleSeparator();
|
||||
HandleSeparator(aNode);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -924,7 +925,7 @@ BookmarkContentSink::HandleLinkEnd()
|
|||
//
|
||||
// Inserts a separator into the current container
|
||||
void
|
||||
BookmarkContentSink::HandleSeparator()
|
||||
BookmarkContentSink::HandleSeparator(const nsIParserNode& node)
|
||||
{
|
||||
BookmarkImportFrame& frame = CurFrame();
|
||||
|
||||
|
@ -941,6 +942,19 @@ BookmarkContentSink::HandleSeparator()
|
|||
mBookmarksService->InsertSeparator(frame.mContainerID,
|
||||
mBookmarksService->DEFAULT_INDEX,
|
||||
&itemId);
|
||||
|
||||
// Import separator title if set
|
||||
nsAutoString name;
|
||||
PRInt32 attrCount = node.GetAttributeCount();
|
||||
for (PRInt32 i = 0; i < attrCount; i ++) {
|
||||
const nsAString& key = node.GetKeyAt(i);
|
||||
if (key.LowerCaseEqualsLiteral(KEY_NAME_LOWER))
|
||||
name = node.GetValueAt(i);
|
||||
}
|
||||
name.Trim(kWhitespace);
|
||||
|
||||
if (!name.IsEmpty())
|
||||
mBookmarksService->SetItemTitle(itemId, name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1240,7 +1254,7 @@ static const char kContainerIntro[] = "<DT><H3";
|
|||
static const char kContainerClose[] = "</H3>" NS_LINEBREAK;
|
||||
static const char kItemOpen[] = "<DT><A";
|
||||
static const char kItemClose[] = "</A>" NS_LINEBREAK;
|
||||
static const char kSeparator[] = "<HR>" NS_LINEBREAK;
|
||||
static const char kSeparator[] = "<HR";
|
||||
static const char kQuoteStr[] = "\"";
|
||||
static const char kCloseAngle[] = ">";
|
||||
static const char kIndent[] = " ";
|
||||
|
@ -1258,6 +1272,7 @@ static const char kWebPanelAttribute[] = " WEB_PANEL=\"true\"";
|
|||
static const char kKeywordAttribute[] = " SHORTCUTURL=\"";
|
||||
static const char kPostDataAttribute[] = " POST_DATA=\"";
|
||||
static const char kIdAttribute[] = " ID=\"";
|
||||
static const char kNameAttribute[] = " NAME=\"";
|
||||
|
||||
// WriteContainerPrologue
|
||||
//
|
||||
|
@ -1754,23 +1769,57 @@ nsPlacesImportExportService::WriteLivemark(PRInt64 aFolderId, const nsACString&
|
|||
}
|
||||
|
||||
|
||||
// WriteSeparator
|
||||
// nsPlacesImportExportService::WriteSeparator
|
||||
//
|
||||
// "<HR>"
|
||||
// "<HR NAME="...">"
|
||||
|
||||
nsresult
|
||||
WriteSeparator(const nsCString& aIndent, nsIOutputStream* aOutput)
|
||||
nsPlacesImportExportService::WriteSeparator(nsINavHistoryResultNode* aItem,
|
||||
const nsACString& aIndent,
|
||||
nsIOutputStream* aOutput)
|
||||
{
|
||||
PRUint32 dummy;
|
||||
nsresult rv;
|
||||
|
||||
// indent
|
||||
if (!aIndent.IsEmpty()) {
|
||||
rv = aOutput->Write(aIndent.get(), aIndent.Length(), &dummy);
|
||||
rv = aOutput->Write(PromiseFlatCString(aIndent).get(), aIndent.Length(),
|
||||
&dummy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
|
||||
rv = aOutput->Write(kSeparator, sizeof(kSeparator)-1, &dummy);
|
||||
|
||||
// XXX: separator result nodes don't support the title getter yet
|
||||
PRInt64 itemId;
|
||||
rv = aItem->GetItemId(&itemId);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsAutoString title;
|
||||
rv = mBookmarksService->GetItemTitle(itemId, title);
|
||||
if (NS_SUCCEEDED(rv) && !title.IsEmpty()) {
|
||||
rv = aOutput->Write(kNameAttribute, strlen(kNameAttribute), &dummy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
char* escapedTitle = nsEscapeHTML(NS_ConvertUTF16toUTF8(title).get());
|
||||
if (escapedTitle) {
|
||||
PRUint32 dummy;
|
||||
rv = aOutput->Write(escapedTitle, strlen(escapedTitle), &dummy);
|
||||
nsMemory::Free(escapedTitle);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
rv = aOutput->Write(kQuoteStr, sizeof(kQuoteStr)-1, &dummy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
}
|
||||
|
||||
// '>'
|
||||
rv = aOutput->Write(kCloseAngle, sizeof(kCloseAngle)-1, &dummy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// line break
|
||||
rv = aOutput->Write(NS_LINEBREAK, sizeof(NS_LINEBREAK)-1, &dummy);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
@ -1882,7 +1931,7 @@ nsPlacesImportExportService::WriteContainerContents(PRInt64 aFolder, const nsACS
|
|||
else
|
||||
rv = WriteContainer(folderId, myIndent, aOutput);
|
||||
} else if (type == nsINavHistoryResultNode::RESULT_TYPE_SEPARATOR) {
|
||||
rv = WriteSeparator(myIndent, aOutput);
|
||||
rv = WriteSeparator(child, myIndent, aOutput);
|
||||
} else {
|
||||
rv = WriteItem(child, myIndent, aOutput);
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ class nsPlacesImportExportService : public nsIPlacesImportExportService
|
|||
nsresult WriteItem(nsINavHistoryResultNode* aItem, const nsACString& aIndent, nsIOutputStream* aOutput);
|
||||
nsresult WriteLivemark(PRInt64 aFolderId, const nsACString& aIndent, nsIOutputStream* aOutput);
|
||||
nsresult WriteContainerContents(PRInt64 aFolder, const nsACString& aIndent, nsIOutputStream* aOutput);
|
||||
nsresult WriteSeparator(nsINavHistoryResultNode* aItem, const nsACString& aIndent, nsIOutputStream* aOutput);
|
||||
nsresult WriteDescription(PRInt64 aId, PRInt32 aType, nsIOutputStream* aOutput);
|
||||
|
||||
nsresult ArchiveBookmarksFile(PRInt32 aNumberOfBackups, PRBool aForceArchive);
|
||||
|
|
Загрузка…
Ссылка в новой задаче