Backed out changeset 6d823f106e69 (bug 1533057) for Android mochitest failure in AndroidAlerts.cpp on a CLOSED TREE

This commit is contained in:
Oana Pop Rus 2019-08-16 02:28:42 +03:00
Родитель 6de8405695
Коммит cc55a912e9
11 изменённых файлов: 10 добавлений и 481 удалений

Просмотреть файл

@ -263,12 +263,6 @@ GeckoViewPermission.prototype = {
})
.then(granted => {
(granted ? aRequest.allow : aRequest.cancel)();
Services.perms.addFromPrincipal(
aRequest.principal,
"desktop-notification",
Services.perms.ALLOW_ACTION,
Services.perms.EXPIRE_SESSION
);
// Manually release the target request here to facilitate garbage collection.
aRequest = undefined;
});

Просмотреть файл

@ -82,8 +82,6 @@ import org.mozilla.geckoview.WebExtension;
import org.mozilla.geckoview.WebExtensionController;
import org.mozilla.geckoview.WebExtensionEventDispatcher;
import org.mozilla.geckoview.WebMessage;
import org.mozilla.geckoview.WebNotification;
import org.mozilla.geckoview.WebNotificationDelegate;
import org.mozilla.geckoview.WebRequest;
import org.mozilla.geckoview.WebRequestError;
import org.mozilla.geckoview.WebResponse;
@ -300,6 +298,7 @@ package org.mozilla.geckoview {
}
public final class GeckoRuntime implements Parcelable {
ctor public GeckoRuntime();
method @UiThread public void attachTo(@NonNull Context);
method @UiThread public void configurationChanged(@NonNull Configuration);
method @UiThread @NonNull public static GeckoRuntime create(@NonNull Context);
@ -311,13 +310,11 @@ package org.mozilla.geckoview {
method @UiThread @NonNull public StorageController getStorageController();
method @UiThread @NonNull public RuntimeTelemetry getTelemetry();
method @UiThread @NonNull public WebExtensionController getWebExtensionController();
method @UiThread @Nullable public WebNotificationDelegate getWebNotificationDelegate();
method @UiThread public void orientationChanged();
method @UiThread public void orientationChanged(int);
method @AnyThread public void readFromParcel(@NonNull Parcel);
method @UiThread @NonNull public GeckoResult<Void> registerWebExtension(@NonNull WebExtension);
method @UiThread public void setDelegate(@Nullable GeckoRuntime.Delegate);
method @UiThread public void setWebNotificationDelegate(@Nullable WebNotificationDelegate);
method @AnyThread public void shutdown();
method @UiThread @NonNull public GeckoResult<Void> unregisterWebExtension(@NonNull WebExtension);
field public static final String ACTION_CRASHED = "org.mozilla.gecko.ACTION_CRASHED";
@ -1245,23 +1242,6 @@ package org.mozilla.geckoview {
method @NonNull public WebMessage.Builder uri(@NonNull String);
}
public class WebNotification {
method @UiThread public void click();
method @UiThread public void dismiss();
field @Nullable public final String imageUrl;
field @Nullable public final String lang;
field @NonNull public final boolean requireInteraction;
field @NonNull public final String tag;
field @Nullable public final String text;
field @Nullable public final String textDirection;
field @Nullable public final String title;
}
public interface WebNotificationDelegate {
method @AnyThread default public void onCloseNotification(@NonNull WebNotification);
method @AnyThread default public void onShowNotification(@NonNull WebNotification);
}
@AnyThread public class WebRequest extends WebMessage {
ctor public WebRequest(@NonNull String);
field public static final int CACHE_MODE_DEFAULT = 1;

Просмотреть файл

@ -1,140 +0,0 @@
package org.mozilla.geckoview.test
import android.support.test.filters.MediumTest
import android.support.test.runner.AndroidJUnit4
import org.hamcrest.Matchers.*
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.geckoview.GeckoResult
import org.mozilla.geckoview.WebNotification
import org.mozilla.geckoview.WebNotificationDelegate
import org.mozilla.geckoview.test.rule.GeckoSessionTestRule
@RunWith(AndroidJUnit4::class)
@MediumTest
class WebNotificationTest : BaseSessionTest() {
@Before fun setup() {
mainSession.loadTestPath(HELLO_HTML_PATH)
mainSession.waitForPageStop()
val result = mainSession.waitForJS("Notification.requestPermission()")
assertThat("Permission should be granted",
result as String, equalTo("granted"))
}
@Test fun onShowNotification() {
val runtime = sessionRule.runtime
val notificationResult = GeckoResult<Void>()
val register = { delegate: WebNotificationDelegate -> runtime.webNotificationDelegate = delegate}
val unregister = { _: WebNotificationDelegate -> runtime.webNotificationDelegate = null }
sessionRule.addExternalDelegateDuringNextWait(WebNotificationDelegate::class, register,
unregister, object : WebNotificationDelegate {
@GeckoSessionTestRule.AssertCalled
override fun onShowNotification(notification: WebNotification) {
assertThat("Title should match", notification.title, equalTo("The Title"))
assertThat("Body should match", notification.text, equalTo("The Text"))
assertThat("Tag should match", notification.tag, endsWith("Tag"))
assertThat("ImageUrl should match", notification.imageUrl, endsWith("icon.png"))
assertThat("Language should match", notification.lang, equalTo("en-US"))
assertThat("Direction should match", notification.textDirection, equalTo("ltr"))
assertThat("Require Interaction should match", notification.requireInteraction, equalTo(true))
notificationResult.complete(null)
}
})
mainSession.evaluateJS("""
new Notification('The Title', { body: 'The Text', cookie: 'Cookie',
icon: 'icon.png', tag: 'Tag', dir: 'ltr', lang: 'en-US',
requireInteraction: true });
""".trimIndent())
sessionRule.waitForResult(notificationResult)
}
@Test fun onCloseNotification() {
val runtime = sessionRule.runtime
val closeCalled = GeckoResult<Void>()
val register = { delegate: WebNotificationDelegate -> runtime.webNotificationDelegate = delegate}
val unregister = { _: WebNotificationDelegate -> runtime.webNotificationDelegate = null }
sessionRule.addExternalDelegateDuringNextWait(WebNotificationDelegate::class, register,
unregister, object : WebNotificationDelegate {
@GeckoSessionTestRule.AssertCalled
override fun onCloseNotification(notification: WebNotification) {
closeCalled.complete(null)
}
})
mainSession.evaluateJS("""
const notification = new Notification('The Title', { body: 'The Text'});
notification.close();
""".trimIndent())
sessionRule.waitForResult(closeCalled)
}
@Test fun clickNotification() {
val runtime = sessionRule.runtime
val notificationResult = GeckoResult<Void>()
val register = { delegate: WebNotificationDelegate -> runtime.webNotificationDelegate = delegate}
val unregister = { _: WebNotificationDelegate -> runtime.webNotificationDelegate = null }
var notificationShown: WebNotification? = null
sessionRule.addExternalDelegateDuringNextWait(WebNotificationDelegate::class, register,
unregister, object : WebNotificationDelegate {
@GeckoSessionTestRule.AssertCalled
override fun onShowNotification(notification: WebNotification) {
notificationShown = notification
notificationResult.complete(null)
}
})
val promiseResult = mainSession.evaluatePromiseJS("""
new Promise(resolve => {
const notification = new Notification('The Title', { body: 'The Text' });
notification.onclick = function() {
resolve(1);
}
});
""".trimIndent())
sessionRule.waitForResult(notificationResult)
notificationShown!!.click()
assertThat("Promise should have been resolved.", promiseResult.value as Double, equalTo(1.0))
}
@Test fun dismissNotification() {
val runtime = sessionRule.runtime
val notificationResult = GeckoResult<Void>()
val register = { delegate: WebNotificationDelegate -> runtime.webNotificationDelegate = delegate}
val unregister = { _: WebNotificationDelegate -> runtime.webNotificationDelegate = null }
var notificationShown: WebNotification? = null
sessionRule.addExternalDelegateDuringNextWait(WebNotificationDelegate::class, register,
unregister, object : WebNotificationDelegate {
@GeckoSessionTestRule.AssertCalled
override fun onShowNotification(notification: WebNotification) {
notificationShown = notification
notificationResult.complete(null)
}
})
val promiseResult = mainSession.evaluatePromiseJS("""
new Promise(resolve => {
const notification = new Notification('The Title', { body: 'The Text'});
notification.onclose = function() {
resolve(1);
}
});
""".trimIndent())
sessionRule.waitForResult(notificationResult)
notificationShown!!.dismiss()
assertThat("Promise should have been resolved", promiseResult.value as Double, equalTo(1.0))
}
}

Просмотреть файл

@ -35,7 +35,6 @@ import org.mozilla.gecko.GeckoScreenOrientation;
import org.mozilla.gecko.GeckoSystemStateListener;
import org.mozilla.gecko.GeckoThread;
import org.mozilla.gecko.PrefsHelper;
import org.mozilla.gecko.annotation.WrapForJNI;
import org.mozilla.gecko.util.BundleEventListener;
import org.mozilla.gecko.util.ContextUtils;
import org.mozilla.gecko.util.DebugConfig;
@ -157,28 +156,16 @@ public final class GeckoRuntime implements Parcelable {
return sDefaultRuntime;
}
private static GeckoRuntime sRuntime;
private GeckoRuntimeSettings mSettings;
private Delegate mDelegate;
private WebNotificationDelegate mNotificationDelegate;
private RuntimeTelemetry mTelemetry;
private final WebExtensionEventDispatcher mWebExtensionDispatcher;
private StorageController mStorageController;
private final WebExtensionController mWebExtensionController;
private GeckoRuntime() {
public GeckoRuntime() {
mWebExtensionDispatcher = new WebExtensionEventDispatcher();
mWebExtensionController = new WebExtensionController(this, mWebExtensionDispatcher);
if (sRuntime != null) {
throw new IllegalStateException("Only one GeckoRuntime instance is allowed");
}
sRuntime = this;
}
@WrapForJNI
@UiThread
private @Nullable static GeckoRuntime getInstance() {
return sRuntime;
}
/**
@ -516,47 +503,6 @@ public final class GeckoRuntime implements Parcelable {
return mDelegate;
}
/**
* Sets the delegate to be used for handling Web Notifications.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification">Web Notifications</a>
*/
@UiThread
public void setWebNotificationDelegate(final @Nullable WebNotificationDelegate delegate) {
mNotificationDelegate = delegate;
}
/**
* Returns the current WebNotificationDelegate, if any
*
* @return an instance of WebNotificationDelegate or null if no delegate has been set
*/
@WrapForJNI
@UiThread
public @Nullable WebNotificationDelegate getWebNotificationDelegate() {
return mNotificationDelegate;
}
@WrapForJNI
@UiThread
private void notifyOnShow(final WebNotification notification) {
ThreadUtils.getUiHandler().post(() -> {
if (mNotificationDelegate != null) {
mNotificationDelegate.onShowNotification(notification);
}
});
}
@WrapForJNI
@UiThread
private void notifyOnClose(final WebNotification notification) {
ThreadUtils.getUiHandler().post(() -> {
if (mNotificationDelegate != null) {
mNotificationDelegate.onCloseNotification(notification);
}
});
}
@AnyThread
public @NonNull GeckoRuntimeSettings getSettings() {
return mSettings;

Просмотреть файл

@ -1,99 +0,0 @@
package org.mozilla.geckoview;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.annotation.WrapForJNI;
import org.mozilla.gecko.util.ThreadUtils;
public class WebNotification {
/**
* Title is shown at the top of the notification window.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/title">Web Notification - title</a>
*/
public final @Nullable String title;
/**
* Tag is the ID of the notification.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/tag">Web Notification - tag</a>
*/
public final @NonNull String tag;
private final @Nullable String mCookie;
/**
* Text represents the body of the notification.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/body">Web Notification - text</a>
*/
public final @Nullable String text;
/**
* ImageURL contains the URL of an icon to be displayed as part of the notification.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/icon">Web Notification - icon</a>
*/
public final @Nullable String imageUrl;
/**
* TextDirection indicates the direction that the language of the text is displayed.
* Possible values are:
* auto: adopts the browser's language setting behaviour (the default.)
* ltr: left to right.
* rtl: right to left.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/dir">Web Notification - dir</a>
*/
public final @Nullable String textDirection;
/**
* Lang indicates the notification's language, as specified using a DOMString
* representing a BCP 47 language tag.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/DOMString">DOM String</a>
* @see <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">BCP 47</a>
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/lang">Web Notification - lang</a>
*/
public final @Nullable String lang;
/**
* RequireInteraction indicates whether a notification should remain active until the user
* clicks or dismisses it, rather than closing automatically.
*
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/Notification/requireInteraction">Web Notification - requireInteraction</a>
*/
public final @NonNull boolean requireInteraction;
@WrapForJNI
/* package */ WebNotification(@Nullable final String title, @NonNull final String tag,
@Nullable final String cookie, @Nullable final String text,
@Nullable final String imageUrl, @Nullable final String textDirection,
@Nullable final String lang, @NonNull final boolean requireInteraction) {
this.tag = tag;
this.mCookie = cookie;
this.title = title;
this.text = text;
this.imageUrl = imageUrl;
this.textDirection = textDirection;
this.lang = lang;
this.requireInteraction = requireInteraction;
}
@UiThread
public void click() {
ThreadUtils.assertOnUiThread();
GeckoAppShell.onNotificationClick(tag, mCookie);
}
@UiThread
public void dismiss() {
ThreadUtils.assertOnUiThread();
GeckoAppShell.onNotificationClose(tag, mCookie);
}
}

Просмотреть файл

@ -1,27 +0,0 @@
package org.mozilla.geckoview;
import android.support.annotation.AnyThread;
import android.support.annotation.NonNull;
import org.mozilla.gecko.annotation.WrapForJNI;
public interface WebNotificationDelegate {
/**
* This is called when a new notification is created.
*
* @param notification The WebNotification received.
*/
@AnyThread
@WrapForJNI
default void onShowNotification(@NonNull WebNotification notification) {}
/**
* This is called when an existing notification is closed.
*
* @param notification The WebNotification received.
*/
@AnyThread
@WrapForJNI
default void onCloseNotification(@NonNull WebNotification notification) {}
}

Просмотреть файл

@ -44,19 +44,6 @@ exclude: true
([bug 1567268]({{bugzilla}}1567268))
- Added API for controlling Gecko logging [`GeckoRuntimeSettings.debugLogging`][70.14]
([bug 1573304]({{bugzilla}}1573304))
- Added API for session context assignment
[`GeckoSessionSettings.Builder.contextId`][70.1] and deletion of data
related to a session context
[`StorageController.clearDataForSessionContext`][70.2].
- Removed `setSession(session, runtime)` from [`GeckoView`][70.5]. With this change, `GeckoView` will no longer
manage opening/closing of the [`GeckoSession`][70.6] and instead leave that up to the app. It's also now allowed
to call [`setSession`][70.10] with a closed `GeckoSession`.
- Added an overload of [`GeckoSession.loadUri()`][70.8] that accepts a referring [`GeckoSession`][70.6]. This should be used
when the URI we're loading originates from another page. A common example of this would be long pressing
a link and then opening that in a new `GeckoSession`.
- Added capture parameter to [`onFilePrompt`][70.9] and corresponding [`CAPTURE_TYPE_*`][70.7] constants.
- Added [`WebNotification`][70.11] and [`WebNotificationDelegate`][70.12] for handling Web Notifications.
([bug 1533057]({{bugzilla}}1533057))
[70.1]: {{javadoc_uri}}/GeckoSessionSettings.Builder.html#contextId-java.lang.String-
[70.2]: {{javadoc_uri}}/StorageController.html#clearDataForSessionContext-java.lang.String-
@ -72,8 +59,6 @@ exclude: true
[70.12]: {{javadoc_uri}}/RuntimeTelemetry.Delegate.html
[70.13]: {{javadoc_uri}}/ContentBlocking.html
[70.14]: {{javadoc_uri}}/GeckoRuntimeSettings.Builder.html#debugLogging-boolean-
[70.11]: {{javadoc_uri}}/WebNotification.html
[70.12]: {{javadoc_uri}}/WebNotificationDelegate.html
## v69
- Modified behavior of ['setAutomaticFontSizeAdjustment'][69.1] so that it no
@ -326,4 +311,4 @@ exclude: true
[65.24]: {{javadoc_uri}}/CrashReporter.html#sendCrashReport-android.content.Context-android.os.Bundle-java.lang.String-
[65.25]: {{javadoc_uri}}/GeckoResult.html
[api-version]: 15b1503a237289c51c147c7760afd7ff726d8809
[api-version]: 99204a5c93667e6d440e55d5d330d01cf4e8783f

Просмотреть файл

@ -16,29 +16,20 @@ import org.mozilla.geckoview.GeckoRuntimeSettings;
import org.mozilla.geckoview.GeckoSession;
import org.mozilla.geckoview.GeckoSessionSettings;
import org.mozilla.geckoview.GeckoView;
import org.mozilla.geckoview.GeckoWebExecutor;
import org.mozilla.geckoview.WebExtension;
import org.mozilla.geckoview.WebExtensionController;
import org.mozilla.geckoview.WebNotification;
import org.mozilla.geckoview.WebNotificationDelegate;
import org.mozilla.geckoview.WebRequest;
import org.mozilla.geckoview.WebRequestError;
import org.mozilla.geckoview.RuntimeTelemetry;
import org.mozilla.geckoview.WebResponse;
import android.Manifest;
import android.app.Activity;
import android.app.DownloadManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@ -64,7 +55,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Locale;
@ -100,10 +90,6 @@ public class GeckoViewActivity extends AppCompatActivity {
private boolean mCanGoForward;
private boolean mFullScreen;
private HashMap<String, Integer> mNotificationIDMap = new HashMap<>();
private HashMap<Integer, WebNotification> mNotificationMap = new HashMap<>();
private int mLastID = 100;
private ProgressBar mProgressView;
private LinkedList<GeckoSession.WebResponseInfo> mPendingDownloads = new LinkedList<>();
@ -189,54 +175,6 @@ public class GeckoViewActivity extends AppCompatActivity {
return GeckoResult.ALLOW;
}
});
// `getSystemService` call requires API level 23
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
sGeckoRuntime.setWebNotificationDelegate(new WebNotificationDelegate() {
NotificationManager notificationManager = getSystemService(NotificationManager.class);
@Override
public void onShowNotification(@NonNull WebNotification notification) {
Intent clickIntent = new Intent(GeckoViewActivity.this, GeckoViewActivity.class);
clickIntent.putExtra("onClick",notification.tag);
PendingIntent dismissIntent = PendingIntent.getActivity(GeckoViewActivity.this, mLastID, clickIntent, 0);
Notification.Builder builder = new Notification.Builder(GeckoViewActivity.this)
.setContentTitle(notification.title)
.setContentText(notification.text)
.setSmallIcon(R.drawable.ic_status_logo)
.setContentIntent(dismissIntent)
.setAutoCancel(true);
mNotificationIDMap.put(notification.tag, mLastID);
mNotificationMap.put(mLastID, notification);
if (notification.imageUrl != null && notification.imageUrl.length() > 0) {
final GeckoWebExecutor executor = new GeckoWebExecutor(sGeckoRuntime);
GeckoResult<WebResponse> response = executor.fetch(
new WebRequest.Builder(notification.imageUrl)
.addHeader("Accept", "image")
.build());
response.accept(value -> {
Bitmap bitmap = BitmapFactory.decodeStream(value.body);
builder.setLargeIcon(Icon.createWithBitmap(bitmap));
notificationManager.notify(mLastID++, builder.build());
});
} else {
notificationManager.notify(mLastID++, builder.build());
}
}
@Override
public void onCloseNotification(@NonNull WebNotification notification) {
notificationManager.cancel(mNotificationIDMap.get(notification.tag));
mNotificationIDMap.remove(notification.tag);
}
});
}
}
if(savedInstanceState == null) {
@ -492,7 +430,6 @@ public class GeckoViewActivity extends AppCompatActivity {
super.onDestroy();
}
@Override
protected void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
@ -505,13 +442,6 @@ public class GeckoViewActivity extends AppCompatActivity {
return;
}
if (intent.hasExtra("onClick")) {
int key = intent.getExtras().getInt("onClick");
WebNotification notification = mNotificationMap.get(key);
notification.click();
mNotificationMap.remove(key);
}
setIntent(intent);
if (intent.getData() != null) {

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 717 B

Просмотреть файл

@ -13,8 +13,6 @@ namespace widget {
NS_IMPL_ISUPPORTS(AndroidAlerts, nsIAlertsService)
StaticAutoPtr<AndroidAlerts::ListenerMap> AndroidAlerts::sListenerMap;
nsDataHashtable<nsStringHashKey, java::WebNotification::GlobalRef>
AndroidAlerts::mNotificationsMap;
NS_IMETHODIMP
AndroidAlerts::ShowAlertNotification(
@ -63,18 +61,6 @@ AndroidAlerts::ShowPersistentNotification(const nsAString& aPersistentData,
rv = aAlert->GetName(name);
NS_ENSURE_SUCCESS(rv, NS_OK);
nsAutoString lang;
rv = aAlert->GetLang(lang);
NS_ENSURE_SUCCESS(rv, NS_OK);
nsAutoString dir;
rv = aAlert->GetDir(dir);
NS_ENSURE_SUCCESS(rv, NS_OK);
bool requireInteraction;
rv = aAlert->GetRequireInteraction(&requireInteraction);
NS_ENSURE_SUCCESS(rv, NS_OK);
nsCOMPtr<nsIPrincipal> principal;
rv = aAlert->GetPrincipal(getter_AddRefs(principal));
NS_ENSURE_SUCCESS(rv, NS_OK);
@ -90,41 +76,19 @@ AndroidAlerts::ShowPersistentNotification(const nsAString& aPersistentData,
sListenerMap->Put(name, aAlertListener);
}
if (jni::IsFennec()) {
java::GeckoAppShell::ShowNotification(
name, cookie, title, text, host, imageUrl,
!aPersistentData.IsEmpty() ? jni::StringParam(aPersistentData)
: jni::StringParam(nullptr));
} else {
java::GeckoRuntime::LocalRef runtime = java::GeckoRuntime::GetInstance();
java::WebNotificationDelegate::LocalRef delegate =
runtime->GetWebNotificationDelegate();
java::WebNotification::LocalRef notification = notification->New(
title, name, cookie, text, imageUrl, dir, lang, requireInteraction);
runtime->NotifyOnShow(notification);
mNotificationsMap.Put(name, notification);
}
java::GeckoAppShell::ShowNotification(
name, cookie, title, text, host, imageUrl,
!aPersistentData.IsEmpty() ? jni::StringParam(aPersistentData)
: jni::StringParam(nullptr));
return NS_OK;
}
NS_IMETHODIMP
AndroidAlerts::CloseAlert(const nsAString& aAlertName,
nsIPrincipal* aPrincipal) {
if (jni::IsFennec()) {
// We delete the entry in sListenerMap later, when CloseNotification calls
// NotifyListener.
java::GeckoAppShell::CloseNotification(aAlertName);
} else {
java::WebNotification::LocalRef notification =
mNotificationsMap.Get(aAlertName);
java::GeckoRuntime::LocalRef runtime = java::GeckoRuntime::GetInstance();
java::WebNotificationDelegate::LocalRef delegate =
runtime->GetWebNotificationDelegate();
runtime->NotifyOnClose(notification);
mNotificationsMap.Remove(aAlertName);
}
// We delete the entry in sListenerMap later, when CloseNotification calls
// NotifyListener.
java::GeckoAppShell::CloseNotification(aAlertName);
return NS_OK;
}
@ -143,7 +107,6 @@ void AndroidAlerts::NotifyListener(const nsAString& aName, const char* aTopic,
if (NS_LITERAL_CSTRING("alertfinished").Equals(aTopic)) {
sListenerMap->Remove(aName);
mNotificationsMap.Remove(aName);
}
}

Просмотреть файл

@ -27,9 +27,6 @@ class AndroidAlerts : public nsIAlertsService {
static void NotifyListener(const nsAString& aName, const char* aTopic,
const char16_t* aCookie);
static nsDataHashtable<nsStringHashKey, java::WebNotification::GlobalRef>
mNotificationsMap;
protected:
virtual ~AndroidAlerts() { sListenerMap = nullptr; }