Filter out blocks with duplicate IDs when checking for blocks
authorThalia <thalia.e.chan@googlemail.com>
Mon, 17 Jun 2019 09:56:49 +0000 (10:56 +0100)
committerThalia <thalia.e.chan@googlemail.com>
Mon, 17 Jun 2019 12:24:56 +0000 (13:24 +0100)
Bug: T225919
Change-Id: I76549072d53083e6057f4fd8fe963e8989daa25c

includes/block/BlockManager.php

index b11e76f..41ff893 100644 (file)
@@ -202,6 +202,9 @@ class BlockManager {
                        ] );
                }
 
+               // Filter out any duplicated blocks, e.g. from the cookie
+               $blocks = $this->getUniqueBlocks( $blocks );
+
                if ( count( $blocks ) > 0 ) {
                        if ( count( $blocks ) === 1 ) {
                                $block = $blocks[ 0 ];
@@ -219,6 +222,28 @@ class BlockManager {
                return null;
        }
 
+       /**
+        * Given a list of blocks, return a list blocks where each block either has a
+        * unique ID or has ID null.
+        *
+        * @param AbstractBlock[] $blocks
+        * @return AbstractBlock[]
+        */
+       private function getUniqueBlocks( $blocks ) {
+               $blockIds = [];
+               $uniqueBlocks = [];
+               foreach ( $blocks as $block ) {
+                       $id = $block->getId();
+                       if ( $id === null ) {
+                               $uniqueBlocks[] = $block;
+                       } elseif ( !isset( $blockIds[$id] ) ) {
+                               $uniqueBlocks[] = $block;
+                               $blockIds[$block->getId()] = true;
+                       }
+               }
+               return $uniqueBlocks;
+       }
+
        /**
         * Try to load a block from an ID given in a cookie value.
         *