diff --git a/app/assets/javascripts/discourse/app/lib/load-oneboxes.js b/app/assets/javascripts/discourse/app/lib/load-oneboxes.js index 29ced7b5919..0be10658ecf 100644 --- a/app/assets/javascripts/discourse/app/lib/load-oneboxes.js +++ b/app/assets/javascripts/discourse/app/lib/load-oneboxes.js @@ -23,19 +23,20 @@ export function loadOneboxes( container .querySelectorAll(`a.onebox, a.inline-onebox-loading`) .forEach((link) => { - const text = link.textContent; - const isInline = link.getAttribute("class") === "inline-onebox-loading"; - const m = isInline ? inlineOneboxes : oneboxes; + const isInline = link.classList.contains("inline-onebox-loading"); + + // maps URLs to their link elements + const map = isInline ? inlineOneboxes : oneboxes; if (loadedOneboxes < maxOneboxes) { - if (m[text] === undefined) { - m[text] = []; + if (map[link.href] === undefined) { + map[link.href] = []; loadedOneboxes++; } - m[text].push(link); + map[link.href].push(link); } else { - if (m[text] !== undefined) { - m[text].push(link); + if (map[link.href] !== undefined) { + map[link.href].push(link); } else if (isInline) { link.classList.remove("inline-onebox-loading"); } diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js index 04ad220536d..cc8ea8eecef 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-onebox-test.js @@ -41,3 +41,42 @@ This is another test { + server.get("/inline-onebox", () => { + ++requestsCount; + return helper.response({ "inline-oneboxes": [] }); + }); + }); + + test("Uses cached inline onebox", async function (assert) { + requestsCount = 0; + + await visit("/t/internationalization-localization/280"); + await click("#topic-footer-buttons .btn.create"); + + await fillIn(".d-editor-input", `Test www.example.com/page`); + assert.equal(requestsCount, 1); + assert.equal( + queryAll(".d-editor-preview").html().trim(), + '

Test www.example.com/page

' + ); + + await fillIn(".d-editor-input", `Test www.example.com/page Test`); + assert.equal(requestsCount, 1); + assert.equal( + queryAll(".d-editor-preview").html().trim(), + '

Test www.example.com/page Test

' + ); + }); +}); diff --git a/app/assets/javascripts/pretty-text/addon/inline-oneboxer.js b/app/assets/javascripts/pretty-text/addon/inline-oneboxer.js index cbed77dd4f9..010b6a9f064 100644 --- a/app/assets/javascripts/pretty-text/addon/inline-oneboxer.js +++ b/app/assets/javascripts/pretty-text/addon/inline-oneboxer.js @@ -3,14 +3,20 @@ const _cache = {}; export function applyInlineOneboxes(inline, ajax, opts) { opts = opts || {}; - Object.keys(inline).forEach((url) => { + const urls = Object.keys(inline).filter((url) => !_cache[url]); + + urls.forEach((url) => { // cache a blank locally, so we never trigger a lookup _cache[url] = {}; }); - return ajax("/inline-onebox", { + if (urls.length === 0) { + return; + } + + ajax("/inline-onebox", { data: { - urls: Object.keys(inline), + urls, category_id: opts.categoryId, topic_id: opts.topicId, },