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 = $('
', { 'class': TOOLBAR_CLS, id: uid(), @@ -304,6 +310,7 @@ define([ }); }; var show = function () { + if (Bar.isEmbed) { $content.hide(); return; } $content.show(); if (mobile) { $ck.hide(); @@ -440,7 +447,7 @@ define([ }; var createFileShare = function (toolbar) { - throw new Error('TODO: Update createFileShare to add "embed" and work in secure iframes'); + if (true) { throw new Error('TODO: Update createFileShare to add "embed" and work in secure iframes'); } if (!window.location.hash) { throw new Error("Unable to display the share button: hash required in the URL"); } diff --git a/www/slide/slide.js b/www/slide/slide.js index 5d1af0ab0..98932cc0d 100644 --- a/www/slide/slide.js +++ b/www/slide/slide.js @@ -1,7 +1,8 @@ define([ 'jquery', '/common/diffMarked.js', -],function ($, DiffMd) { + '/common/cryptpad-common.js.js', +],function ($, DiffMd, Cryptpad) { var Slide = { index: 0, @@ -116,13 +117,13 @@ define([ }; var isPresentURL = Slide.isPresentURL = function () { - var hash = window.location.hash; - // Present mode has /present at the end of the hash - var urlLastFragment = hash.slice(hash.lastIndexOf('/')+1); - return urlLastFragment === "present"; + var parsed = Cryptpad.parsePadUrl(window.location.href); + return parsed && parsed.hashData && parsed.hashData.present; }; var show = Slide.show = function (bool, content) { + var parsed = Cryptpad.parsePadUrl(window.location.href); + var hashData = parsed.hashData || {}; Slide.shown = bool; if (bool) { Slide.update(content); @@ -131,10 +132,7 @@ define([ $(ifrw).focus(); change(null, Slide.index); if (!isPresentURL()) { - if (window.location.href.slice(-1) !== '/') { - window.location.hash += '/'; - } - window.location.hash += 'present'; + window.location += parsed.getUrl({present: true, embed: hashData.embed}); } $pad.contents().find('.cryptpad-present-button').hide(); $pad.contents().find('.cryptpad-source-button').show(); @@ -144,7 +142,7 @@ define([ updateFontSize(); return; } - window.location.hash = window.location.hash.replace(/\/present$/, '/'); + window.location = parsed.getUrl({embed: hashData.embed}); change(Slide.index, null); $pad.contents().find('.cryptpad-present-button').show(); $pad.contents().find('.cryptpad-source-button').hide();