Skip to content

Commit

Permalink
[Chromium] Add JavaScript dialogs support
Browse files Browse the repository at this point in the history
Support JavaScript dialogs such as alert, confirm, prompt and
beforeunload.
  • Loading branch information
zakharvoit committed Dec 9, 2023
1 parent affcaad commit 02da7db
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 21 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ android {
buildConfigField "Boolean", "SUPPORTS_SYSTEM_NOTIFICATIONS", "false"
buildConfigField "Float", "DEFAULT_DENSITY", "1.5f"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue 'string', 'HOMEPAGE_URL', "https://wolvic.com/start"
resValue 'string', 'HOMEPAGE_URL', "https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_confirm3"
externalNativeBuild {
cmake {
cppFlags "-std=c++14 -fexceptions -frtti -Werror" +
Expand Down Expand Up @@ -382,7 +382,7 @@ android {
buildConfigField "Boolean", "FXA_USE_CHINA_SERVER", "true"
buildConfigField "Boolean", "WEBVIEW_IN_PHONE_UI", "true"
buildConfigField "Boolean", "CN_FIRST_RUN_IN_PHONE_UI", "true"
resValue 'string', 'HOMEPAGE_URL', 'https://wolvic.com/welcome/'
resValue 'string', 'HOMEPAGE_URL', 'https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_prompt'
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,18 @@
import org.chromium.base.Callback;
import org.chromium.content.browser.input.SelectPopup;
import org.chromium.content.browser.input.SelectPopupItem;
import org.chromium.wolvic.UserDialogManagerBridge;

import com.igalia.wolvic.browser.api.WAllowOrDeny;
import com.igalia.wolvic.browser.api.WSession;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class PromptDelegateImpl {
WSession.PromptDelegate mDelegate;
SessionImpl mSession;

public class SelectPopupFactory implements SelectPopup.Factory {
public SelectPopup.Ui create(Context windowContext, Callback<int[]> selectionChangedCallback,
List<SelectPopupItem> items, boolean multiple, int[] selected) {
return new ChoicePromptBridge(windowContext, selectionChangedCallback, items, multiple, selected);
}
}
class PromptDelegateImpl implements UserDialogManagerBridge.Delegate {
private final WSession.PromptDelegate mDelegate;
private final SessionImpl mSession;

private static class PromptResponseImpl implements WSession.PromptDelegate.PromptResponse {
public PromptResponseImpl() {
Expand All @@ -42,9 +37,32 @@ public PromptDelegateImpl(WSession.PromptDelegate mDelegate, SessionImpl mSessio

public WSession.PromptDelegate getDelegate() { return this.mDelegate; }

public class BasePromptImpl implements WSession.PromptDelegate.BasePrompt {
@Override
public void onAlertDialog(@NonNull String message,
UserDialogManagerBridge.DialogCallback dialogCallback) {
mDelegate.onAlertPrompt(mSession, new AlertPrompt(dialogCallback, message));
}

@Override
public void onConfirmDialog(@NonNull String message,
UserDialogManagerBridge.DialogCallback dialogCallback) {
mDelegate.onButtonPrompt(mSession, new ButtonPrompt(dialogCallback, message));
}

@Override
public void onTextDialog(@NonNull String message, @NonNull String defaultUserInput,
UserDialogManagerBridge.DialogCallback dialogCallback) {
mDelegate.onTextPrompt(mSession, new TextPrompt(dialogCallback, message, defaultUserInput));
}

@Override
public void onBeforeUnloadDialog(UserDialogManagerBridge.DialogCallback dialogCallback) {
mDelegate.onBeforeUnloadPrompt(mSession, new BeforeUnloadPrompt(dialogCallback));
}

public static class BasePromptImpl implements WSession.PromptDelegate.BasePrompt {
private WSession.PromptDelegate.PromptInstanceDelegate mDelegate;
boolean mIsCompleted;
protected boolean mIsCompleted;

@Override
@Nullable
Expand All @@ -53,7 +71,7 @@ public class BasePromptImpl implements WSession.PromptDelegate.BasePrompt {
@NonNull
@Override
public WSession.PromptDelegate.PromptResponse dismiss() {
confirm();
markComplete();
return new PromptResponseImpl();
}

Expand All @@ -76,12 +94,127 @@ public boolean isComplete() {
return mIsCompleted;
}

public WSession.PromptDelegate.PromptResponse confirm() {
public void markComplete() {
mIsCompleted = true;
}
}

public static class JavascriptPrompt extends BasePromptImpl {
protected final UserDialogManagerBridge.DialogCallback mCallback;

public JavascriptPrompt(UserDialogManagerBridge.DialogCallback callback) {
this.mCallback = callback;
}

@NonNull
@Override
public WSession.PromptDelegate.PromptResponse dismiss() {
mCallback.dismiss();
markComplete();
return new PromptResponseImpl();
}
}

private static class AlertPrompt extends JavascriptPrompt implements WSession.PromptDelegate.AlertPrompt {
private final String mMessage;

private AlertPrompt(UserDialogManagerBridge.DialogCallback callback, String message) {
super(callback);
mMessage = message;
}

@Nullable
@Override
public String message() {
return mMessage;
}
}


private static class ButtonPrompt extends JavascriptPrompt implements WSession.PromptDelegate.ButtonPrompt {
private final String mMessage;

private ButtonPrompt(UserDialogManagerBridge.DialogCallback callback, String message) {
super(callback);
mMessage = message;
}

@Nullable
@Override
public String message() {
return mMessage;
}

@NonNull
@Override
public WSession.PromptDelegate.PromptResponse confirm(int selection) {
if (selection == Type.POSITIVE) {
mCallback.confirm(null);
} else {
mCallback.dismiss();
}
markComplete();
return new PromptResponseImpl();
}
}

private static class TextPrompt extends JavascriptPrompt implements WSession.PromptDelegate.TextPrompt {
private final String mMessage;
private final String mDefaultUserInput;

private TextPrompt(UserDialogManagerBridge.DialogCallback callback, String message,
String defaultUserInput) {
super(callback);
this.mMessage = message;
this.mDefaultUserInput = defaultUserInput;
}

@Nullable
@Override
public String message() {
return mMessage;
}

@Nullable
@Override
public String defaultValue() {
return mDefaultUserInput;
}

@NonNull
@Override
public WSession.PromptDelegate.PromptResponse confirm(@NonNull String text) {
mCallback.confirm(text);
markComplete();
return new PromptResponseImpl();
}
}

private static class BeforeUnloadPrompt extends JavascriptPrompt implements WSession.PromptDelegate.BeforeUnloadPrompt {
private BeforeUnloadPrompt(UserDialogManagerBridge.DialogCallback callback) {
super(callback);
}

@NonNull
@Override
public WSession.PromptDelegate.PromptResponse confirm(@Nullable WAllowOrDeny allowOrDeny) {
if (allowOrDeny == WAllowOrDeny.ALLOW) {
mCallback.confirm(null);
} else {
mCallback.dismiss();
}
markComplete();
return new PromptResponseImpl();
}
}

public class SelectPopupFactory implements SelectPopup.Factory {
public SelectPopup.Ui create(Context windowContext, Callback<int[]> selectionChangedCallback,
List<SelectPopupItem> items, boolean multiple, int[] selected) {
return new ChoicePromptBridge(windowContext, selectionChangedCallback, items, multiple, selected);
}
}

public class ChoicePrompt extends BasePromptImpl implements WSession.PromptDelegate.ChoicePrompt {
public class Choice implements WSession.PromptDelegate.ChoicePrompt.Choice {
public final boolean disabled;
Expand Down Expand Up @@ -217,7 +350,8 @@ private <T> boolean isValidArgument(T[] selectedChoices) {
public WSession.PromptDelegate.PromptResponse confirm(final int[] selectedIds) {
if (!isComplete())
mSelectionChangedCallback.onResult(selectedIds);
return super.confirm();
markComplete();
return new PromptResponseImpl();
}

@UiThread
Expand Down Expand Up @@ -325,15 +459,12 @@ public void show() {
final WSession.PromptDelegate delegate = mSession.getPromptDelegate();
delegate.onChoicePrompt(mSession, mChoicePrompt);
} catch (WindowManager.BadTokenException e) {
mChoicePrompt.confirm();
mChoicePrompt.markComplete();
}
}

@Override
public void hide(boolean sendsCancelMessage) {
if (!sendsCancelMessage) {
mChoicePrompt.confirm();
}
mChoicePrompt.dismiss();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.chromium.content_public.browser.WebContents;
import org.chromium.wolvic.DownloadManagerBridge;
import org.chromium.wolvic.PermissionManagerBridge;
import org.chromium.wolvic.UserDialogManagerBridge;

import java.io.InputStream;
import java.security.cert.X509Certificate;
Expand Down Expand Up @@ -338,6 +339,7 @@ public void setPromptDelegate(@Nullable PromptDelegate delegate) {
return;
}
mPromptDelegate = new PromptDelegateImpl(delegate, this);
UserDialogManagerBridge.get().setDelegate(mPromptDelegate);
}

@Nullable
Expand Down

0 comments on commit 02da7db

Please sign in to comment.