diff --git a/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Libraries/LibWeb/HTML/HTMLInputElement.cpp index ca46d705a4f..ac12a592431 100644 --- a/Libraries/LibWeb/HTML/HTMLInputElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLInputElement.cpp @@ -355,39 +355,52 @@ static void show_the_picker_if_applicable(HTMLInputElement& element) if (!element.supports_a_picker()) return; - // 5. If element's type attribute is in the File Upload state, then run these steps in parallel: + // 5. If element is an input element and element's type attribute is in the File Upload state, then run these steps in parallel: if (element.type_state() == HTMLInputElement::TypeAttributeState::FileUpload) { // NOTE: These steps cannot be fully implemented here, and must be done in the PageClient when the response comes back from the PageHost + // See: ViewImplementation::on_request_file_picker, Page::did_request_file_picker(), Page::file_picker_closed() // 1. Optionally, wait until any prior execution of this algorithm has terminated. - // 2. Display a prompt to the user requesting that the user specify some files. - // If the multiple attribute is not set on element, there must be no more than one file selected; otherwise, any number may be selected. - // Files can be from the filesystem or created on the fly, e.g., a picture taken from a camera connected to the user's device. - // 3. Wait for the user to have made their selection. - // 4. If the user dismissed the prompt without changing their selection, + // FIXME: 2. Let dismissed be the result of WebDriver BiDi file dialog opened with element. + bool dismissed = false; + // 3. If dismissed is false: + if (!dismissed) { + // 1. Display a prompt to the user requesting that the user specify some files. + // If the multiple attribute is not set on element, there must be no more than one file selected; + // otherwise, any number may be selected. + // Files can be from the filesystem or created on the fly, e.g., a picture taken from a camera connected + // to the user's device. + // 2. Wait for the user to have made their selection. + auto accepted_file_types = element.parse_accept_attribute(); + auto allow_multiple_files = element.has_attribute(HTML::AttributeNames::multiple) ? AllowMultipleFiles::Yes : AllowMultipleFiles::No; + auto weak_element = element.make_weak_ptr(); + + element.set_is_open(true); + element.document().browsing_context()->top_level_browsing_context()->page().did_request_file_picker(weak_element, accepted_file_types, allow_multiple_files); + } + // 4. If dismissed is true or if the user dismissed the prompt without changing their selection, // then queue an element task on the user interaction task source given element to fire an event named cancel at element, // with the bubbles attribute initialized to true. + else { + // FIXME: Handle the "dismissed is true" case here. + } // 5. Otherwise, update the file selection for element. - - auto accepted_file_types = element.parse_accept_attribute(); - auto allow_multiple_files = element.has_attribute(HTML::AttributeNames::multiple) ? AllowMultipleFiles::Yes : AllowMultipleFiles::No; - auto weak_element = element.make_weak_ptr(); - - element.set_is_open(true); - element.document().browsing_context()->top_level_browsing_context()->page().did_request_file_picker(weak_element, accepted_file_types, allow_multiple_files); - return; } - // 6. Otherwise, the user agent should show any relevant user interface for selecting a value for element, - // in the way it normally would when the user interacts with the control. (If no such UI applies to element, then this step does nothing.) - // If such a user interface is shown, it must respect the requirements stated in the relevant parts of the specification for how element - // behaves given its type attribute state. (For example, various sections describe restrictions on the resulting value string.) + // 6. Otherwise, the user agent should show the relevant user interface for selecting a value for element, in the + // way it normally would when the user interacts with the control. + // When showing such a user interface, it must respect the requirements stated in the relevant parts of the + // specification for how element behaves given its type attribute state. (For example, various sections describe + // restrictions on the resulting value string.) // This step can have side effects, such as closing other pickers that were previously shown by this algorithm. - // (If this closes a file selection picker, then per the above that will lead to firing either input and change events, or a cancel event.) - if (element.type_state() == HTMLInputElement::TypeAttributeState::Color) { - auto weak_element = element.make_weak_ptr(); - element.set_is_open(true); - element.document().browsing_context()->top_level_browsing_context()->page().did_request_color_picker(weak_element, Color::from_string(element.value()).value_or(Color(0, 0, 0))); + // (If this closes a file selection picker, then per the above that will lead to firing either input and change + // events, or a cancel event.) + else { + if (element.type_state() == HTMLInputElement::TypeAttributeState::Color) { + auto weak_element = element.make_weak_ptr(); + element.set_is_open(true); + element.document().browsing_context()->top_level_browsing_context()->page().did_request_color_picker(weak_element, Color::from_string(element.value()).value_or(Color(0, 0, 0))); + } } } diff --git a/Libraries/LibWeb/HTML/HTMLSelectElement.cpp b/Libraries/LibWeb/HTML/HTMLSelectElement.cpp index 2501450342f..855b3f4f08c 100644 --- a/Libraries/LibWeb/HTML/HTMLSelectElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLSelectElement.cpp @@ -436,7 +436,7 @@ static String strip_newlines(Optional string) void HTMLSelectElement::show_the_picker_if_applicable() { // FIXME: Deduplicate with HTMLInputElement - // To show the picker, if applicable for a select element: + // To show the picker, if applicable for a select element element: // 1. If element's relevant global object does not have transient activation, then return. auto& relevant_global = as(relevant_global_object(*this)); @@ -450,15 +450,21 @@ void HTMLSelectElement::show_the_picker_if_applicable() // 3. Consume user activation given element's relevant global object. relevant_global.consume_user_activation(); - // 4. If element's type attribute is in the File Upload state, then run these steps in parallel: - // Not Applicable to select elements + // 4. If element does not support a picker, then return. + // NB: Select elements always support a picker. - // 5. Otherwise, the user agent should show any relevant user interface for selecting a value for element, - // in the way it normally would when the user interacts with the control. (If no such UI applies to element, then this step does nothing.) - // If such a user interface is shown, it must respect the requirements stated in the relevant parts of the specification for how element - // behaves given its type attribute state. (For example, various sections describe restrictions on the resulting value string.) + // 5. If element is an input element and element's type attribute is in the File Upload state, then run these steps + // in parallel: + // NB: Not applicable to select elements. + + // 6. Otherwise, the user agent should show the relevant user interface for selecting a value for element, in the + // way it normally would when the user interacts with the control. + // When showing such a user interface, it must respect the requirements stated in the relevant parts of the + // specification for how element behaves given its type attribute state. (For example, various sections describe + // restrictions on the resulting value string.) // This step can have side effects, such as closing other pickers that were previously shown by this algorithm. - // (If this closes a file selection picker, then per the above that will lead to firing either input and change events, or a cancel event.) + // (If this closes a file selection picker, then per the above that will lead to firing either input and change + // events, or a cancel event.) // Populate select items m_select_items.clear();