Merge branch '4.0'
Conflicts: chrome/content/zotero/xpcom/schema.js
This commit is contained in:
commit
81e94b4475
|
@ -58,6 +58,7 @@ var Zotero_Browser = new function() {
|
|||
this.isScraping = false;
|
||||
|
||||
var _browserData = new Object();
|
||||
var _attachmentsMap = new WeakMap();
|
||||
|
||||
var _blacklist = [
|
||||
"googlesyndication.com",
|
||||
|
@ -533,6 +534,7 @@ var Zotero_Browser = new function() {
|
|||
|
||||
translate.clearHandlers("done");
|
||||
translate.clearHandlers("itemDone");
|
||||
translate.clearHandlers("attachmentProgress");
|
||||
|
||||
translate.setHandler("done", function(obj, returnValue) {
|
||||
if(!returnValue) {
|
||||
|
@ -550,8 +552,6 @@ var Zotero_Browser = new function() {
|
|||
Zotero_Browser.isScraping = false;
|
||||
});
|
||||
|
||||
var attachmentsMap = new WeakMap();
|
||||
|
||||
translate.setHandler("itemDone", function(obj, dbItem, item) {
|
||||
Zotero_Browser.progress.show();
|
||||
var itemProgress = new Zotero_Browser.progress.ItemProgress(Zotero.ItemTypes.getImageSrc(item.itemType),
|
||||
|
@ -559,7 +559,7 @@ var Zotero_Browser = new function() {
|
|||
itemProgress.setProgress(100);
|
||||
for(var i=0; i<item.attachments.length; i++) {
|
||||
var attachment = item.attachments[i];
|
||||
attachmentsMap.set(attachment,
|
||||
_attachmentsMap.set(attachment,
|
||||
new Zotero_Browser.progress.ItemProgress(
|
||||
Zotero.Utilities.determineAttachmentIcon(attachment),
|
||||
attachment.title, itemProgress));
|
||||
|
@ -572,7 +572,7 @@ var Zotero_Browser = new function() {
|
|||
});
|
||||
|
||||
translate.setHandler("attachmentProgress", function(obj, attachment, progress, error) {
|
||||
var itemProgress = attachmentsMap.get(attachment);
|
||||
var itemProgress = _attachmentsMap.get(attachment);
|
||||
if(progress === false) {
|
||||
itemProgress.setError();
|
||||
} else {
|
||||
|
|
|
@ -106,8 +106,6 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
});
|
||||
},
|
||||
|
||||
// ALL CODE BELOW THIS POINT IS EXECUTED ONLY IN NON-FIREFOX ENVIRONMENTS
|
||||
|
||||
/**
|
||||
* Polls for updates to attachment progress
|
||||
* @param items Items in Zotero.Item.toArray() format
|
||||
|
@ -162,6 +160,8 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
poll();
|
||||
},
|
||||
|
||||
// ALL CODE BELOW THIS POINT IS EXECUTED ONLY IN NON-FIREFOX ENVIRONMENTS
|
||||
|
||||
/**
|
||||
* Saves items to server
|
||||
* @param items Items in Zotero.Item.toArray() format
|
||||
|
@ -182,7 +182,7 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
|
||||
for(var i=0, n=items.length; i<n; i++) {
|
||||
var item = items[i];
|
||||
newItems.push(Zotero.Utilities.itemToServerJSON(item));
|
||||
newItems = newItems.concat(Zotero.Utilities.itemToServerJSON(item));
|
||||
if(typedArraysSupported) {
|
||||
for(var j=0; j<item.attachments.length; j++) {
|
||||
item.attachments[j].id = Zotero.Utilities.randomString();
|
||||
|
@ -193,34 +193,40 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
}
|
||||
|
||||
var me = this;
|
||||
Zotero.API.createItem({"items":newItems}, null, function(statusCode, response) {
|
||||
if(statusCode !== 201) {
|
||||
callback(false, new Error("Save to server failed"));
|
||||
} else {
|
||||
Zotero.debug("Translate: Save to server complete");
|
||||
|
||||
Zotero.Prefs.getCallback(["downloadAssociatedFiles", "automaticSnapshots"],
|
||||
function(prefs) {
|
||||
if(typedArraysSupported) {
|
||||
try {
|
||||
var newKeys = me._getItemKeysFromServerResponse(response);
|
||||
} catch(e) {
|
||||
callback(false, e);
|
||||
return;
|
||||
}
|
||||
|
||||
for(var i=0; i<items.length; i++) {
|
||||
var item = items[i], key = newKeys[i];
|
||||
if(item.attachments && item.attachments.length) {
|
||||
me._saveAttachmentsToServer(key, me._getFileBaseNameFromItem(item),
|
||||
item.attachments, prefs, attachmentCallback);
|
||||
}
|
||||
Zotero.API.createItem({"items":newItems}, function(statusCode, response) {
|
||||
if(statusCode !== 200) {
|
||||
callback(false, new Error("Save to server failed with "+statusCode+" "+response));
|
||||
retrun;
|
||||
}
|
||||
|
||||
try {
|
||||
var resp = JSON.parse(response);
|
||||
} catch(e) {
|
||||
callback(false, new Error("Unexpected response received from server"));
|
||||
return;
|
||||
}
|
||||
for(var i in resp.failed) {
|
||||
callback(false, new Error("Save to server failed with "+statusCode+" "+response));
|
||||
return;
|
||||
}
|
||||
|
||||
Zotero.debug("Translate: Save to server complete");
|
||||
Zotero.Prefs.getCallback(["downloadAssociatedFiles", "automaticSnapshots"],
|
||||
function(prefs) {
|
||||
|
||||
if(typedArraysSupported) {
|
||||
Zotero.debug(response);
|
||||
for(var i in resp.success) {
|
||||
var item = items[i], key = resp.success[i];
|
||||
if(item.attachments && item.attachments.length) {
|
||||
me._saveAttachmentsToServer(key, me._getFileBaseNameFromItem(item),
|
||||
item.attachments, prefs, attachmentCallback);
|
||||
}
|
||||
}
|
||||
|
||||
callback(true, items);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
callback(true, items);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -235,6 +241,7 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
* on failure or attachmentCallback(attachment, progressPercent) periodically during saving.
|
||||
*/
|
||||
"_saveAttachmentsToServer":function(itemKey, baseName, attachments, prefs, attachmentCallback) {
|
||||
Zotero.debug("saveattachmentstoserver");
|
||||
var me = this,
|
||||
uploadAttachments = [],
|
||||
retrieveHeadersForAttachments = attachments.length;
|
||||
|
@ -252,6 +259,7 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
var attachment = uploadAttachments[i];
|
||||
attachmentPayload.push({
|
||||
"itemType":"attachment",
|
||||
"parentItem":itemKey,
|
||||
"linkMode":attachment.linkMode,
|
||||
"title":(attachment.title ? attachment.title.toString() : "Untitled Attachment"),
|
||||
"accessDate":"CURRENT_TIMESTAMP",
|
||||
|
@ -261,25 +269,23 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
});
|
||||
}
|
||||
|
||||
Zotero.API.createItem({"items":attachmentPayload}, itemKey, function(statusCode, response) {
|
||||
var err;
|
||||
if(statusCode === 201) {
|
||||
Zotero.API.createItem({"items":attachmentPayload}, function(statusCode, response) {
|
||||
var resp;
|
||||
if(statusCode === 200) {
|
||||
try {
|
||||
var newKeys = me._getItemKeysFromServerResponse(response);
|
||||
} catch(e) {
|
||||
err = new Error("Unexpected response received from server");
|
||||
}
|
||||
} else {
|
||||
err = new Error("Unexpected status "+statusCode+" received from server");
|
||||
resp = JSON.parse(response);
|
||||
if(!resp.success) resp = undefined;
|
||||
} catch(e) {};
|
||||
}
|
||||
|
||||
Zotero.debug("Finished creating items");
|
||||
for(var i=0; i<uploadAttachments.length; i++) {
|
||||
var attachment = uploadAttachments[i];
|
||||
if(err) {
|
||||
attachmentProgress(attachment, false, err);
|
||||
if(!resp || !resp.success[i]) {
|
||||
attachmentCallback(attachment, false,
|
||||
new Error("Unexpected response received from server "+statusCode+" "+response));
|
||||
} else {
|
||||
attachment.key = newKeys[i];
|
||||
attachment.key = resp.success[i];
|
||||
|
||||
if(attachment.linkMode === "linked_url") {
|
||||
attachmentCallback(attachment, 100);
|
||||
|
@ -288,8 +294,6 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(err) Zotero.logError(err);
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -551,25 +555,6 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets item keys from a server response
|
||||
* @param {String} response ATOM response
|
||||
*/
|
||||
"_getItemKeysFromServerResponse":function(response) {
|
||||
try {
|
||||
response = (new DOMParser()).parseFromString(response, "text/xml");
|
||||
} catch(e) {
|
||||
throw new Error("Save to server returned invalid output");
|
||||
}
|
||||
var keyNodes = response.getElementsByTagNameNS("http://zotero.org/ns/api", "key");
|
||||
var newKeys = [];
|
||||
for(var i=0, n=keyNodes.length; i<n; i++) {
|
||||
newKeys.push("textContent" in keyNodes[i] ? keyNodes[i].textContent
|
||||
: keyNodes[i].innerText);
|
||||
}
|
||||
return newKeys;
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets the base name for an attachment from an item object. This mimics the default behavior
|
||||
* of Zotero.Attachments.getFileBaseNameFromItem
|
||||
|
|
|
@ -1497,5 +1497,5 @@ Zotero.Collection.prototype._refreshChildCollections = function () {
|
|||
|
||||
|
||||
Zotero.Collection.prototype._generateKey = function () {
|
||||
return Zotero.ID.getKey();
|
||||
return Zotero.Utilites.generateObjectKey();
|
||||
}
|
||||
|
|
|
@ -552,7 +552,7 @@ Zotero.Creator.prototype._checkValue = function (field, value) {
|
|||
|
||||
|
||||
Zotero.Creator.prototype._generateKey = function () {
|
||||
return Zotero.ID.getKey();
|
||||
return Zotero.Utilites.generateObjectKey();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -5189,7 +5189,7 @@ Zotero.Item.prototype._clearFieldChange = function (field) {
|
|||
|
||||
|
||||
Zotero.Item.prototype._generateKey = function () {
|
||||
return Zotero.ID.getKey();
|
||||
return Zotero.Utilites.generateObjectKey();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -773,6 +773,6 @@ Zotero.Tag.prototype._prepFieldChange = function (field) {
|
|||
|
||||
|
||||
Zotero.Tag.prototype._generateKey = function () {
|
||||
return Zotero.ID.getKey();
|
||||
return Zotero.Utilites.generateObjectKey();
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
Zotero.ID_Tracker = function () {
|
||||
this.get = get;
|
||||
this.getKey = getKey;
|
||||
this.getBigInt = getBigInt;
|
||||
this.skip = skip;
|
||||
this.getTableName = getTableName;
|
||||
|
@ -86,13 +85,6 @@ Zotero.ID_Tracker = function () {
|
|||
}
|
||||
|
||||
|
||||
function getKey() {
|
||||
// TODO: add 'L' and 'Y' after 3.0.11 cut-off
|
||||
var baseString = "23456789ABCDEFGHIJKMNPQRSTUVWXZ";
|
||||
return Zotero.randomString(8, baseString);
|
||||
}
|
||||
|
||||
|
||||
this.isValidKey = function (value) {
|
||||
var re = /^[23456789ABCDEFGHIJKLMNPQRSTUVWXYZ]{8}$/
|
||||
return re.test(value);
|
||||
|
|
|
@ -948,7 +948,7 @@ Zotero.Sync.Storage = new function () {
|
|||
let item = items.shift();
|
||||
let row = attachmentData[item.id];
|
||||
let lk = item.libraryKey;
|
||||
//Zotero.debug("Checking attachment file for item " + lk);
|
||||
Zotero.debug("Checking attachment file for item " + lk);
|
||||
|
||||
let nsIFile = item.getFile(row, true);
|
||||
if (!nsIFile) {
|
||||
|
|
|
@ -1304,8 +1304,6 @@ Zotero.Translate.Base.prototype = {
|
|||
if(!this._waitingForRPC) this._detectTranslatorsCollected();
|
||||
}
|
||||
} else {
|
||||
this._currentState = null;
|
||||
|
||||
// unset return value is equivalent to true
|
||||
if(returnValue === undefined) returnValue = true;
|
||||
|
||||
|
@ -1328,6 +1326,8 @@ Zotero.Translate.Base.prototype = {
|
|||
this._runHandler("error", error);
|
||||
}
|
||||
|
||||
this._currentState = null;
|
||||
|
||||
// call handlers
|
||||
this._runHandler("itemsDone", returnValue);
|
||||
if(returnValue) {
|
||||
|
@ -1413,7 +1413,7 @@ Zotero.Translate.Base.prototype = {
|
|||
* Checks if saving done, and if so, fires done event
|
||||
*/
|
||||
"_checkIfDone":function() {
|
||||
if(!this._savingItems && !this._savingAttachments.length && !this._currentState) {
|
||||
if(!this._savingItems && !this._savingAttachments.length) {
|
||||
this._runHandler("done", true);
|
||||
}
|
||||
},
|
||||
|
@ -1748,7 +1748,7 @@ Zotero.Translate.Web.prototype._translateTranslatorLoaded = function() {
|
|||
}, function(obj) { me._translateRPCComplete(obj) });
|
||||
} else if(runMode === Zotero.Translator.RUN_MODE_ZOTERO_SERVER) {
|
||||
var me = this;
|
||||
Zotero.API.createItem({"url":this.document.location.href.toString()}, null,
|
||||
Zotero.API.createItem({"url":this.document.location.href.toString()},
|
||||
function(statusCode, response) {
|
||||
me._translateServerComplete(statusCode, response);
|
||||
});
|
||||
|
@ -1800,7 +1800,7 @@ Zotero.Translate.Web.prototype._translateServerComplete = function(statusCode, r
|
|||
Zotero.API.createItem({
|
||||
"url":me.document.location.href.toString(),
|
||||
"items":selectedItems
|
||||
}, null,
|
||||
},
|
||||
function(statusCode, response) {
|
||||
me._translateServerComplete(statusCode, response);
|
||||
});
|
||||
|
|
|
@ -1255,10 +1255,15 @@ Zotero.Utilities = {
|
|||
},
|
||||
|
||||
/**
|
||||
* Converts an item from toArray() format to content=json format used by the server
|
||||
* Converts an item from toArray() format to an array of items in
|
||||
* the content=json format used by the server
|
||||
*/
|
||||
"itemToServerJSON":function(item) {
|
||||
var newItem = {};
|
||||
var newItem = {
|
||||
"itemKey":Zotero.Utilities.generateObjectKey(),
|
||||
"itemVersion":0
|
||||
},
|
||||
newItems = [newItem];
|
||||
|
||||
var typeID = Zotero.ItemTypes.getID(item.itemType);
|
||||
if(!typeID) {
|
||||
|
@ -1337,7 +1342,6 @@ Zotero.Utilities = {
|
|||
} else if(field === "notes") {
|
||||
// normalize notes
|
||||
var n = val.length;
|
||||
var newNotes = newItem.notes = new Array(n);
|
||||
for(var j=0; j<n; j++) {
|
||||
var note = val[j];
|
||||
if(typeof note === "object") {
|
||||
|
@ -1347,7 +1351,8 @@ Zotero.Utilities = {
|
|||
}
|
||||
note = note.note;
|
||||
}
|
||||
newNotes[j] = {"itemType":"note", "note":note.toString()};
|
||||
newItems.push({"itemType":"note", "parentItem":newItem.itemKey,
|
||||
"note":note.toString()});
|
||||
}
|
||||
} else if((fieldID = Zotero.ItemFields.getID(field))) {
|
||||
// if content is not a string, either stringify it or delete it
|
||||
|
@ -1378,7 +1383,7 @@ Zotero.Utilities = {
|
|||
}
|
||||
}
|
||||
|
||||
return newItem;
|
||||
return newItems;
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -1722,6 +1727,15 @@ Zotero.Utilities = {
|
|||
? "attachment-pdf" : "attachment-snapshot");
|
||||
},
|
||||
|
||||
/**
|
||||
* Generates a valid object key for the server API
|
||||
*/
|
||||
"generateObjectKey":function getKey() {
|
||||
// TODO: add 'L' and 'Y' after 3.0.11 cut-off
|
||||
var baseString = "23456789ABCDEFGHIJKMNPQRSTUVWXZ";
|
||||
return Zotero.Utilities.randomString(8, baseString);
|
||||
},
|
||||
|
||||
/**
|
||||
* Provides unicode support and other additional features for regular expressions
|
||||
* See https://github.com/slevithan/xregexp for usage
|
||||
|
|
Loading…
Reference in New Issue
Block a user