diff --git a/mozilla/browser/base/content/browser.js b/mozilla/browser/base/content/browser.js index 6399d1ea462..3c5a51ca152 100644 --- a/mozilla/browser/base/content/browser.js +++ b/mozilla/browser/base/content/browser.js @@ -244,7 +244,7 @@ function Startup() if (uriToLoad && !gIsLoadingBlank) { if ("arguments" in window && window.arguments.length >= 3) - loadURI(uriToLoad, window.arguments[2]); + loadURI(uriToLoad, window.arguments[2], null); else loadOneOrMoreURIs(uriToLoad); } @@ -775,12 +775,12 @@ function loadOneOrMoreURIs(aURIString) { if (aURIString.indexOf("|") != -1) { var urls = aURIString.split("|"); - loadURI(urls[0]); + loadURI(urls[0], null, null); for (var i = 1; i < urls.length; ++i) gBrowser.addTab(urls[i]); } else - loadURI(aURIString); + loadURI(aURIString, null, null); } function constructGoMenuItem(goMenu, beforeItem, url, title) @@ -1023,15 +1023,17 @@ function BrowserCloseWindow() closeWindow(true); } -function loadURI(uri, referrer) +function loadURI(uri, referrer, postData) { try { - getWebNavigation().loadURI(uri, nsIWebNavigation.LOAD_FLAGS_NONE, referrer, null, null); + if (postData === undefined) + postData = null; + getWebNavigation().loadURI(uri, nsIWebNavigation.LOAD_FLAGS_NONE, referrer, postData, null); } catch (e) { } } -function BrowserLoadURL(aTriggeringEvent) +function BrowserLoadURL(aTriggeringEvent, aPostData) { var url = gURLBar.value; if (url.match(/^view-source:/)) { @@ -1041,7 +1043,7 @@ function BrowserLoadURL(aTriggeringEvent) aTriggeringEvent && 'altKey' in aTriggeringEvent && aTriggeringEvent.altKey) { _content.focus(); - var t = gBrowser.addTab(url); // open link in new tab + var t = gBrowser.addTab(url, aPostData); // open link in new tab gBrowser.selectedTab = t; gURLBar.value = url; event.preventDefault(); @@ -1050,42 +1052,82 @@ function BrowserLoadURL(aTriggeringEvent) event.stopPropagation(); } else - loadURI(url); + loadURI(url, null, aPostData); _content.focus(); } } -function getShortcutOrURI(url) +function getShortcutOrURI(aURL, aPostDataRef) { // rjc: added support for URL shortcuts (3/30/1999) try { - var shortcutURL = BMSVC.resolveKeyword(url); + var shortcutURL = BMSVC.resolveKeyword(aURL, aPostDataRef); if (!shortcutURL) { // rjc: add support for string substitution with shortcuts (4/4/2000) // (see bug # 29871 for details) - var aOffset = url.indexOf(" "); + var aOffset = aURL.indexOf(" "); if (aOffset > 0) { - var cmd = url.substr(0, aOffset); - var text = url.substr(aOffset+1); - shortcutURL = BMSVC.resolveKeyword(cmd); + var cmd = aURL.substr(0, aOffset); + var text = aURL.substr(aOffset+1); + shortcutURL = BMSVC.resolveKeyword(cmd, aPostDataRef); if (shortcutURL && text) { - aOffset = shortcutURL.indexOf("%s"); - if (aOffset >= 0) - shortcutURL = shortcutURL.substr(0, aOffset) + text + shortcutURL.substr(aOffset+2); + if (aPostDataRef && aPostDataRef.value) { + // XXXben - currently we only support "application/x-www-form-urlencoded" + // enctypes. + aPostDataRef.value = unescape(aPostDataRef.value); + if (aPostDataRef.value.match(/%s/)) + aPostDataRef.value = getPostDataStream(aPostDataRef.value, text, + "application/x-www-form-urlencoded"); + else { + shortcutURL = null; + aPostDataRef.value = null; + } + } else - shortcutURL = null; + shortcutURL = shortcutURL.match(/%s/) ? shortcutURL.replace(/%s/, text) : null; } } } if (shortcutURL) - url = shortcutURL; + aURL = shortcutURL; } catch (ex) { } - return url; + return aURL; } +#if 0 +// XXXben - this is only useful if we ever support text/plain encoded forms in +// smart keywords. +function normalizePostData(aStringData) +{ + var parts = aStringData.split("&"); + var result = ""; + for (var i = 0; i < parts.length; ++i) { + var part = unescape(parts[i]); + if (part != "") + result += part + "\r\n"; + } + return result; +} +#endif +function getPostDataStream(aStringData, aKeyword, aType) +{ + var dataStream = Components.classes["@mozilla.org/io/string-input-stream;1"] + .createInstance(Components.interfaces.nsIStringInputStream); + aStringData = aStringData.replace(/%s/, aKeyword); + dataStream.setData(aStringData, aStringData.length); + + var mimeStream = Components.classes["@mozilla.org/network/mime-input-stream;1"] + .createInstance(Components.interfaces.nsIMIMEInputStream); + mimeStream.addHeader("Content-Type", aType); + mimeStream.addContentLength = true; + mimeStream.setData(dataStream); + return mimeStream.QueryInterface(Components.interfaces.nsIInputStream); +} + + function readFromClipboard() { var url; @@ -1293,7 +1335,8 @@ function handleURLBarRevert() function handleURLBarCommand(aTriggeringEvent) { - canonizeUrl(aTriggeringEvent); + var postData = { }; + canonizeUrl(aTriggeringEvent, postData); try { addToUrlbarHistory(); @@ -1302,10 +1345,10 @@ function handleURLBarCommand(aTriggeringEvent) // but don't let that interfere with the loading of the url. } - BrowserLoadURL(aTriggeringEvent); + BrowserLoadURL(aTriggeringEvent, postData.value); } -function canonizeUrl(aTriggeringEvent) +function canonizeUrl(aTriggeringEvent, aPostDataRef) { if (!gURLBar) return; @@ -1329,7 +1372,7 @@ function canonizeUrl(aTriggeringEvent) url = "http://www." + url + ".net/"; } - gURLBar.value = getShortcutOrURI(url); + gURLBar.value = getShortcutOrURI(url, aPostDataRef); } function UpdatePageProxyState() @@ -1458,7 +1501,7 @@ function SearchBarPopupCommand(aEvent) if (aEvent.target.id == "miAddEngines") { var regionBundle = document.getElementById("bundle_browser_region"); - loadURI(regionBundle.getString("searchEnginesURL")); + loadURI(regionBundle.getString("searchEnginesURL"), null, null); return; } @@ -1746,7 +1789,7 @@ var goButtonObserver = { var xferData = aXferData.data.split("\n"); var uri = xferData[0] ? xferData[0] : xferData[1]; if (uri) - loadURI(uri); + loadURI(uri, null, null); }, getSupportedFlavours: function () { @@ -1829,7 +1872,7 @@ function OpenSearch(tabName, searchStr, newTabFlag) //If it is a url go to URL. A Url is "://" or "." as commented above //Otherwise search on entry if (forceAsURL) { - BrowserLoadURL() + BrowserLoadURL(null, null) } else { if (searchStr) { var escapedSearchStr = encodeURIComponent(searchStr); @@ -1854,7 +1897,7 @@ function OpenSearch(tabName, searchStr, newTabFlag) } if (!newTabFlag) { - loadURI(defaultSearchURL); + loadURI(defaultSearchURL, null, null); } else { var newTab = getBrowser().addTab(defaultSearchURL); @@ -3170,7 +3213,7 @@ nsContextMenu.prototype = { }, // Open clicked-in frame in the same window showOnlyThisFrame : function () { - window.loadURI(this.target.ownerDocument.location.href); + window.loadURI(this.target.ownerDocument.location.href, null, null); }, // View Partial Source viewPartialSource : function ( context ) { @@ -3497,7 +3540,19 @@ nsContextMenu.prototype = { if (!form) return false; var method = form.method.toUpperCase(); - return (method == "GET" || method == "") + + // These are the following types of forms we can create keywords for: + // + // method encoding type can create keyword + // GET * YES + // * YES + // POST YES + // POST application/x-www-form-urlencoded YES + // POST text/plain NO (a little tricky to do) + // POST multipart/form-data NO + return (method == "GET" || method == "") || + (form.enctype == "application/x-www-form-urlencoded") || + (form.enctype == ""); }, // Determines whether or not the separator with the specified ID should be @@ -3603,11 +3658,12 @@ function asyncOpenWebPanel(event) { if (!linkNode.href) return true; if (linkNode.getAttribute("onclick")) return true; - var url = getShortcutOrURI(linkNode.href); + var postData = { }; + var url = getShortcutOrURI(linkNode.href, postData); if (!url) return true; markLinkVisited(linkNode.href, linkNode); - loadURI(url); + loadURI(url, null, postData.value); event.preventDefault(); return false; } @@ -3709,7 +3765,8 @@ function middleMousePaste(event) var url = readFromClipboard(); if (!url) return false; - url = getShortcutOrURI(url); + var postData = { }; + url = getShortcutOrURI(url, postData); if (!url) return false; @@ -3723,7 +3780,7 @@ function middleMousePaste(event) if (!openNewTab) { // If ctrl wasn't down, then just load the url in the current win/tab. - loadURI(url); + loadURI(url, null, postData.value); } else { const nsIURIFixup = Components.interfaces.nsIURIFixup; if (!gURIFixup) @@ -3732,7 +3789,7 @@ function middleMousePaste(event) url = gURIFixup.createFixupURI(url, nsIURIFixup.FIXUP_FLAGS_MAKE_ALTERNATE_URI).spec; - openNewTabWith(url, null, event, true); + openNewTabWith(url, null, event, true, postData.value); } event.preventBubble(); @@ -3797,7 +3854,9 @@ var contentAreaDNDObserver = { switch (document.firstChild.getAttribute('windowtype')) { case "navigator:browser": - loadURI(getShortcutOrURI(url)); + var postData = { }; + var uri = getShortcutOrURI(url, postData); + loadURI(uri, null, postData.value); break; case "navigator:view-source": viewSource(url); @@ -4455,18 +4514,39 @@ function AddKeywordForSearchField() var uri = Components.classes["@mozilla.org/network/standard-url;1"] .getService(Components.interfaces.nsIURI); uri.spec = node.ownerDocument.URL; + var keywordURL = ioService.newURI(node.form.action, node.ownerDocument.characterSet, uri); var spec = keywordURL.spec; - spec += "?" + escape(node.name) + "=%s"; - for (var i = 0; i < node.form.elements.length; ++i) { - var e = node.form.elements[i]; - if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden") - spec += "&" + escape(e.name) + "=" + escape(e.value); + var postData = ""; + + if (node.form.method.toUpperCase() == "POST" && + (node.form.enctype == "application/x-www-form-urlencoded" || node.form.enctype == "")) { + for (var i = 0; i < node.form.elements.length; ++i) { + var e = node.form.elements[i]; + if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden" || + e.localName.toLowerCase() == "textarea") + postData += escape(e.name + "=" + (e == node ? "%s" : e.value)) + "&"; + else if (e.localName.toLowerCase() == "select") + postData += escape(e.name + "=" + e.options[e.selectedIndex].value) + "&"; + } + } + else { + spec += "?" + escape(node.name) + "=%s"; + for (var i = 0; i < node.form.elements.length; ++i) { + var e = node.form.elements[i]; + if (e == node) // avoid duplication of the target field value, which was populated above. + continue; + + if (e.type.toLowerCase() == "text" || e.type.toLowerCase() == "hidden" || + e.localName.toLowerCase() == "textarea") + spec += "&" + escape(e.name) + "=" + escape(e.value); + else if (e.localName.toLowerCase() == "select") + spec += "&" + escape(e.name) + "=" + escape(e.options[e.selectedIndex].value); + } } - dump("*** SPEC = " + spec + "\n"); openDialog("chrome://browser/content/bookmarks/addBookmark2.xul", "", "centerscreen,chrome,dialog,resizable,dependent", "", spec, null, node.ownerDocument.characterSet, null, null, - false, "", true); + false, "", true, postData); } diff --git a/mozilla/browser/base/content/contentAreaUtils.js b/mozilla/browser/base/content/contentAreaUtils.js index bc7d685339c..11ccba9787c 100644 --- a/mozilla/browser/base/content/contentAreaUtils.js +++ b/mozilla/browser/base/content/contentAreaUtils.js @@ -3,7 +3,7 @@ * area. **/ -function openNewTabWith(href, linkNode, event, securityCheck) +function openNewTabWith(href, linkNode, event, securityCheck, postData) { if (securityCheck) urlSecurityCheck(href, document); @@ -33,7 +33,7 @@ function openNewTabWith(href, linkNode, event, securityCheck) // open link in new tab var browser = top.document.getElementById("content"); - var theTab = browser.addTab(href, getReferrer(document), originCharset); + var theTab = browser.addTab(href, getReferrer(document), originCharset, postData); if (!loadInBackground) browser.selectedTab = theTab; @@ -41,7 +41,7 @@ function openNewTabWith(href, linkNode, event, securityCheck) markLinkVisited(href, linkNode); } -function openNewWindowWith(href, linkNode, securityCheck) +function openNewWindowWith(href, linkNode, securityCheck, postData) { if (securityCheck) urlSecurityCheck(href, document); @@ -55,7 +55,7 @@ function openNewWindowWith(href, linkNode, securityCheck) charsetArg = "charset=" + window._content.document.characterSet; var referrer = getReferrer(document); - window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", href, charsetArg, referrer); + window.openDialog(getBrowserURL(), "_blank", "chrome,all,dialog=no", href, charsetArg, referrer, postData); if (linkNode) markLinkVisited(href, linkNode); diff --git a/mozilla/browser/components/bookmarks/content/addBookmark.js b/mozilla/browser/components/bookmarks/content/addBookmark.js index fc4662b3ba8..4aef608ee05 100644 --- a/mozilla/browser/components/bookmarks/content/addBookmark.js +++ b/mozilla/browser/components/bookmarks/content/addBookmark.js @@ -250,11 +250,11 @@ function onOK() for (var i = 0; i < groups.length; ++i) { url = getNormalizedURL(groups[i].url); BMDS.createBookmarkInContainer(groups[i].name, url, null, null, - groups[i].charset, rSource, -1); + groups[i].charset, null, rSource, -1); } } else { url = getNormalizedURL(gFld_URL.value); - rSource = BMDS.createBookmark(gFld_Name.value, url, null, null, gBookmarkCharset, false); + rSource = BMDS.createBookmark(gFld_Name.value, url, null, null, gBookmarkCharset, false, ""); if (window.arguments.length > 4 && window.arguments[4] == "newBookmark") { window.arguments[5].newBookmark = rSource; } diff --git a/mozilla/browser/components/bookmarks/content/addBookmark2.js b/mozilla/browser/components/bookmarks/content/addBookmark2.js index b2dfcb4987e..96df9a0fd9d 100644 --- a/mozilla/browser/components/bookmarks/content/addBookmark2.js +++ b/mozilla/browser/components/bookmarks/content/addBookmark2.js @@ -78,6 +78,9 @@ * visible. * window.arguments[8]: Whether or not a keyword is required to add * the bookmark. + * window.arguments[9]: PostData to be saved with this bookmark, + * in the format a string of name=value pairs + * separated by CRLFs. */ var gSelectedFolder; @@ -91,6 +94,7 @@ var gGroup; var gKeywordRequired; var gSuggestedKeyword; var gRequiredFields = []; +var gPostData; # on windows, sizeToContent is buggy (see bug 227951), we''ll use resizeTo # instead and cache the bookmarks tree view size. @@ -121,6 +125,7 @@ function Startup() onFieldInput(); gSelectedFolder = RDF.GetResource(gMenulist.selectedItem.id); gExpander.setAttribute("tooltiptext", gExpander.getAttribute("tooltiptextdown")); + gPostData = window.arguments[9]; # read the persisted attribute. If it is not present, set a default height. WSucks = parseInt(gBookmarksTree.getAttribute("height")); @@ -165,11 +170,11 @@ function onOK() for (var i = 0; i < groups.length; ++i) { url = getNormalizedURL(groups[i].url); BMDS.createBookmarkInContainer(groups[i].name, url, gKeyword.value, null, - groups[i].charset, rSource, -1); + groups[i].charset, gPostData, rSource, -1); } } else { url = getNormalizedURL(window.arguments[1]); - rSource = BMDS.createBookmark(gName.value, url, gKeyword.value, null, window.arguments[3]); + rSource = BMDS.createBookmark(gName.value, url, gKeyword.value, null, window.arguments[3], gPostData); } var selection = BookmarksUtils.getSelectionFromResource(rSource); diff --git a/mozilla/browser/components/bookmarks/content/bookmarks.js b/mozilla/browser/components/bookmarks/content/bookmarks.js index c4e2c7f056d..817b1a5cb55 100644 --- a/mozilla/browser/components/bookmarks/content/bookmarks.js +++ b/mozilla/browser/components/bookmarks/content/bookmarks.js @@ -480,7 +480,7 @@ var BookmarksCommand = { items = data.substring(0, ix != -1 ? ix : data.length); name = data.substring(ix); // XXX: we should infer the best charset - BookmarksUtils.createBookmark(null, items, null, name); + BookmarksUtils.createBookmark(null, items, null, name, null); items = [items]; break; default: @@ -644,7 +644,7 @@ var BookmarksCommand = { createNewBookmark: function (aTarget) { var name = BookmarksUtils.getLocaleString("ile_newbookmark"); - var resource = BMSVC.createBookmark(name, "", "", "", ""); + var resource = BMSVC.createBookmark(name, "", "", "", "", null); this.createNewResource(resource, aTarget, "newbookmark"); }, @@ -1295,7 +1295,7 @@ var BookmarksUtils = { break; case "text/x-moz-url": case "text/unicode": - rSource = BookmarksUtils.createBookmark(null, uri, null, extra); + rSource = BookmarksUtils.createBookmark(null, uri, null, extra, null); parent = null; break; } @@ -1347,7 +1347,7 @@ var BookmarksUtils = { if (fw) aCharSet = fw.document.characterSet; } - return BMSVC.createBookmark(aName, aURL, null, null, aCharSet); + return BMSVC.createBookmark(aName, aURL, null, null, aCharSet, null); }, flushDataSource: function () diff --git a/mozilla/browser/components/bookmarks/public/nsIBookmarksService.idl b/mozilla/browser/components/bookmarks/public/nsIBookmarksService.idl index 963fc220016..45cdf8f53fc 100644 --- a/mozilla/browser/components/bookmarks/public/nsIBookmarksService.idl +++ b/mozilla/browser/components/bookmarks/public/nsIBookmarksService.idl @@ -65,12 +65,14 @@ interface nsIBookmarksService : nsISupports in wstring aURL, in wstring aShortcutURL, in wstring aDescription, - in wstring aDocCharSet); + in wstring aDocCharSet, + in wstring aPostData); nsIRDFResource createBookmarkInContainer(in wstring aName, in wstring aURL, in wstring aShortcutURL, in wstring aDescription, - in wstring aDocCharSet, + in wstring aDocCharSet, + in wstring aPostData, in nsIRDFResource aFolder, in long aIndex); @@ -88,7 +90,7 @@ interface nsIBookmarksService : nsISupports void updateLastVisitedDate(in string aURL, in wstring docCharset); - string resolveKeyword(in wstring aName); + string resolveKeyword(in wstring aName, out wstring aPostData); void importSystemBookmarks(in nsIRDFResource aParentFolder); diff --git a/mozilla/browser/components/bookmarks/src/nsBookmarkProtocolHandler.js b/mozilla/browser/components/bookmarks/src/nsBookmarkProtocolHandler.js index 85c90618aa5..b8d9adcdab4 100644 --- a/mozilla/browser/components/bookmarks/src/nsBookmarkProtocolHandler.js +++ b/mozilla/browser/components/bookmarks/src/nsBookmarkProtocolHandler.js @@ -206,7 +206,7 @@ nsBookmarkContentHandler.prototype = { var root = rdf.GetResource("NC:BookmarksRoot"); // Append this bookmark to the end. var bmRes = bms.createBookmarkInContainer(bookmark.name, bookmark.url, bookmark.keyword, - bookmark.description, bookmark.charset, root, -1); + bookmark.description, bookmark.charset, root, -1, ""); dump("*** bookmark =" + bookmark.toSource() + "\n"); var ds = bms.QueryInterface(Components.interfaces.nsIRDFDataSource); if (bookmark.webpanel == "true") { diff --git a/mozilla/browser/components/bookmarks/src/nsBookmarksService.cpp b/mozilla/browser/components/bookmarks/src/nsBookmarksService.cpp index cb484b3d75a..bb933a770f2 100644 --- a/mozilla/browser/components/bookmarks/src/nsBookmarksService.cpp +++ b/mozilla/browser/components/bookmarks/src/nsBookmarksService.cpp @@ -107,6 +107,7 @@ nsIRDFResource *kNC_BookmarksToolbarFolder; nsIRDFResource *kNC_ShortcutURL; nsIRDFResource *kNC_URL; nsIRDFResource *kNC_WebPanel; +nsIRDFResource *kNC_PostData; nsIRDFResource *kRDF_type; nsIRDFResource *kRDF_nextVal; nsIRDFResource *kWEB_LastModifiedDate; @@ -232,6 +233,8 @@ bm_AddRefGlobals() &kNC_URL); gRDF->GetResource(NS_LITERAL_CSTRING(NC_NAMESPACE_URI "WebPanel"), &kNC_WebPanel); + gRDF->GetResource(NS_LITERAL_CSTRING(NC_NAMESPACE_URI "PostData"), + &kNC_PostData); gRDF->GetResource(NS_LITERAL_CSTRING(RDF_NAMESPACE_URI "type"), &kRDF_type); gRDF->GetResource(NS_LITERAL_CSTRING(RDF_NAMESPACE_URI "nextVal"), @@ -329,6 +332,7 @@ bm_ReleaseGlobals() NS_IF_RELEASE(kNC_ShortcutURL); NS_IF_RELEASE(kNC_URL); NS_IF_RELEASE(kNC_WebPanel); + NS_IF_RELEASE(kNC_PostData); NS_IF_RELEASE(kRDF_type); NS_IF_RELEASE(kRDF_nextVal); NS_IF_RELEASE(kWEB_LastModifiedDate); @@ -549,6 +553,7 @@ static const char kLastCharsetEquals[] = "LAST_CHARSET=\""; static const char kShortcutURLEquals[] = "SHORTCUTURL=\""; static const char kIconEquals[] = "ICON=\""; static const char kWebPanelEquals[] = "WEB_PANEL=\""; +static const char kPostDataEquals[] = "POST_DATA=\""; static const char kScheduleEquals[] = "SCHEDULE=\""; static const char kLastPingEquals[] = "LAST_PING=\""; static const char kPingETagEquals[] = "PING_ETAG=\""; @@ -1036,6 +1041,7 @@ BookmarkParser::gBookmarkFieldTable[] = { kShortcutURLEquals, NC_NAMESPACE_URI "ShortcutURL", nsnull, BookmarkParser::ParseLiteral, nsnull }, { kIconEquals, NC_NAMESPACE_URI "Icon", nsnull, BookmarkParser::ParseLiteral, nsnull }, { kWebPanelEquals, NC_NAMESPACE_URI "WebPanel", nsnull, BookmarkParser::ParseLiteral, nsnull }, + { kPostDataEquals, NC_NAMESPACE_URI "PostData", nsnull, BookmarkParser::ParseLiteral, nsnull }, { kLastCharsetEquals, WEB_NAMESPACE_URI "LastCharset", nsnull, BookmarkParser::ParseLiteral, nsnull }, { kScheduleEquals, WEB_NAMESPACE_URI "Schedule", nsnull, BookmarkParser::ParseLiteral, nsnull }, { kLastPingEquals, WEB_NAMESPACE_URI "LastPingDate", nsnull, BookmarkParser::ParseDate, nsnull }, @@ -2519,6 +2525,7 @@ nsBookmarksService::CreateBookmark(const PRUnichar* aName, const PRUnichar* aShortcutURL, const PRUnichar* aDescription, const PRUnichar* aDocCharSet, + const PRUnichar* aPostData, nsIRDFResource** aResult) { // Resource: Bookmark ID @@ -2606,6 +2613,17 @@ nsBookmarksService::CreateBookmark(const PRUnichar* aName, return rv; } + // Literal: PostData associated with this bookmark (used for smart keywords) + if (aPostData && *aPostData) { + nsCOMPtr postDataLiteral; + rv = gRDF->GetLiteral(aPostData, getter_AddRefs(postDataLiteral)); + if (NS_FAILED(rv)) + return rv; + rv = mInner->Assert(bookmarkResource, kNC_PostData, postDataLiteral, PR_TRUE); + if (NS_FAILED(rv)) + return rv; + } + *aResult = bookmarkResource; NS_ADDREF(*aResult); @@ -2618,11 +2636,12 @@ nsBookmarksService::CreateBookmarkInContainer(const PRUnichar* aName, const PRUnichar* aShortcutURL, const PRUnichar* aDescription, const PRUnichar* aDocCharSet, + const PRUnichar* aPostData, nsIRDFResource* aParentFolder, PRInt32 aIndex, nsIRDFResource** aResult) { - nsresult rv = CreateBookmark(aName, aURL, aShortcutURL, aDescription, aDocCharSet, aResult); + nsresult rv = CreateBookmark(aName, aURL, aShortcutURL, aDescription, aDocCharSet, aPostData, aResult); if (NS_SUCCEEDED(rv)) rv = InsertResource(*aResult, aParentFolder, aIndex); return rv; @@ -3070,7 +3089,7 @@ nsBookmarksService::UpdateBookmarkLastModifiedDate(nsIRDFResource *aSource) } NS_IMETHODIMP -nsBookmarksService::ResolveKeyword(const PRUnichar *aUserInput, char **aShortcutURL) +nsBookmarksService::ResolveKeyword(const PRUnichar *aUserInput, PRUnichar** aPostData, char **aShortcutURL) { NS_PRECONDITION(aUserInput != nsnull, "null ptr"); if (! aUserInput) @@ -3097,6 +3116,19 @@ nsBookmarksService::ResolveKeyword(const PRUnichar *aUserInput, char **aShortcut return rv; if (source) { + // Get postData + nsCOMPtr node; + GetTarget(source, kNC_PostData, PR_TRUE, getter_AddRefs(node)); + if (node) { + nsCOMPtr postData(do_QueryInterface(node)); + + const PRUnichar* postDataVal = nsnull; + postData->GetValueConst(&postDataVal); + + nsDependentString postDataStr(postDataVal); + *aPostData = ToNewUnicode(postDataStr); + } + nsAutoString url; rv = GetURLFromResource(source, url); if (NS_FAILED(rv)) @@ -4686,6 +4718,10 @@ nsBookmarksService::WriteBookmarksContainer(nsIRDFDataSource *ds, // output kNC_WebPanel rv |= WriteBookmarkProperties(ds, strm, child, kNC_WebPanel, kWebPanelEquals, PR_FALSE); + + // output kNC_PostData + rv |= WriteBookmarkProperties(ds, strm, child, kNC_PostData, + kPostDataEquals, PR_FALSE); // output SCHEDULE rv |= WriteBookmarkProperties(ds, strm, child, kWEB_Schedule, kScheduleEquals, PR_FALSE); @@ -4979,6 +5015,7 @@ nsBookmarksService::CanAccept(nsIRDFResource* aSource, (aProperty == kNC_ShortcutURL) || (aProperty == kNC_URL) || (aProperty == kNC_WebPanel) || + (aProperty == kNC_PostData) || (aProperty == kWEB_LastModifiedDate) || (aProperty == kWEB_LastVisitDate) || (aProperty == kNC_BookmarkAddDate) || diff --git a/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp index e49cfaad990..34d983f3c72 100644 --- a/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp @@ -1160,7 +1160,8 @@ nsIEProfileMigrator::CopySmartKeywords(nsIRDFResource* aParentFolder) NS_ConvertASCIItoUTF16(url).get(), keyword.get(), keywordDesc.get(), - NS_LITERAL_STRING("").get(), + nsnull, + nsnull, keywordsFolder, -1, getter_AddRefs(bookmark)); diff --git a/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp index aa163ec82d6..c5ea0a8a5a9 100644 --- a/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp @@ -1116,6 +1116,7 @@ nsOperaProfileMigrator::CopySmartKeywords(nsIBookmarksService* aBMS, NS_ConvertUTF8toUTF16(keyword).get(), keywordDesc.get(), nsnull, + nsnull, keywordsFolder, -1, getter_AddRefs(itemRes)); diff --git a/mozilla/toolkit/content/widgets/tabbrowser.xml b/mozilla/toolkit/content/widgets/tabbrowser.xml index d3ba371b213..73287ba8613 100644 --- a/mozilla/toolkit/content/widgets/tabbrowser.xml +++ b/mozilla/toolkit/content/widgets/tabbrowser.xml @@ -706,6 +706,7 @@ + diff --git a/mozilla/toolkit/mozapps/extensions/src/nsExtensionManager.js.in b/mozilla/toolkit/mozapps/extensions/src/nsExtensionManager.js.in index 1e570e28e6b..fc8a5dd16a6 100644 --- a/mozilla/toolkit/mozapps/extensions/src/nsExtensionManager.js.in +++ b/mozilla/toolkit/mozapps/extensions/src/nsExtensionManager.js.in @@ -145,8 +145,11 @@ nsExtensionManager.prototype = { var appVersion = pref.getCharPref(PREF_EM_APP_VERSION); var extensions = this._ds.getExtensionList(aExtensionID); - var updater = new nsExtensionUpdater(extensions, appID, appVersion); - updater.checkForUpdates(); + var updater = new nsExtensionUpdater2(extensions, appID, appVersion); + updater.loadSchema(); + + // var updater = new nsExtensionUpdater(extensions, appID, appVersion); + // updater.checkForUpdates(); }, // Themes @@ -198,6 +201,112 @@ nsExtensionManager.prototype = { } }; +function nsExtensionUpdater2(aExtensions, + aTargetAppID, aTargetAppVersion) +{ + this._extensions = aExtensions; + this._count = aExtensions.length; + this._appID = aTargetAppID; + this._appVersion = aTargetAppVersion; + + this._os = Components.classes["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService); +} + +nsExtensionUpdater2.prototype = { + _extensionSchemaType: null, + loadSchema: function () + { + function SchemaLoaderListener(aUpdater) + { + this._updater = aUpdater; + } + + SchemaLoaderListener.prototype = { + onLoad: function (aSchema) + { + dump("*** schema loaded = " + aSchema + "\n"); + var count = aSchema.typeCount; + for (var i = 0; i < count; ++i) { + var type = aSchema.getTypeByIndex(i); + dump("*** schema type = " + type.name + "\n"); + } + + this._updater._extensionSchemaType = aSchema.getTypeByName("Extension"); + + this._updater._schemaLoaded(); + }, + + onError: function (aStatus, aMessage) + { + dump("*** schema load error " + aStatus + ", msg = " + aMessage + "\n"); + } + }; + + var schemaLoader = Components.classes["@mozilla.org/xmlextras/schemas/schemaloader;1"] + .createInstance(Components.interfaces.nsISchemaLoader); + var schemaLoaderListener = new SchemaLoaderListener(this); + schemaLoader.loadAsync("http://www.bengoodger.com/software/mb/umo/types.xsd", + schemaLoaderListener); + }, + + _schemaLoaded: function () + { + var call = Components.classes["@mozilla.org/xmlextras/soap/call;1"] + .createInstance(Components.interfaces.nsISOAPCall); + call.transportURI = "http://localhost:8080/axis/services/VersionCheck"; + + for (var i = 0; i < this._extensions.length; ++i) { + var e = this._extensions[i]; + + var params = [this._createParam("in0", e, this._extensionSchemaType), + this._createParam("in1", this._appID, null), + this._createParam("in2", this._appVersion, null)]; + call.encode(0, "getNewestExtension", "urn:VersionCheck", 0, null, params.length, params); + var response = call.invoke(); + dump("*** response = " + response + "\n"); + var count = { }; + var params; + response.getParameters(false, count, params); + dump("*** params = " + count.value + "\n"); + for (var j = 0; j < count.value; ++j) { + var param = params[j]; + dump("*** param = " + param.name + ", parm = " + param + ", element = " + param.element + ", value = " + param.value + "\n"); + // var v = param.value.QueryInterface(Components.interfaces.nsIVariant); + } + } + }, + + _walkKids: function (e) + { + for (var i = 0; i < e.childNodes.length; ++i) { + var kid = e.childNodes[i]; + dump("<" + kid.nodeName); + for (var k = 0; k < kid.attributes.length; ++k) + dump(" " + kid.attributes[k] + "=" + kid.getAttribute(kid.attributes[k])); + if (kid.hasChildNodes()) { + this._walkKids(kid); + dump(""); + } + }, + + _createParam: function (aParamName, aParamValue, aParamSchemaType) + { + var param = Components.classes["@mozilla.org/xmlextras/soap/parameter;1"] + .createInstance(Components.interfaces.nsISOAPParameter); + param.name = aParamName; + param.namespaceURI = "urn:VersionCheck"; + if (aParamSchemaType) + param.schemaType = aParamSchemaType; + param.value = aParamValue; + return param; + }, + +}; + function nsExtensionUpdater(aExtensions, aTargetAppID, aTargetAppVersion) {