diff --git a/core/modules/link/src/Plugin/migrate/process/FieldLink.php b/core/modules/link/src/Plugin/migrate/process/FieldLink.php index 680049ce508..9af61f176e7 100644 --- a/core/modules/link/src/Plugin/migrate/process/FieldLink.php +++ b/core/modules/link/src/Plugin/migrate/process/FieldLink.php @@ -119,7 +119,9 @@ class FieldLink extends ProcessPluginBase { $attributes = unserialize($attributes); } - if (!$attributes) { + // In rare cases Drupal 6/7 link attributes are triple serialized. To avoid + // further problems with them we set them to an empty array in this case. + if (!is_array($attributes)) { $attributes = []; } diff --git a/core/modules/link/tests/src/Unit/Plugin/migrate/process/FieldLinkTest.php b/core/modules/link/tests/src/Unit/Plugin/migrate/process/FieldLinkTest.php index f765f6af357..905d49e86b2 100644 --- a/core/modules/link/tests/src/Unit/Plugin/migrate/process/FieldLinkTest.php +++ b/core/modules/link/tests/src/Unit/Plugin/migrate/process/FieldLinkTest.php @@ -89,4 +89,27 @@ class FieldLinkTest extends UnitTestCase { ]; } + /** + * Test the attributes that are deeply serialized are discarded. + */ + public function testCanonicalizeUriSerialized() { + $link_plugin = new FieldLink([], '', [], $this->getMock(MigrationInterface::class)); + $migrate_executable = $this->getMock(MigrateExecutableInterface::class); + $row = new Row(); + + $transformed = $link_plugin->transform([ + 'url' => '', + 'title' => '', + 'attributes' => serialize(serialize(['not too deep'])), + ], $migrate_executable, $row, NULL); + $this->assertEquals(['not too deep'], $transformed['options']['attributes']); + + $transformed = $link_plugin->transform([ + 'url' => '', + 'title' => '', + 'attributes' => serialize(serialize(serialize(['too deep']))), + ], $migrate_executable, $row, NULL); + $this->assertEmpty($transformed['options']['attributes']); + } + }