Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Unified Diff: plugins/org.chromium.sdk/src/org/chromium/sdk/internal/v8native/value/JsVariableBase.java

Issue 11662019: Support variable changing in SDK interface and v8 native (Closed) Base URL: https://chromedevtools.googlecode.com/svn/trunk
Patch Set: merge Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: plugins/org.chromium.sdk/src/org/chromium/sdk/internal/v8native/value/JsVariableBase.java
diff --git a/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/v8native/value/JsVariableBase.java b/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/v8native/value/JsVariableBase.java
index c7e9abaae7526c3002ae5996cc8c7b369aa8ce40..2b08482f850d0e3852044eb50d8b826ae2272228 100644
--- a/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/v8native/value/JsVariableBase.java
+++ b/plugins/org.chromium.sdk/src/org/chromium/sdk/internal/v8native/value/JsVariableBase.java
@@ -7,32 +7,35 @@ package org.chromium.sdk.internal.v8native.value;
import org.chromium.sdk.JsEvaluateContext.EvaluateCallback;
import org.chromium.sdk.JsFunction;
+import org.chromium.sdk.JsObjectProperty;
import org.chromium.sdk.JsValue;
import org.chromium.sdk.JsValue.Type;
-import org.chromium.sdk.JsObjectProperty;
import org.chromium.sdk.JsVariable;
import org.chromium.sdk.RelayOk;
import org.chromium.sdk.SyncCallback;
+import org.chromium.sdk.internal.v8native.InternalContext;
+import org.chromium.sdk.internal.v8native.JsEvaluateContextImpl;
/**
* A generic implementation of the JsVariable interface.
*/
public abstract class JsVariableBase implements JsVariable {
- /** The lazily constructed value of this variable. */
- private final JsValueBase value;
+ private final Host host;
+
+ /** The value of this variable. */
+ private volatile JsValueBase value;
/** Variable name. */
private final Object rawName;
/**
- * Constructs a variable contained in the given context with the given
- * value mirror.
- *
+ * Constructs a variable contained in the given context with the given value mirror.
* @param valueLoader that owns this variable
* @param valueData for this variable
*/
- public JsVariableBase(ValueLoader valueLoader, ValueMirror valueData, Object rawName) {
+ public JsVariableBase(Host host, ValueLoader valueLoader, ValueMirror valueData, Object rawName) {
+ this.host = host;
this.rawName = rawName;
this.value = createValue(valueLoader, valueData);
}
@@ -75,7 +78,7 @@ public abstract class JsVariableBase implements JsVariable {
@Override
public boolean isMutable() {
- return false; // TODO(apavlov): fix once V8 supports it
+ return host != null && host.isMutable();
}
@Override
@@ -85,10 +88,42 @@ public abstract class JsVariableBase implements JsVariable {
}
@Override
- public synchronized void setValue(String newValue, SetValueCallback callback) {
- // TODO(apavlov): currently V8 does not support it
- if (!isMutable()) {
- throw new UnsupportedOperationException();
+ public RelayOk setValue(JsValue newValue, final SetValueCallback userCallback,
+ SyncCallback syncCallback) throws UnsupportedOperationException {
+ JsValueBase jsValueBase = castValueArgument(newValue);
+ String variableName = rawName.toString();
+ JsEvaluateContextImpl.CallbackInternal hostCallback =
+ new JsEvaluateContextImpl.CallbackInternal() {
+ @Override
+ public void success(JsValueBase newValue) {
+ value = newValue;
+ if (userCallback != null) {
+ userCallback.success();
+ }
+ }
+
+ @Override
+ public void exception(JsValueBase exception) {
+ if (userCallback != null) {
+ userCallback.exceptionThrown(exception);
+ }
+ }
+
+ @Override
+ public void failure(Exception cause) {
+ if (userCallback != null) {
+ userCallback.failure(cause);
+ }
+ }
+ };
+ return host.setValue(variableName, jsValueBase, hostCallback, syncCallback);
+ }
+
+ private static JsValueBase castValueArgument(JsValue value) {
+ try {
+ return (JsValueBase) value;
+ } catch (ClassCastException e) {
+ throw new IllegalArgumentException("Incorrect value argument", e);
}
}
@@ -104,11 +139,31 @@ public abstract class JsVariableBase implements JsVariable {
}
/**
+ * A host of variable. It's responsible for changing variable value.
+ */
+ static abstract class Host {
+ private final InternalContext internalContext;
+
+ protected Host(InternalContext internalContext) {
+ this.internalContext = internalContext;
+ }
+
+ InternalContext getInternalContext() {
+ return internalContext;
+ }
+
+ abstract boolean isMutable();
+
+ abstract RelayOk setValue(String variableName, JsValueBase jsValueBase,
+ JsEvaluateContextImpl.CallbackInternal callback, SyncCallback syncCallback);
+ }
+
+ /**
* A non-abstract class that implements JsVariable.
*/
public static class Impl extends JsVariableBase {
- public Impl(ValueLoader valueLoader, ValueMirror valueData, Object rawName) {
- super(valueLoader, valueData, rawName);
+ public Impl(Host host, ValueLoader valueLoader, ValueMirror valueData, Object rawName) {
+ super(host, valueLoader, valueData, rawName);
}
@Override public JsObjectProperty asObjectProperty() {
@@ -122,8 +177,8 @@ public abstract class JsVariableBase implements JsVariable {
* TODO: properly support getters, setters etc. once supported by protocol.
*/
static class Property extends JsVariableBase implements JsObjectProperty {
- public Property(ValueLoader valueLoader, ValueMirror valueData, Object rawName) {
- super(valueLoader, valueData, rawName);
+ public Property(Host host, ValueLoader valueLoader, ValueMirror valueData, Object rawName) {
+ super(host, valueLoader, valueData, rawName);
}
@Override public JsObjectProperty asObjectProperty() {
return this;

Powered by Google App Engine
This is Rietveld 408576698