diff --git a/addons/website/static/src/client_actions/website_preview/website_preview.js b/addons/website/static/src/client_actions/website_preview/website_preview.js index 158310de6b2..891624571fe 100644 --- a/addons/website/static/src/client_actions/website_preview/website_preview.js +++ b/addons/website/static/src/client_actions/website_preview/website_preview.js @@ -184,7 +184,7 @@ export class WebsitePreview extends Component { */ _isTopWindowURL({ host, pathname }) { const backendRoutes = ['/web', '/web/session/logout']; - return host !== window.location.host || (pathname && backendRoutes.includes(pathname)); + return host !== window.location.host || (pathname && (backendRoutes.includes(pathname) || pathname.startsWith('/@/'))); } _onPageLoaded() { diff --git a/addons/website/static/tests/tours/client_action_redirect.js b/addons/website/static/tests/tours/client_action_redirect.js new file mode 100644 index 00000000000..bce5db7cab8 --- /dev/null +++ b/addons/website/static/tests/tours/client_action_redirect.js @@ -0,0 +1,81 @@ +/** @odoo-module */ + +import tour from 'web_tour.tour'; + +const testUrl = '/test_client_action_redirect'; + +const goToFrontendSteps = [{ + content: "Go to the frontend", + trigger: 'body', + run: () => { + window.location.href = testUrl; + }, +}, { + content: "Check we are in the frontend", + trigger: 'body:not(:has(.o_website_preview)) #test_contact_FE', + run: () => null, // it's a check +}]; +const goToBackendSteps = [{ + content: "Go to the backend", + trigger: 'body', + run: () => { + window.location.href = `/@${testUrl}`; + }, +}, { + content: "Check we are in the backend", + trigger: '.o_website_preview', + run: () => null, // it's a check +}]; +const checkEditorSteps = [{ + content: "Check that the editor is loaded", + trigger: 'iframe body.editor_enable', + timeout: 30000, + run: () => null, // it's a check +}, { + content: "exit edit mode", + trigger: '.o_we_website_top_actions button.btn-primary:contains("Save")', +}, { + content: "wait for editor to close", + trigger: 'iframe body:not(.editor_enable)', + run: () => null, // It's a check +}]; + +tour.register('client_action_redirect', { + test: true, + url: testUrl, +}, +[ + // Case 1: From frontend, click on `enable_editor=1` link without `/@/` in it + ...goToFrontendSteps, + { + content: "Click on the link to frontend", + trigger: '#test_contact_FE', + }, + ...checkEditorSteps, + + // Case 2: From frontend, click on `enable_editor=1` link with `/@/` in it + ...goToFrontendSteps, + { + content: "Click on the link to backend", + trigger: '#test_contact_BE', + }, + ...checkEditorSteps, + + // Case 3: From backend, click on `enable_editor=1` link without `/@/` in it + // TODO: This will be fixed in another fix related to the listening of the + // URL changes from the client action. + // ...goToBackendSteps, + // { + // content: "Click on the link to frontend (2)", + // trigger: 'iframe #test_contact_FR', + // }, + // ...checkEditorSteps, + + // Case 4: From backend, click on `enable_editor=1` link with `/@/` in it + ...goToBackendSteps, + { + content: "Click on the link to backend (2)", + trigger: 'iframe #test_contact_BE', + }, + ...checkEditorSteps, +]); diff --git a/addons/website/tests/__init__.py b/addons/website/tests/__init__.py index 6e18cdb5568..2529675f302 100644 --- a/addons/website/tests/__init__.py +++ b/addons/website/tests/__init__.py @@ -4,6 +4,7 @@ from . import test_attachment from . import test_auth_signup_uninvited from . import test_automatic_editor from . import test_base_url +from . import test_client_action from . import test_configurator from . import test_controllers from . import test_converter diff --git a/addons/website/tests/test_client_action.py b/addons/website/tests/test_client_action.py new file mode 100644 index 00000000000..bd1e34bb734 --- /dev/null +++ b/addons/website/tests/test_client_action.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import odoo.tests + + +@odoo.tests.common.tagged('post_install', '-at_install') +class TestClientAction(odoo.tests.HttpCase): + + def test_01_client_action_redirect(self): + page = self.env['website.page'].create({ + 'name': 'Base', + 'type': 'qweb', + 'arch': """ + + Contact + Contact + + """, + 'key': 'website.test_client_action_redirect', + 'url': '/test_client_action_redirect', + 'is_published': True, + }) + self.start_tour(page.url, 'client_action_redirect', login='admin')