Skip to content
Snippets Groups Projects
Verified Commit 9b977fc3 authored by Théodore Biadala's avatar Théodore Biadala
Browse files

Issue #3463875 by spokje, jrb, godotislate, smustgrave: Ensure uniqueBundleId is unique in LoadJS

(cherry picked from commit d44fb628)
parent b53484ab
Branches
Tags
8 merge requests!10602Issue #3438769 by vinmayiswamy, antonnavi, michelle, amateescu: Sub workspace does not clear,!10301Issue #3469309 by mstrelan, smustgrave, moshe weitzman: Use one-time login...,!10187Issue #3487488 by dakwamine: ExtensionMimeTypeGuesser::guessMimeType must support file names with "0" (zero) like foo.0.zip,!9929Issue #3445469 by pooja_sharma, smustgrave: Add additional test coverage for...,!9787Resolve issue 3479427 - bootstrap barrio issue under Windows,!6502Draft: Resolve #2938524 "Plach testing issue",!38582585169-10.1.x,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key
Pipeline #303773 passed with warnings
Pipeline: drupal

#303813

    Pipeline: drupal

    #303797

      Pipeline: drupal

      #303786

        +1
        ......@@ -1716,16 +1716,18 @@
        }
        const allUniqueBundleIds = response.data.map(function (style) {
        const uniqueBundleId = style.href + ajax.instanceIndex;
        const uniqueBundleId = style.href;
        // Force file to load as a CSS stylesheet using 'css!' flag.
        loadjs(`css!${style.href}`, uniqueBundleId, {
        before(path, styleEl) {
        // This allows all attributes to be added, like media.
        Object.keys(style).forEach((attributeKey) => {
        styleEl.setAttribute(attributeKey, style[attributeKey]);
        });
        },
        });
        if (!loadjs.isDefined(uniqueBundleId)) {
        loadjs(`css!${style.href}`, uniqueBundleId, {
        before(path, styleEl) {
        // This allows all attributes to be added, like media.
        Object.keys(style).forEach((attributeKey) => {
        styleEl.setAttribute(attributeKey, style[attributeKey]);
        });
        },
        });
        }
        return uniqueBundleId;
        });
        // Returns the promise so that the next AJAX command waits on the
        ......@@ -1791,32 +1793,31 @@
        const parentEl = document.querySelector(response.selector || 'body');
        const settings = ajax.settings || drupalSettings;
        const allUniqueBundleIds = response.data.map((script) => {
        // loadjs requires a unique ID, and an AJAX instance's `instanceIndex`
        // is guaranteed to be unique.
        // @see Drupal.behaviors.AJAX.detach
        const uniqueBundleId = script.src + ajax.instanceIndex;
        loadjs(script.src, uniqueBundleId, {
        // The default loadjs behavior is to load script with async, in Drupal
        // we need to explicitly tell scripts to load async, this is set in
        // the before callback below if necessary.
        async: false,
        before(path, scriptEl) {
        // This allows all attributes to be added, like defer, async and
        // crossorigin.
        Object.keys(script).forEach((attributeKey) => {
        scriptEl.setAttribute(attributeKey, script[attributeKey]);
        });
        // By default, loadjs appends the script to the head. When scripts
        // are loaded via AJAX, their location has no impact on
        // functionality. But, since non-AJAX loaded scripts can choose
        // their parent element, we provide that option here for the sake of
        // consistency.
        parentEl.appendChild(scriptEl);
        // Return false to bypass loadjs' default DOM insertion mechanism.
        return false;
        },
        });
        const uniqueBundleId = script.src;
        if (!loadjs.isDefined(uniqueBundleId)) {
        loadjs(script.src, uniqueBundleId, {
        // The default loadjs behavior is to load script with async, in Drupal
        // we need to explicitly tell scripts to load async, this is set in
        // the before callback below if necessary.
        async: false,
        before(path, scriptEl) {
        // This allows all attributes to be added, like defer, async and
        // crossorigin.
        Object.keys(script).forEach((attributeKey) => {
        scriptEl.setAttribute(attributeKey, script[attributeKey]);
        });
        // By default, loadjs appends the script to the head. When scripts
        // are loaded via AJAX, their location has no impact on
        // functionality. But, since non-AJAX loaded scripts can choose
        // their parent element, we provide that option here for the sake of
        // consistency.
        parentEl.appendChild(scriptEl);
        // Return false to bypass loadjs' default DOM insertion mechanism.
        return false;
        },
        });
        }
        return uniqueBundleId;
        });
        // Returns the promise so that the next AJAX command waits on the
        ......
        <?php
        declare(strict_types=1);
        namespace Drupal\Tests\config\FunctionalJavascript;
        use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
        /**
        * Tests the user interface for importing configuration.
        *
        * @group config
        */
        class ConfigImportUIAjaxTest extends WebDriverTestBase {
        /**
        * {@inheritdoc}
        */
        protected static $modules = [
        'config',
        ];
        /**
        * {@inheritdoc}
        */
        protected $defaultTheme = 'stark';
        /**
        * Tests an updated configuration object can be viewed more than once.
        */
        public function testImport(): void {
        $name = 'system.site';
        $assert_session = $this->assertSession();
        $page = $this->getSession()->getPage();
        $user = $this->drupalCreateUser(['synchronize configuration']);
        $this->drupalLogin($user);
        $this->copyConfig($this->container->get('config.storage'), $this->container->get('config.storage.sync'));
        // Create updated configuration object.
        $new_site_name = 'Config import test ' . $this->randomString();
        $sync = $this->container->get('config.storage.sync');
        // Create updated configuration object.
        $config_data = $this->config('system.site')->get();
        $config_data['name'] = $new_site_name;
        $sync->write('system.site', $config_data);
        $this->assertTrue($sync->exists($name), $name . ' found.');
        // Verify that system.site appears as ready to import.
        $this->drupalGet('admin/config/development/configuration');
        $this->assertSession()->responseContains('<td>' . $name);
        $this->assertSession()->buttonExists('Import all');
        // Click the dropbutton to show the differences in a modal and close it.
        $page->find('css', '.dropbutton-action')->click();
        $assert_session->waitForElementVisible('css', '.ui-dialog');
        $assert_session->assertVisibleInViewport('css', '.ui-dialog .ui-dialog-content');
        $page->pressButton('Close');
        $assert_session->assertNoElementAfterWait('css', '.ui-dialog');
        // Do this again to make sure no JavaScript errors occur on revisits.
        $page->find('css', '.dropbutton-action')->click();
        $assert_session->waitForElementVisible('css', '.ui-dialog');
        $assert_session->assertVisibleInViewport('css', '.ui-dialog .ui-dialog-content');
        $page->pressButton('Close');
        $assert_session->assertNoElementAfterWait('css', '.ui-dialog');
        }
        }
        0% Loading or .
        You are about to add 0 people to the discussion. Proceed with caution.
        Please register or to comment