diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc --- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc @@ -1186,18 +1186,22 @@ void BrowserAutofillManager::OnAskForValuesToFillImpl( return; } + // Evaluate the @memory eligibility gate BEFORE mutating + // `external_delegate_->query_field_` via OnQuery(). Otherwise a renderer + // could send `kAtMemory` to silently re-target a still-visible popup at a + // different origin (the bare `return` below neither hides the popup nor + // restores the previous query_field_). + if (IsAtMemoryTriggerSource(trigger_source) && + client().GetPersonalContextEnablementState() == + personal_context::PersonalContextEnablementState:: + kDisabledNotEligible) { + return; + } + const FormFieldData& field = CHECK_DEREF(form.FindFieldByGlobalId(field_id)); external_delegate_->OnQuery(form, field, caret_bounds, trigger_source, /*update_datalist=*/true); if (IsAtMemoryTriggerSource(trigger_source)) { - // Do not show the pop up at all for non eligible profiles. - if (client().GetPersonalContextEnablementState() == - personal_context::PersonalContextEnablementState:: - kDisabledNotEligible) { - return; - } // Show empty suggestions with a search bar to start the flow. external_delegate_->OnSuggestionsReturned(field_id, {}); return; }