diff -u b/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php b/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php
--- b/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php
+++ b/src/Plugin/Field/FieldWidget/EntityReferenceBrowserWidget.php
@@ -560,11 +560,15 @@
    *   Data that should persist after the Entity Browser is rendered.
    */
   protected function getPersistentData() {
+    $settings = $this->fieldDefinition->getSettings();
+    $handler = $settings['handler_settings'];
     return [
       'validators' => [
-        'entity_type' => ['type' => $this->fieldDefinition->getFieldStorageDefinition()->getSetting('target_type')],
+        'entity_type' => ['type' => $settings['target_type']],
+      ],
+      'widget_context' => [
+        'target_bundles' => !empty($handler['target_bundles']) ? $handler['target_bundles'] : [],
       ],
-      'widget_context' => [],
     ];
   }
 
diff -u b/src/Plugin/Field/FieldWidget/FileBrowserWidget.php b/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
--- b/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
+++ b/src/Plugin/Field/FieldWidget/FileBrowserWidget.php
@@ -16,6 +16,7 @@
 use Drupal\image\Entity\ImageStyle;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface;
 
 /**
  * Entity browser file widget.
@@ -62,6 +63,13 @@
   protected $displayRepository;
 
   /**
+   * The mime type guesser service.
+   *
+   * @var \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface
+   */
+  protected $mimeTypeGuesser;
+
+  /**
    * Constructs widget plugin.
    *
    * @param string $plugin_id
@@ -86,13 +94,16 @@
    *   The entity display repository service.
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler service.
+   * @param \Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface $mime_type_guesser
+   *   The mime type guesser service.
    */
-  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, EventDispatcherInterface $event_dispatcher, FieldWidgetDisplayManager $field_display_manager, ConfigFactoryInterface $config_factory, EntityDisplayRepositoryInterface $display_repository, ModuleHandlerInterface $module_handler) {
+  public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, array $third_party_settings, EntityTypeManagerInterface $entity_type_manager, EventDispatcherInterface $event_dispatcher, FieldWidgetDisplayManager $field_display_manager, ConfigFactoryInterface $config_factory, EntityDisplayRepositoryInterface $display_repository, ModuleHandlerInterface $module_handler, MimeTypeGuesserInterface $mime_type_guesser) {
     parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $third_party_settings, $entity_type_manager, $event_dispatcher, $field_display_manager, $module_handler);
     $this->entityTypeManager = $entity_type_manager;
     $this->fieldDisplayManager = $field_display_manager;
     $this->configFactory = $config_factory;
     $this->displayRepository = $display_repository;
+    $this->mimeTypeGuesser = $mime_type_guesser;
   }
 
   /**
@@ -110,7 +121,8 @@
       $container->get('plugin.manager.entity_browser.field_widget_display'),
       $container->get('config.factory'),
       $container->get('entity_display.repository'),
-      $container->get('module_handler')
+      $container->get('module_handler'),
+      $container->get('file.mime_type.guesser')
     );
   }
 
@@ -486,6 +498,16 @@
     // Provide context for widgets to enhance their configuration.
     $data['widget_context']['upload_location'] = $settings['uri_scheme'] . '://' . $settings['file_directory'];
     $data['widget_context']['upload_validators'] = $this->getFileValidators(TRUE);
+    // Assemble valid mime types for filtering. This is required if we want to
+    // contextually filter allowed extensions in views, as views arguments can
+    // only filter on exact values. Otherwise we would pass %png or use REGEXP.
+    $mimetypes = [];
+    foreach (explode(' ', $settings['file_extensions']) as $extension) {
+      if ($guess = $this->mimeTypeGuesser->guess('file.' . $extension)) {
+        $mimetypes[] = $guess;
+      }
+    }
+    $data['widget_context']['target_file_mimetypes'] = $mimetypes;
     return $data;
   }
 
only in patch2:
unchanged:
--- /dev/null
+++ b/src/Plugin/views/argument_default/EntityBrowserWidgetContext.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Drupal\entity_browser\Plugin\views\argument_default;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface;
+use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * The entity browser widget context argument default handler.
+ *
+ * @ViewsArgumentDefault(
+ *   id = "entity_browser_widget_context",
+ *   title = @Translation("Entity Browser Context")
+ * )
+ */
+class EntityBrowserWidgetContext extends ArgumentDefaultPluginBase {
+
+  /**
+   * The selection storage.
+   *
+   * @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface
+   */
+  protected $selectionStorage;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, KeyValueStoreExpirableInterface $selection_storage) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->selectionStorage = $selection_storage;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('entity_browser.selection_storage')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['context_key'] = ['default' => ''];
+    $options['fallback'] = ['default' => ''];
+    $options['multiple'] = ['default' => 'and'];
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
+    parent::buildOptionsForm($form, $form_state);
+    $form['context_key'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Context key'),
+      '#description' => $this->t('The key within the widget context. If the corresponding value is an array its values will be joined with an AND.'),
+      '#default_value' => $this->options['context_key'],
+    ];
+    $form['fallback'] = [
+      '#type' => 'textfield',
+      '#title' => $this->t('Fallback value'),
+      '#description' => $this->t('The fallback value to use when the context is not present. (ex: "all")'),
+      '#default_value' => $this->options['fallback'],
+    ];
+    $form['multiple'] = [
+      '#type' => 'radios',
+      '#title' => $this->t('Multiple values'),
+      '#description' => $this->t('Conjunction to use when handling multiple values.'),
+      '#default_value' => $this->options['multiple'],
+      '#options' => [
+        'and' => $this->t('AND'),
+        'or' => $this->t('OR'),
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access() {
+    return $this->view->getDisplay()->pluginId === 'entity_browser';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getArgument() {
+    $current_request = $this->view->getRequest();
+    $context_key = $this->options['context_key'];
+    $argument = $this->options['fallback'];
+    // Check if the widget context is available.
+    if (!empty($context_key) && $current_request->query->has('uuid')) {
+      $uuid = $current_request->query->get('uuid');
+      if ($storage = $this->selectionStorage->get($uuid)) {
+        if (isset($storage['widget_context']) && !empty($storage['widget_context'][$context_key])) {
+          $value = $storage['widget_context'][$context_key];
+          if (is_string($value)) {
+            $argument = $value;
+          }
+          // If the context value is an array, test that it can be imploded.
+          else if (is_array($value)) {
+            $non_scalar = array_filter($value, function ($item) {
+              return ! is_scalar($item);
+            });
+            if (empty($non_scalar)) {
+              $conjunction = ($this->options['multiple'] == 'and') ? ',' : '+';
+              $argument = implode($conjunction, $value);
+            }
+          }
+        }
+      }
+    }
+    return $argument;
+  }
+
+}
