MdeModulePkg/SetupBrowserDxe: Do not reconnect driver with form-update

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2701

Recording to the spec, the reconnect is activated upon exiting of the
formset or the browser. Exiting is by user but form-browser internal
logic. That means the reconnection is only happened when user press
ESC or _EXIT action to exit form.
Driver callback may update HII form dynamically so form-browser needs
to refresh its internal data. It's not exiting formset for user
exactly and they didn't know what happened. So use a flag to record
that and do not reconnect driver if updated by callback.

Signed-off-by: Walon Li <walon.li@hpe.com>
Reviewed-by: Dandan Bi <dandan.bi@intel.com>
This commit is contained in:
Walon Li 2020-05-20 12:24:47 +08:00 committed by mergify[bot]
parent 8c91934019
commit 365fdb0f93
2 changed files with 9 additions and 1 deletions

View File

@ -19,6 +19,7 @@ LIST_ENTRY mRefreshEventList = INITIALIZE_LIST_HEAD_VARIABLE (mRefreshEv
UINT16 mCurFakeQestId;
FORM_DISPLAY_ENGINE_FORM gDisplayFormData;
BOOLEAN mFinishRetrieveCall = FALSE;
BOOLEAN mDynamicFormUpdated = FALSE;
/**
Check whether the ConfigAccess protocol is available.
@ -1762,6 +1763,7 @@ FormUpdateNotify (
)
{
mHiiPackageListUpdated = TRUE;
mDynamicFormUpdated = TRUE;
return EFI_SUCCESS;
}

View File

@ -68,6 +68,7 @@ extern EFI_GUID mCurrentFormSetGuid;
extern EFI_HII_HANDLE mCurrentHiiHandle;
extern UINT16 mCurrentFormId;
extern FORM_DISPLAY_ENGINE_FORM gDisplayFormData;
extern BOOLEAN mDynamicFormUpdated;
/**
Create a menu with specified formset GUID and form ID, and add it as a child
@ -536,6 +537,7 @@ SendForm (
}
Selection->FormSet = FormSet;
mSystemLevelFormSet = FormSet;
mDynamicFormUpdated = FALSE;
//
// Display this formset
@ -547,7 +549,11 @@ SendForm (
gCurrentSelection = NULL;
mSystemLevelFormSet = NULL;
if (gFlagReconnect || gCallbackReconnect) {
//
// If callback update form dynamically, it's not exiting of the formset for user so system do not reconnect driver hanlde
// this time.
//
if (!mDynamicFormUpdated && (gFlagReconnect || gCallbackReconnect)) {
RetVal = ReconnectController (FormSet->DriverHandle);
if (!RetVal) {
PopupErrorMessage(BROWSER_RECONNECT_FAIL, NULL, NULL, NULL);