blob: b3196c1b99ae44df0377b1b65b63c4d0dc555fbd [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module autofill.mojom;
import "components/autofill/core/common/mojom/autofill_types.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/text_direction.mojom";
import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom";
// There is one instance of this interface per RenderFrameHost in the browser
// process. All methods are called by renderer on browser.
interface AutofillDriver {
// Notification that changes of the forms have been detected: the forms in
// `updated_forms` are either new or have changed, and the forms in
// `removed_forms` have been removed from the DOM (but may be re-added to the
// DOM later).
FormsSeen(array<FormData> updated_forms, array<FormRendererId> removed_forms);
// Notification that a form has been submitted.
FormSubmitted(FormData form,
SubmissionSource source);
// Notification that a form field's caret moved or selection has changed.
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
//
// `caret_bounds` is the bounds of the caret if the selection is empty and
// otherwise the bounds of the focus
// (https://w3c.github.io/selection-api/#dfn-focus). That is, its width is
// typically zero or near-zero, and its height is about one line. It is not
// validated in any way; in particular, the coordinates may be negative or
// otherwise outside of the bounds of the viewport.
CaretMovedInFormField(FormData form,
FieldRendererId field_id,
gfx.mojom.Rect caret_bounds);
// Notification that a form field's value has changed by a user edit only
// (meaning that JavaScript-triggered changes of values of text fields do not
// result in calling this method).
//
// Similarly to JavaScript's "input" event, and unlike JavaScript's "change"
// event, it's fired for each individual alteration of the field.
//
// Fired on text-type input elements and textareas. Additionally it is fired
// on contenteditables for all non-IOS platforms.
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
TextFieldValueChanged(FormData form,
FieldRendererId field_id,
mojo_base.mojom.TimeTicks timestamp);
// Notification that editing a text-type input element ended.
//
// Fired (only) on element blur or document unload events.
//
// TODO(crbug.com/339820079): Eliminate in favour of FocusNoLongerOnForm()?
DidEndTextFieldEditing();
// Notification that a form field has scrolled.
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
TextFieldDidScroll(FormData form,
FieldRendererId field_id);
// Notification that a form select control has changed.
//
// Fired when the selection in a select control changes because either:
// - A user selected a different option.
// - JavaScript changed the selected option in a frame with transient user
// activation (see blink::LocalFrame::HasTransientUserActivation).
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
SelectControlSelectionChanged(FormData form,
FieldRendererId field_id);
// Notification that a select element's options were modified.
SelectFieldOptionsDidChange(FormData form);
// `FocusOnFormField()` xor `FocusOnNonFormField()` is fired when the focused
// element changes (https://html.spec.whatwg.org/#focused):
//
// - `FocusOnFormField()` iff the newly focused element is a non-null form
// control element or contenteditable whose `FormData` can be extracted.
// - `FocusOnNonFormField()` iff it does not call `FocusOnFormField()`.
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
FocusOnFormField(FormData form, FieldRendererId field_id);
FocusOnNonFormField();
// Queries the browser for Autofill suggestions for a form input field.
// For autofill this means asking the user which values to fill.
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
//
// `caret_bounds` is the bounds of the caret if the selection is empty and
// otherwise the bounds of the focus
// (https://w3c.github.io/selection-api/#dfn-focus). That is, its width is
// typically zero or near-zero, and its height is about one line. It is not
// validated in any way; in particular, the coordinates may be negative or
// otherwise outside of the bounds of the viewport.
AskForValuesToFill(FormData form,
FieldRendererId field_id,
gfx.mojom.Rect caret_bounds,
AutofillSuggestionTriggerSource trigger_source,
PasswordSuggestionRequest? password_request);
// Instructs the browser to hide the Autofill popup if it is open.
HidePopup();
// Sent when a form is filled with Autofill suggestions.
DidAutofillForm(FormData form, mojo_base.mojom.TimeTicks timestamp);
// Sent when a field was in autofilled state but JavaScript modified the
// value.
//
// Note that from a renderer's perspective, modifying the value with
// JavaScript leads to a state where the field is not considered autofilled
// anymore. So this notification won't be sent again until the field gets
// autofilled again.
//
// `field_id` must identify a field of `form`. This is enforced by
// ContentAutofillDriver.
JavaScriptChangedAutofilledValue(FormData form,
FieldRendererId field_id,
mojo_base.mojom.String16 old_value);
};
// There is one instance of this interface per web contents in the browser
// process that handles all the frames. The motivation was to make the interface
// associated with PasswordGenerationDriver.
interface PasswordManagerDriver {
// Notification that password forms have been seen that are candidates for
// filling/submitting by the password manager.
PasswordFormsParsed(array<FormData> forms_data);
// Notification that initial layout has occurred and the following password
// forms are visible on the page (e.g. not set to display:none.).
PasswordFormsRendered(array<FormData> visible_forms_data);
// Notification that this password form was submitted by the user.
PasswordFormSubmitted(FormData form_data);
// Notification that a user has modified a password field. This is fired both
// when typing new characters and deleting characters, so the password field
// in `form_data` may or may not be empty
InformAboutUserInput(FormData form_data);
// Notification that a dynamic form submission was observed. This could be due
// to a same-document navigation, detaching a frame, or hiding / removing a
// form after an XHR.
DynamicFormSubmission(SubmissionIndicatorEvent submission_indication_event);
// Notification that password form was cleared. This is used as a signal of
// a successful submission for change password forms.
PasswordFormCleared(FormData form_data);
// Sends `log` to browser for displaying to the user. Only strings passed as
// an argument to methods overriding SavePasswordProgressLogger::SendLog may
// become `log`, because those are guaranteed to be sanitized.
// Never pass a free-form string as `log`.
RecordSavePasswordProgress(string log);
// Notification that the user (not JavaScript) modified the value of a
// password field.
UserModifiedPasswordField();
// Notification that the user (not JavaScript) modified the value of a
// non-password field with `renderer_id`, and `value` is the current value.
UserModifiedNonPasswordField(
FieldRendererId renderer_id,
mojo_base.mojom.String16 value,
bool autocomplete_attribute_has_username,
bool is_likely_otp);
// Instructs the browser to show a popup or accessory with password
// suggestions. The popup will use `request.text_direction` for displaying
// text. The accessory uses the `request.form` and the indices of username and
// password elements in the form (`request.username_field_index` and
// `request.password_field_index` respectively) to calculate submission
// readiness for the `request.form`. If the username field is not found,
// `request.username_field_index` is set to `request.form.fields.size()`.
// Similar for the password field.
ShowPasswordSuggestions(PasswordSuggestionRequest request);
// Checks the safe browsing reputation of the website where the focused
// username/password field is on.
CheckSafeBrowsingReputation(
url.mojom.Url form_action, url.mojom.Url frame_url);
// The focus changed to a different input in the same frame (e.g. tabbed from
// email to password field).
FocusedInputChanged(FieldRendererId focused_field_id,
FocusedFieldType focused_field_type);
// Sends the success state of filling credentials into a form. This happens
// only if the form being filled has a renderer_id. `result` is an
// integer serialization of autofill::FillingResult. It is passed as an
// integer as no further interpretation of the value is necessary in the
// browser.
LogFirstFillingResult(FormRendererId form_renderer_id, int32 result);
};
// There is one instance of this interface per web contents in the browser
// process.
interface PasswordGenerationDriver {
// Notifies the browser when automatic generation becomes available
// and provides data needed by the UI.
AutomaticGenerationAvailable(
PasswordGenerationUIData password_generation_ui_data);
// Instructs the browser to presave the form with generated password.
PresaveGeneratedPassword(FormData form_data,
mojo_base.mojom.String16 password_value);
// Instructs the browser that form no longer contains a generated password and
// the presaved form should be removed.
PasswordNoLongerGenerated(FormData form_data);
// Instructs the browser to show the popup for editing a generated password.
// The location should be specified in the renderers coordinate system. Form
// is the form associated with the password field. `field_renderer_id` is the
// ID of the password field triggering generation. On Android bottom sheet is
// displayed instead of the editing popup.
[EnableIfNot=is_android]
ShowPasswordEditingPopup(
gfx.mojom.RectF bounds,
FormData form_data,
FieldRendererId field_renderer_id,
mojo_base.mojom.String16 password_value);
// Informs the browser that the password generation option was rejected
// by the user typing more characters than the maximum offer size into the
// password field. Obsolete for Android since it's only a signal to hide
// generation popup.
[EnableIfNot=is_android]
PasswordGenerationRejectedByTyping();
// Communicates to the browser that a scroll event happened on the frame. This
// event affects the password generation popup position. On Android bottom
// sheet is displayed instead of generation popup.
[EnableIfNot=is_android]
FrameWasScrolled();
// Informs the browser that the generation element lost focus, so the browser
// might hide the generation popup. On Android bottom sheet is displayed
// instead of generation popup.
[EnableIfNot=is_android]
GenerationElementLostFocus();
};