Skip to content
Snippets Groups Projects
Verified Commit 6b4fa61d authored by Lee Rowlands's avatar Lee Rowlands
Browse files

Issue #3340154 by godotislate, smustgrave: Link-widget throws exception when...

Issue #3340154 by godotislate, smustgrave: Link-widget throws exception when rebuilding a form with an invalid uri
parent 60a38dae
No related branches found
No related tags found
33 merge requests!8528Issue #3456871 by Tim Bozeman: Support NULL services,!8323Fix source code editing and in place front page site studio editing.,!6278Issue #3187770 by godotislate, smustgrave, catch, quietone: Views Rendered...,!3878Removed unused condition head title for views,!38582585169-10.1.x,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3668Resolve #3347842 "Deprecate the trusted",!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3147Issue #3328457: Replace most substr($a, $i) where $i is negative with str_ends_with(),!3146Issue #3328456: Replace substr($a, 0, $i) with str_starts_with(),!3133core/modules/system/css/components/hidden.module.css,!2964Issue #2865710 : Dependencies from only one instance of a widget are used in display modes,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2614Issue #2981326: Replace non-test usages of \Drupal::logger() with IoC injection,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!877Issue #2708101: Default value for link text is not saved,!844Resolve #3036010 "Updaters",!673Issue #3214208: FinishResponseSubscriber could create duplicate headers,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493
Pipeline #67173 passed with warnings
Pipeline: drupal

#67174

    ...@@ -184,14 +184,28 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen ...@@ -184,14 +184,28 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
    /** @var \Drupal\link\LinkItemInterface $item */ /** @var \Drupal\link\LinkItemInterface $item */
    $item = $items[$delta]; $item = $items[$delta];
    $display_uri = NULL;
    if (!$item->isEmpty()) {
    try {
    // The current field value could have been entered by a different user.
    // However, if it is inaccessible to the current user, do not display it
    // to them.
    if (\Drupal::currentUser()->hasPermission('link to any page') || $item->getUrl()->access()) {
    $display_uri = static::getUriAsDisplayableString($item->uri);
    }
    }
    catch (\InvalidArgumentException $e) {
    // If $item->uri is invalid, show value as is, so the user can see what
    // to edit.
    // @todo Add logging here in https://www.drupal.org/project/drupal/issues/3348020
    $display_uri = $item->uri;
    }
    }
    $element['uri'] = [ $element['uri'] = [
    '#type' => 'url', '#type' => 'url',
    '#title' => $this->t('URL'), '#title' => $this->t('URL'),
    '#placeholder' => $this->getSetting('placeholder_url'), '#placeholder' => $this->getSetting('placeholder_url'),
    // The current field value could have been entered by a different user. '#default_value' => $display_uri,
    // However, if it is inaccessible to the current user, do not display it
    // to them.
    '#default_value' => (!$item->isEmpty() && (\Drupal::currentUser()->hasPermission('link to any page') || $item->getUrl()->access())) ? static::getUriAsDisplayableString($item->uri) : NULL,
    '#element_validate' => [[static::class, 'validateUriElement']], '#element_validate' => [[static::class, 'validateUriElement']],
    '#maxlength' => 2048, '#maxlength' => 2048,
    '#required' => $element['#required'], '#required' => $element['#required'],
    ......
    ...@@ -884,4 +884,72 @@ protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) { ...@@ -884,4 +884,72 @@ protected function renderTestEntity($id, $view_mode = 'full', $reset = TRUE) {
    return (string) $output; return (string) $output;
    } }
    /**
    * Test link widget exception handled if link uri value is invalid.
    */
    public function testLinkWidgetCaughtExceptionEditingInvalidUrl(): void {
    $field_name = $this->randomMachineName();
    $this->fieldStorage = FieldStorageConfig::create([
    'field_name' => $field_name,
    'entity_type' => 'entity_test',
    'type' => 'link',
    'cardinality' => 1,
    ]);
    $this->fieldStorage->save();
    FieldConfig::create([
    'field_storage' => $this->fieldStorage,
    'label' => 'Link',
    'bundle' => 'entity_test',
    'settings' => [
    'title' => DRUPAL_OPTIONAL,
    'link_type' => LinkItemInterface::LINK_GENERIC,
    ],
    ])->save();
    $entityTypeManager = $this->container->get('entity_type.manager');
    $entityTypeManager
    ->getStorage('entity_form_display')
    ->load('entity_test.entity_test.default')
    ->setComponent($field_name, [
    'type' => 'link_default',
    ])
    ->save();
    $entityTypeManager
    ->getStorage('entity_view_display')
    ->create([
    'targetEntityType' => 'entity_test',
    'bundle' => 'entity_test',
    'mode' => 'full',
    'status' => TRUE,
    ])
    ->setComponent($field_name, [
    'type' => 'link',
    ])
    ->save();
    // Entities can be saved without validation, for example via migration.
    // Link fields may contain invalid uris such as external URLs without
    // scheme.
    $invalidUri = 'www.example.com';
    $invalidLinkUrlEntity = $entityTypeManager
    ->getStorage('entity_test')
    ->create([
    'name' => 'Test entity with invalid link URL',
    $field_name => ['uri' => $invalidUri],
    ]);
    $invalidLinkUrlEntity->save();
    // If a user without 'link to any page' permission edits an entity, widget
    // checks access by converting uri to Url object, which will throw an
    // InvalidArgumentException if uri is invalid.
    $this->drupalLogin($this->drupalCreateUser([
    'view test entity',
    'administer entity_test content',
    ]));
    $this->drupalGet("/entity_test/manage/{$invalidLinkUrlEntity->id()}/edit");
    $this->assertSession()->statusCodeEquals(200);
    $this->assertSession()->fieldValueEquals("{$field_name}[0][uri]", $invalidUri);
    }
    } }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment