/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.runtime.objects.observable;
import static com.github.anba.es6draft.runtime.types.Undefined.UNDEFINED;
import com.github.anba.es6draft.runtime.ExecutionContext;
import com.github.anba.es6draft.runtime.types.Callable;
import com.github.anba.es6draft.runtime.types.Intrinsics;
import com.github.anba.es6draft.runtime.types.ScriptObject;
/**
* Subscription Abstract Operations
*/
public final class SubscriptionAbstractOperations {
private SubscriptionAbstractOperations() {
}
/**
* CreateSubscription ( observer ) Abstract Operation
*
* @param cx
* the execution context
* @param observer
* the observer object
* @return the new subscription object
*/
public static SubscriptionObject CreateSubscription(ExecutionContext cx, ScriptObject observer) {
/* step 1 (implicit) */
/* steps 2-4 */
SubscriptionObject subscription = new SubscriptionObject(cx.getRealm(), observer,
cx.getIntrinsic(Intrinsics.SubscriptionPrototype));
/* step 5 */
return subscription;
}
/**
* CleanupSubscription ( subscription ) Abstract Operation
*
* @param cx
* the execution context
* @param subscription
* the subscription object
*/
public static void CleanupSubscription(ExecutionContext cx, SubscriptionObject subscription) {
/* step 1 (implicit) */
/* step 2 */
Callable cleanup = subscription.getCleanup();
/* step 3 */
if (cleanup == null) {
return;
}
/* step 4 (implicit) */
/* step 5 */
subscription.setCleanup(null);
/* steps 6-7 */
cleanup.call(cx, UNDEFINED);
/* step 8 (return) */
}
/**
* SubscriptionClosed ( subscription ) Abstract Operation
*
* @param subscription
* the subscription object
* @return {@code true} if the subscription object is closed
*/
public static boolean SubscriptionClosed(SubscriptionObject subscription) {
/* step 1 (implicit) */
/* steps 2-3 */
return subscription.getObserver() == null;
}
/**
* CloseSubscription ( subscription ) Abstract Operation
*
* @param cx
* the execution context
* @param subscription
* the subscription object
*/
// FIXME: spec bug - not defined
public static void CloseSubscription(ExecutionContext cx, SubscriptionObject subscription) {
if (SubscriptionClosed(subscription)) {
return;
}
subscription.clearObserver();
CleanupSubscription(cx, subscription);
}
}