// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.sdk;
import java.util.List;
/**
* This interface is a part of {@link Script} interface. It covers live editing support.
*/
public interface UpdatableScript {
/**
* Demands that script text should be replaced with a new one if possible. VM may get resumed
* after this command (this is defined by {@link ChangeDescription#isStackModified()}). In this
* case a standard 'suspended' notification is expected in a moment.
* @param newSource new text of script
* TODO: add an explicit output parameter about whether VM was resumed or not.
*/
RelayOk setSourceOnRemote(String newSource, UpdateCallback callback, SyncCallback syncCallback);
/**
* Same as {@link #setSourceOnRemote}, but does not actually update a script, only provides
* a description of the planned changes.
* @param callback receives change plan description
*/
RelayOk previewSetSource(String newSource, UpdateCallback callback, SyncCallback syncCallback);
interface UpdateCallback {
/**
* Script text change has succeeded or was successfully pre-calculated (in preview mode).
* {@link DebugEventListener#scriptContentChanged} will
* be called additionally. Besides, a current context may be dismissed and recreated after this
* event. The order of all listed event notifications is not currently specified.
* @param report unspecified implementation-dependent report for debugging purposes;
* may be null
* @param changeDescription describes live editing change that has been applied or is planned
* to be applied; may be null if backend or VM does not support
*/
void success(Object report, ChangeDescription changeDescription);
void failure(String message);
}
/**
* An interface that explains what has happened/going to happen within script update action.
*/
interface ChangeDescription {
/**
* @return the root of the function change tree
*/
OldFunctionNode getChangeTree();
/**
* @return the description of the textual diff
*/
TextualDiff getTextualDiff();
/**
* @return the name of 'old script' that has been created or null if there was no need in
* creating a script
*/
String getCreatedScriptName();
boolean isStackModified();
}
interface TextualDiff {
/**
* @return textual diff of the script in form of list of 3-element diff chunk parameters
* that are (old_start_pos, old_end_pos, new_end_pos)
*/
List<Long> getChunks();
}
/**
* A basic element of function change tree.
* Subtyped as {@link OldFunctionNode} and {@link NewFunctionNode}.
*/
interface FunctionNode<T extends FunctionNode<T>> {
String getName();
FunctionPositions getPositions();
List<? extends T> children();
OldFunctionNode asOldFunction();
}
interface FunctionPositions {
long getStart();
long getEnd();
}
enum ChangeStatus {
UNCHANGED,
NESTED_CHANGED,
CODE_PATCHED,
DAMAGED
}
/**
* Represents an old function in the changed script. If it has new positions, it is also
* represented in a new version of the script.
*/
interface OldFunctionNode extends FunctionNode<OldFunctionNode> {
ChangeStatus getStatus();
String getStatusExplanation();
/** @return nullable */
FunctionPositions getNewPositions();
List<? extends NewFunctionNode> newChildren();
}
/**
* Represents a brand new function in the changed script, that has no corresponding old function.
*/
interface NewFunctionNode extends FunctionNode<NewFunctionNode> {
}
}