зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1504909 Part 3 - Get the current point and recording endpoint from navigation state, r=lsmyth.
--HG-- extra : rebase_source : 41e6702c60412b4869ed80ae9ffc2b55a963d922
This commit is contained in:
Родитель
ab3bd69465
Коммит
6afbd189ab
|
@ -58,7 +58,7 @@ bool MaybeDivergeFromRecording();
|
|||
void PositionHit(const js::BreakpointPosition& aPosition);
|
||||
|
||||
// Get an execution point for hitting the specified position right now.
|
||||
js::ExecutionPoint CurrentExecutionPoint(const js::BreakpointPosition& aPosition);
|
||||
js::ExecutionPoint CurrentExecutionPoint(const Maybe<js::BreakpointPosition>& aPosition);
|
||||
|
||||
// Convert an identifier from NewTimeWarpTarget() which we have seen while
|
||||
// executing into an ExecutionPoint.
|
||||
|
|
|
@ -114,9 +114,9 @@ public:
|
|||
Unsupported("MaybeDivergeFromRecording");
|
||||
}
|
||||
|
||||
// Get the current execution point when recording.
|
||||
virtual ExecutionPoint GetRecordingEndpoint() {
|
||||
Unsupported("GetRecordingEndpoint");
|
||||
// Get the current execution point.
|
||||
virtual ExecutionPoint CurrentExecutionPoint() {
|
||||
Unsupported("CurrentExecutionPoint");
|
||||
}
|
||||
|
||||
// Called when execution reaches the endpoint of the recording.
|
||||
|
@ -191,7 +191,7 @@ public:
|
|||
void RunToPoint(const ExecutionPoint& aTarget) override;
|
||||
void HandleDebuggerRequest(js::CharBuffer* aRequestBuffer) override;
|
||||
bool MaybeDivergeFromRecording() override;
|
||||
ExecutionPoint GetRecordingEndpoint() override;
|
||||
ExecutionPoint CurrentExecutionPoint() override;
|
||||
|
||||
bool EnsureTemporaryCheckpoint();
|
||||
};
|
||||
|
@ -422,8 +422,8 @@ public:
|
|||
return mPhase->MaybeDivergeFromRecording();
|
||||
}
|
||||
|
||||
ExecutionPoint GetRecordingEndpoint() {
|
||||
return mPhase->GetRecordingEndpoint();
|
||||
ExecutionPoint CurrentExecutionPoint() {
|
||||
return mPhase->CurrentExecutionPoint();
|
||||
}
|
||||
|
||||
void SetRecordingEndpoint(size_t aIndex, const ExecutionPoint& aEndpoint) {
|
||||
|
@ -451,6 +451,12 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
ExecutionPoint LastRecordingEndpoint() {
|
||||
// Get the last recording endpoint in the recording file.
|
||||
while (recordreplay::HitRecordingEndpoint()) {}
|
||||
return mRecordingEndpoint;
|
||||
}
|
||||
|
||||
size_t NumTemporaryCheckpoints() {
|
||||
return mTemporaryCheckpoints.length();
|
||||
}
|
||||
|
@ -768,9 +774,8 @@ PausedPhase::EnsureTemporaryCheckpoint()
|
|||
}
|
||||
|
||||
ExecutionPoint
|
||||
PausedPhase::GetRecordingEndpoint()
|
||||
PausedPhase::CurrentExecutionPoint()
|
||||
{
|
||||
MOZ_RELEASE_ASSERT(IsRecording());
|
||||
return mPoint;
|
||||
}
|
||||
|
||||
|
@ -1156,8 +1161,11 @@ RunToPoint(const ExecutionPoint& aTarget)
|
|||
ExecutionPoint
|
||||
GetRecordingEndpoint()
|
||||
{
|
||||
MOZ_RELEASE_ASSERT(IsRecording());
|
||||
return gNavigation->GetRecordingEndpoint();
|
||||
if (IsRecording()) {
|
||||
return gNavigation->CurrentExecutionPoint();
|
||||
} else {
|
||||
return gNavigation->LastRecordingEndpoint();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1180,17 +1188,20 @@ RecordReplayInterface_ExecutionProgressCounter()
|
|||
} // extern "C"
|
||||
|
||||
ExecutionPoint
|
||||
CurrentExecutionPoint(const BreakpointPosition& aPosition)
|
||||
CurrentExecutionPoint(const Maybe<BreakpointPosition>& aPosition)
|
||||
{
|
||||
return ExecutionPoint(gNavigation->LastCheckpoint().mNormal,
|
||||
gProgressCounter, aPosition);
|
||||
if (aPosition.isSome()) {
|
||||
return ExecutionPoint(gNavigation->LastCheckpoint().mNormal,
|
||||
gProgressCounter, aPosition.ref());
|
||||
}
|
||||
return gNavigation->CurrentExecutionPoint();
|
||||
}
|
||||
|
||||
void
|
||||
PositionHit(const BreakpointPosition& position)
|
||||
{
|
||||
AutoDisallowThreadEvents disallow;
|
||||
gNavigation->PositionHit(CurrentExecutionPoint(position));
|
||||
gNavigation->PositionHit(CurrentExecutionPoint(Some(position)));
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
|
|
|
@ -815,14 +815,18 @@ static bool
|
|||
RecordReplay_CurrentExecutionPoint(JSContext* aCx, unsigned aArgc, Value* aVp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(aArgc, aVp);
|
||||
RootedObject obj(aCx, NonNullObject(aCx, args.get(0)));
|
||||
if (!obj) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BreakpointPosition position;
|
||||
if (!position.Decode(aCx, obj)) {
|
||||
return false;
|
||||
Maybe<BreakpointPosition> position;
|
||||
if (!args.get(0).isUndefined()) {
|
||||
RootedObject obj(aCx, NonNullObject(aCx, args.get(0)));
|
||||
if (!obj) {
|
||||
return false;
|
||||
}
|
||||
|
||||
position.emplace();
|
||||
if (!position.ref().Decode(aCx, obj)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ExecutionPoint point = navigation::CurrentExecutionPoint(position);
|
||||
|
@ -854,6 +858,21 @@ RecordReplay_TimeWarpTargetExecutionPoint(JSContext* aCx, unsigned aArgc, Value*
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
RecordReplay_RecordingEndpoint(JSContext* aCx, unsigned aArgc, Value* aVp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(aArgc, aVp);
|
||||
|
||||
ExecutionPoint point = navigation::GetRecordingEndpoint();
|
||||
RootedObject result(aCx, point.Encode(aCx));
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
|
||||
args.rval().setObject(*result);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
RecordReplay_Repaint(JSContext* aCx, unsigned aArgc, Value* aVp)
|
||||
{
|
||||
|
@ -923,6 +942,7 @@ static const JSFunctionSpec gRecordReplayMethods[] = {
|
|||
JS_FN("getContent", RecordReplay_GetContent, 1, 0),
|
||||
JS_FN("currentExecutionPoint", RecordReplay_CurrentExecutionPoint, 1, 0),
|
||||
JS_FN("timeWarpTargetExecutionPoint", RecordReplay_TimeWarpTargetExecutionPoint, 1, 0),
|
||||
JS_FN("recordingEndpoint", RecordReplay_RecordingEndpoint, 0, 0),
|
||||
JS_FN("repaint", RecordReplay_Repaint, 0, 0),
|
||||
JS_FN("dump", RecordReplay_Dump, 1, 0),
|
||||
JS_FS_END
|
||||
|
|
Загрузка…
Ссылка в новой задаче