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:
Brian Hackett 2018-11-06 07:37:22 -10:00
Родитель ab3bd69465
Коммит 6afbd189ab
3 изменённых файлов: 53 добавлений и 22 удалений

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

@ -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