diff --git a/www/assert/main.js b/www/assert/main.js index 6f924f1b0..0913674ae 100644 --- a/www/assert/main.js +++ b/www/assert/main.js @@ -193,6 +193,39 @@ define([ && secret.hashData.present); }, "Couldn't handle multiple successive slashes"); + // test support for present & embed mode in hashes + assert(function (cb) { + var secret = Cryptpad.parsePadUrl('/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/embed/present/'); + return cb(secret.hashData.version === 1 + && secret.hashData.mode === "edit" + && secret.hashData.channel === "CmN5+YJkrHFS3NSBg-P7Sg" + && secret.hashData.key === "DNZ2wcG683GscU4fyOyqA87G" + && secret.hashData.present + && secret.hashData.embed); + }, "Couldn't handle multiple successive slashes"); + + // test support for present & embed mode in hashes + assert(function (cb) { + var secret = Cryptpad.parsePadUrl('/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/present/embed'); + return cb(secret.hashData.version === 1 + && secret.hashData.mode === "edit" + && secret.hashData.channel === "CmN5+YJkrHFS3NSBg-P7Sg" + && secret.hashData.key === "DNZ2wcG683GscU4fyOyqA87G" + && secret.hashData.present + && secret.hashData.embed); + }, "Couldn't handle multiple successive slashes"); + + // test support for embed mode in hashes + assert(function (cb) { + var secret = Cryptpad.parsePadUrl('/pad/#/1/edit//CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G///embed//'); + return cb(secret.hashData.version === 1 + && secret.hashData.mode === "edit" + && secret.hashData.channel === "CmN5+YJkrHFS3NSBg-P7Sg" + && secret.hashData.key === "DNZ2wcG683GscU4fyOyqA87G" + && !secret.hashData.present + && secret.hashData.embed); + }, "Couldn't handle multiple successive slashes"); + // test support for trailing slash assert(function (cb) { var secret = Cryptpad.parsePadUrl('/pad/#/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI/'); diff --git a/www/common/common-hash.js b/www/common/common-hash.js index 5ed7ece36..ead686664 100644 --- a/www/common/common-hash.js +++ b/www/common/common-hash.js @@ -68,7 +68,9 @@ Version 1 parsed.mode = hashArr[2]; parsed.channel = hashArr[3]; parsed.key = hashArr[4].replace(/-/g, '/'); - parsed.present = typeof(hashArr[5]) === "string" && hashArr[5] === 'present'; + var options = hashArr.slice(5); + parsed.present = options.indexOf('present') !== -1; + parsed.embed = options.indexOf('embed') !== -1; return parsed; } return parsed; @@ -115,6 +117,27 @@ Version 1 var idx; + ret.getUrl = function (options) { + options = options || {}; + var url = '/'; + if (!ret.type) { return url; } + url += ret.type + '/'; + if (!ret.hashData) { return url; } + if (ret.hashData.type !== 'pad') { return url + '/#' + ret.hash; } + if (ret.hashData.version !== 1) { throw new Error("Only v1 hashes are managed here."); } + url += '#/' + ret.hashData.version + + '/' + ret.hashData.mode + + '/' + ret.hashData.channel.replace(/\//g, '-') + + '/' + ret.hashData.key.replace(/\//g, '-') +'/'; + if (options.embed) { + url += 'embed/'; + } + if (options.present) { + url += 'present/'; + } + return url; + }; + if (!/^https*:\/\//.test(href)) { idx = href.indexOf('/#'); ret.type = href.slice(1, idx); diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 6b07380ed..87168ca7c 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -674,7 +674,8 @@ define([ var href = typeof padHref === "string" ? padHref : window.location.href; var parsed = parsePadUrl(href); if (!parsed.hash) { return; } - href = getRelativeHref(href); + href = parsed.getUrl({present: parsed.present}); + //href = getRelativeHref(href); // getRecentPads return the array from the drive, not a copy // We don't have to call "set..." at the end, everything is stored with listmap getRecentPads(function (err, recent) { diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 1cecf279b..189bab6e2 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -82,7 +82,9 @@ define([ isTemplate: Cryptpad.isTemplate(window.location.href), feedbackAllowed: Cryptpad.isFeedbackAllowed(), friends: proxy.friends || {}, - settings: proxy.settings || {} + settings: proxy.settings || {}, + isPresent: parsed.hashData && parsed.hashData.present, + isEmbed: parsed.hashData && parsed.hashData.embed, } }); }); @@ -290,6 +292,13 @@ define([ readOnly: readOnly, crypto: Crypto.createEncryptor(secret.keys), onConnect: function (wc) { + if (window.location.hash && window.location.hash !== '#') { + window.location = parsed.getUrl({ + present: parsed.hashData.present, + embed: parsed.hashData.embed + }); + return; + } if (readOnly) { return; } Cryptpad.replaceHash(Cryptpad.getEditHashFromKeys(wc.id, secret.keys)); } diff --git a/www/common/toolbar3.js b/www/common/toolbar3.js index 4e07d25d6..7c8d4dd1c 100644 --- a/www/common/toolbar3.js +++ b/www/common/toolbar3.js @@ -50,6 +50,12 @@ define([ var createRealtimeToolbar = function (config) { if (!config.$container) { return; } var $container = config.$container; + + var isEmbed = Bar.isEmbed = config.metadataMgr.getPrivateData().isEmbed; + if (isEmbed) { + $container.hide(); + } + var $toolbar = $('