www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit d11e78de0ecb88c3b563de05d4777c91250da925
parent 9ac7efb3f00a6662d84783b152bc17f7456d0026
Author: Simon Kornblith <simon@simonster.com>
Date:   Wed, 27 Jul 2011 21:01:21 +0000

Save webpage snapshots from connectors when Zotero Standalone is running


Diffstat:
Mchrome/content/zotero/xpcom/server_connector.js | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 87 insertions(+), 4 deletions(-)

diff --git a/chrome/content/zotero/xpcom/server_connector.js b/chrome/content/zotero/xpcom/server_connector.js @@ -117,7 +117,7 @@ Zotero.Server.Connector.Detect.prototype = { me._translate.setDocument(me._browser.contentDocument); me._translate.getTranslators(); } catch(e) { - Zotero.debug(e); + sendResponseCallback(500); throw e; } }, false); @@ -274,7 +274,7 @@ Zotero.Server.Connector.SavePage.prototype = { } /** - * Performs translation of a given page, or, alternatively, saves items directly + * Saves items to DB * * Accepts: * items - an array of JSON format items @@ -326,6 +326,90 @@ Zotero.Server.Connector.SaveItem.prototype = { } /** + * Saves a snapshot to the DB + * + * Accepts: + * uri - The URI of the page to be saved + * html - document.innerHTML or equivalent + * cookie - document.cookie or equivalent + * Returns: + * Nothing (200 OK response) + */ +Zotero.Server.Connector.SaveSnapshot = function() {}; +Zotero.Server.Endpoints["/connector/saveSnapshot"] = Zotero.Server.Connector.SaveSnapshot; +Zotero.Server.Connector.SaveSnapshot.prototype = { + "supportedMethods":["POST"], + "supportedDataTypes":["application/json"], + + /** + * Save snapshot + * @param {String} data POST data or GET query string + * @param {Function} sendResponseCallback function to send HTTP response + */ + "init":function(data, sendResponseCallback) { + Zotero.Server.Connector.Data[data["url"]] = "<html>"+data["html"]+"</html>"; + var browser = Zotero.Browser.createHiddenBrowser(); + + var pageShowCalled = false; + var cookieSandbox = new Zotero.CookieSandbox(browser, data["url"], data["cookie"]); + browser.addEventListener("DOMContentLoaded", function() { + if(browser.contentDocument.location.href == "about:blank") return; + if(pageShowCalled) return; + pageShowCalled = true; + delete Zotero.Server.Connector.Data[data["url"]]; + + // figure out where to save + var libraryID = null; + var collectionID = null; + var zp = Zotero.getActiveZoteroPane(); + try { + var libraryID = zp.getSelectedLibraryID(); + var collection = zp.getSelectedCollection(); + } catch(e) {} + + try { + var doc = browser.contentDocument; + + // create new webpage item + var item = new Zotero.Item("webpage"); + item.libraryID = libraryID; + item.setField("title", doc.title); + item.setField("url", data.url); + item.setField("accessDate", "CURRENT_TIMESTAMP"); + var itemID = item.save(); + if(collection) collection.addItem(itemID); + + // determine whether snapshot can be saved + var filesEditable; + if (libraryID) { + var group = Zotero.Groups.getByLibraryID(libraryID); + filesEditable = group.filesEditable; + } else { + filesEditable = true; + } + + // save snapshot + if(filesEditable) { + Zotero.Attachments.importFromDocument(doc, itemID); + } + + // remove browser + Zotero.Browser.deleteHiddenBrowser(browser); + + // destroy cookieSandbox + cookieSandbox.destroy(); + sendResponseCallback(201); + } catch(e) { + sendResponseCallback(500); + throw e; + } + }, false); + + browser.loadURI("zotero://connector/"+encodeURIComponent(data["url"])); + } +} + +/** * Handle item selection * * Accepts: @@ -372,7 +456,7 @@ Zotero.Server.Connector.GetTranslatorCode.prototype = { "supportedDataTypes":["application/json"], /** - * Finishes up translation when item selection is complete + * Returns a 200 response to say the server is alive * @param {String} data POST data or GET query string * @param {Function} sendResponseCallback function to send HTTP response */ @@ -382,7 +466,6 @@ Zotero.Server.Connector.GetTranslatorCode.prototype = { } } - /** * Test connection *