Repository navigation
Offline support for Network page - #8332
Conversation
|
@hrajwade96 is this PR ready for review or is this still a work in progress? |
@kenzieschmoll just finishing up few things, I will mark it ready soon |
…into network_screen_offline_support
Yes you are correct sorry for the confusion. I meant to update the comment about the flag with my edit. For the next PR (adding the buttons behind a flag), I will make that change since I already have a PR prepared. I'll leave the flag off, and then you can make your change to support full offline support for the network page, which requires exporting the data to a JSON file so that it can be reloaded into DevTools in the existing offline mechanism. The majority of the work for that is done in this PR, but the final piece is supporting the full serialization / deserialization to / from JSON.
This is a requirement of adding full offline support for the Network page (where you can export a file and load it back into DevTools later). The offline framework in DevTools serializes to json and loads files from json. |
Oh, okay, no problem. Thanks! I had the idea before, but this made it much clearer.
I thought we are going to add support to re-import the .har file which we can download (like #4470 (comment)). Is it like har and json both formats will be supported for importing? Or now are you thinking to add support for only json for importing back. |
From the work in this PR, adding support for re-importing as JSON seems like it is 90% there. Is that correct? If I understand correctly there is not much work left to support the full JSON serialization / deserialization. If this is almost complete, then I think we should push this across the finish line. This is also good for consistency with how offline data is supported for other DevTools screens. For deserializing the .har files, this work has not started yet, right? At this point, it seems like this would take more work to support, and if the JSON serialization / deserialization is robust and well-tested, then it may not make sense to support importing both types of files. Bringing my comment from #4470 to this thread for reference:
To re-state in the context of this PR, we could consider adding support for importing the .har file to DevTools as a follow up. However, we may be limited if the .har format doesn't allow us to add metadata that we would have in the JSON format (things like filters or other data specific to the DevTools network profiler), so it may not be worth doing. As a user of this tool, I see the user journey as such:
|
Yes correct, I added the remaining piece (disconnected network body) in this PR itself , now we don't need another PR for this. (note: I haven't added OpenSaveButtonGroup for import/export cta since you would be raising a PR with new UI for that, also btw we need to add a call to_fetchFullDataBeforeExport before the json is downloaded just like in case of har).
Ahh ok, at that time I interpreted this comment a little differently regarding the follow-up PR on re-importing .har Hmm, After completing this PR, I'll analyze the approach to add this support and get back to you. Once I've done that, we can discuss whether it's worth pursuing. Does that work?
Hmm, yes got it, thanks |
| } | ||
| } | ||
|
|
||
| class DisconnectedNetworkScreenBody extends StatelessWidget { |
There was a problem hiding this comment.
did you mean to include these changes in this PR? Have you verified that the network data can be exported to JSON and that it can be reloaded into DevTools? If not, we should not add this code yet.
There was a problem hiding this comment.
Actually I did not originally intend to include these changes, but thought to add it as it's relatively not a big change.
I had already verified the happy journey (attaching videos), I am fixing one issue in the response data. I will throughly test it and then let you know, otherwise I can raise it as a separate PR as well.
Screen.Recording.2025-01-29.at.10.55.14.PM.mov
clideo_editor_baefe568f22145b2b04a299b8fd94832.mp4
There was a problem hiding this comment.
Thank you for the videos, this looks great!
One more comment. You said:
also btw we need to add a call to_fetchFullDataBeforeExport before the json is downloaded just like in case of har
Can that be done as part of this PR?
There was a problem hiding this comment.
Thank you for the videos, this looks great!
Yup :)
There was a problem hiding this comment.
One more comment. You said:
also btw we need to add a call to_fetchFullDataBeforeExport before the json is downloaded just like in case of har
Can that be done as part of this PR?
Yes, but then, I had added it in the OpenSaveButtonGroup, which is not a part of this PR, as you would be adding the dropdown in a separate one.
(Note: This function was marked private before make it public)
OpenSaveButtonGroup(
screenId: ScreenMetaData.network.id,
onSave: () async {
await widget.controller.fetchFullDataBeforeExport();
widget.controller.exportData();
},
),There was a problem hiding this comment.
Okay I can apply that change to my follow up PR, thanks for the code pointer.
|
Can you merge with the master branch? The benchmark size threshold was increased recently. |
|
Looks like a legitimate error in the performance benchmarks: |
Sorry for late response got occupied with something. |
…into network_screen_offline_support
…in controller, added a util function isConnected()
I have added the necessary handling wherever service connection was being used. Please run the checks once. |
|
|
||
| void _initHelper() async { | ||
| if (offlineDataController.showingOfflineData.value) { | ||
| if (!isConnected() || offlineDataController.showingOfflineData.value) { |
There was a problem hiding this comment.
we do not want the check here for !isConnected(). It is possible for offline data to be showing even when an existing DevTools app connection exists. Please remove.
There was a problem hiding this comment.
It is possible for offline data to be showing even when an existing DevTools app connection exists. Please remove.
Yes, actually it would show even when a connection exists as it's added with an OR followed by another check. I had added it to prevent recording in disconnected state and show offline data if available even in connected mode) as it was giving below exception.
But now I realise I should instead wrap
await startRecording(); with a If to only execute when connected, as offlineDataController.showingOfflineData.value is the correct check to show offline data, even in disconnected mode.
Uncaught (in promise) DartError: Unexpected null value.
at Object.throw_ [as throw] (errors.dart:307:3)
at Object.nullCheck (profile.dart:117:39)
at network_controller.dart:351:61
at async_patch.dart:622:19
at async_patch.dart:647:23
at Object._asyncStartSync (async_patch.dart:541:3)
at [_recordingNetworkTraffic] (network_controller.dart:347:16)
at network_controller.dart:269:35
at async_patch.dart:622:19
at async_patch.dart:647:23
at Object._asyncStartSync (async_patch.dart:541:3)
at network_controller.NetworkController.new.startRecording (network_controller.dart:267:16)
at network_controller.dart:185:13
at async_patch.dart:622:19
at async_patch.dart:647:23
at Object._asyncStartSync (async_patch.dart:541:3)
at [_initHelper] (network_controller.dart:173:8)
at new network_controller.NetworkController.new (network_controller.dart:56:5)
at app.dart:662:32
at app.dart:545:28...
Hence now I will write it as :
if (offlineDataController.showingOfflineData.value) {
await maybeLoadOfflineData(
NetworkScreen.id,
createData: (json) => OfflineNetworkData.fromJson(json),
// This ignore is used because the 'data' parameter can have a dynamic type,
// which cannot be explicitly typed here due to its dependency on JSON parsing.
// ignore: avoid_dynamic_calls
shouldLoad: (data) => !data.isEmpty,
loadData: (data) => loadOfflineData(data),
);
}
if(serviceConnection.serviceManager.connectedState.value.connected){
await startRecording();
}
Note: I am using second if here instead of using else-if intentionally assuming it should still record the traffic in the background in a scenario where connection exists but user is viewing offline data by importing json into Devtools.
Let me know if this looks correct.
Adding offline support to Network page.
issue link - #4470
List which issues are fixed by this PR.
Please add a note to
packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.mdif your change requires release notes. Otherwise, add the 'release-notes-not-required' label to the PR.Pre-launch Checklist
///).If you need help, consider asking for help on Discord.