View source  
  <?php
namespace Drupal\webform_share\Element;
use Drupal\Core\Render\Element\RenderElement;
use Drupal\Core\Security\TrustedCallbackInterface;
use Drupal\Core\Url;
use Drupal\webform\Plugin\WebformSourceEntity\QueryStringWebformSourceEntity;
class WebformShareIframe extends RenderElement implements TrustedCallbackInterface {
  
  const LIBRARY = 'iframe-resizer';
  
  const VERSION = '4.2.10';
  
  public function getInfo() {
    $class = get_class($this);
    return [
      '#webform' => NULL,
      '#source_entity' => NULL,
      '#javascript' => FALSE,
      '#script' => '//cdn.jsdelivr.net/gh/davidjbradshaw/iframe-resizer@' . static::VERSION . '/js/iframeResizer.min.js',
      '#query' => [],
      '#options' => [],
      '#test' => [],
      '#theme' => 'webform_share_iframe',
      '#pre_render' => [
        [
          $class,
          'preRenderWebformShareIframe',
        ],
      ],
    ];
  }
  
  public static function preRenderWebformShareIframe($element) {
    
    $webform = $element['#webform'];
    
    $source_entity = $element['#source_entity'];
    
    if ($element['#javascript']) {
      
      $route_name = 'entity.webform.share_page.javascript';
      $route_parameters = [
        'webform' => $webform
          ->id(),
        'library' => static::LIBRARY,
        'version' => static::VERSION,
      ];
      $attributes = [
        'style' => 'width:1px;min-width:100%',
      ];
    }
    else {
      
      $route_name = 'entity.webform.share_page';
      $route_parameters = [
        'webform' => $webform
          ->id(),
      ];
      $attributes = [
        'style' => 'width:100%;height:600px;border:none',
      ];
    }
    $route_options = QueryStringWebformSourceEntity::getRouteOptionsQuery($source_entity);
    $route_options += [
      'query' => [],
    ];
    
    if ($element['#query']) {
      $route_options['query'] += $element['#query'];
    }
    
    if ($element['#test']) {
      $route_options['query']['_webform_test'] = $webform
        ->id();
    }
    if (empty($route_options['query'])) {
      unset($route_options['query']);
    }
    
    $url = Url::fromRoute($route_name, $route_parameters, $route_options);
    
    $src = preg_replace('#^https?:#', '', $url
      ->setAbsolute()
      ->toString());
    $title = $webform
      ->label() . ' | ' . \Drupal::config('system.site')
      ->get('name');
    $element += [
      '#attributes' => [],
    ];
    $element['#attributes'] += [
      'src' => $src,
      'title' => $title,
      'class' => [],
      'frameborder' => '0',
      'allow' => 'geolocation; microphone; camera',
      'allowtransparency' => 'true',
      'allowfullscreen' => 'true',
    ] + $attributes;
    return $element;
  }
  
  public static function trustedCallbacks() {
    return [
      'preRenderWebformShareIframe',
    ];
  }
}