From b714d00d7f0562bf88260b407a23224279e676ae Mon Sep 17 00:00:00 2001
From: webchick <drupal@webchick.net>
Date: Tue, 20 Sep 2016 12:16:27 -0700
Subject: [PATCH] =?UTF-8?q?Issue=20#2307451=20by=20martin=5Fq,=20G=C3=A1bo?=
 =?UTF-8?q?r=20Hojtsy,=20Manjit.Singh,=20Dave=20Reid,=20iantresman,=20gior?=
 =?UTF-8?q?gio79,=20swentel,=20slashrsm,=20Bojhan,=20yoroy,=20rymo,=20xjm,?=
 =?UTF-8?q?=20Wim=20Leers,=20Saphyel,=20tstoeckler:=20Image=20file=20field?=
 =?UTF-8?q?s=20do=20not=20limit=20accepted=20file=20types=20in=20HTML?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 core/modules/file/src/Element/ManagedFile.php                 | 4 ++++
 .../image/src/Plugin/Field/FieldWidget/ImageWidget.php        | 3 +++
 core/modules/image/src/Tests/ImageFieldWidgetTest.php         | 1 +
 3 files changed, 8 insertions(+)

diff --git a/core/modules/file/src/Element/ManagedFile.php b/core/modules/file/src/Element/ManagedFile.php
index 426f40c03aa9..f465b181ac32 100644
--- a/core/modules/file/src/Element/ManagedFile.php
+++ b/core/modules/file/src/Element/ManagedFile.php
@@ -49,6 +49,7 @@ public function getInfo() {
       '#attached' => [
         'library' => ['file/drupal.file'],
       ],
+      '#accept' => NULL,
     ];
   }
 
@@ -308,6 +309,9 @@ public static function processManagedFile(&$element, FormStateInterface $form_st
       '#weight' => -10,
       '#error_no_message' => TRUE,
     ];
+    if (!empty($element['#accept'])) {
+      $element['upload']['#attributes'] = ['accept' => $element['#accept']];
+    }
 
     if (!empty($fids) && $element['#files']) {
       foreach ($element['#files'] as $delta => $file) {
diff --git a/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php b/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php
index 2fe584119da2..f881419c0ed2 100644
--- a/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php
+++ b/core/modules/image/src/Plugin/Field/FieldWidget/ImageWidget.php
@@ -123,6 +123,9 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $extensions = array_intersect(explode(' ', $extensions), $supported_extensions);
     $element['#upload_validators']['file_validate_extensions'][0] = implode(' ', $extensions);
 
+    // Add mobile device image capture acceptance.
+    $element['#accept'] = 'image/*';
+
     // Add properties needed by process() method.
     $element['#preview_image_style'] = $this->getSetting('preview_image_style');
     $element['#title_field'] = $field_settings['title_field'];
diff --git a/core/modules/image/src/Tests/ImageFieldWidgetTest.php b/core/modules/image/src/Tests/ImageFieldWidgetTest.php
index 52d9e4d5ca65..85e764b41d73 100644
--- a/core/modules/image/src/Tests/ImageFieldWidgetTest.php
+++ b/core/modules/image/src/Tests/ImageFieldWidgetTest.php
@@ -25,6 +25,7 @@ public function testWidgetElement() {
     $this->createImageField($field_name, 'article', array(), $field_settings, array(), array(), 'Image test on [site:name]');
     $this->drupalGet('node/add/article');
     $this->assertNotEqual(0, count($this->xpath('//div[contains(@class, "field--widget-image-image")]')), 'Image field widget found on add/node page', 'Browser');
+    $this->assertNotEqual(0, count($this->xpath('//input[contains(@accept, "image/*")]')), 'Image field widget limits accepted files.', 'Browser');
     $this->assertNoText('Image test on [site:name]');
   }
 
-- 
GitLab