This is also the origin of the id parameter, which is passed as part of a larger JSON structure through the executeJavaScript invocation. The corresponding setData call is done by initContent. This method in turn is only called if there isn't already a ComponentUtil.getData(ui, AbstractMprUIContent.class). Requests with this parameter are only sent through fetchRootConfig in vaadinBootstrap.js, which is (assumingly) only triggered through executeJavaScript from AbstractLegacyWrapper.initContent(UI). requests with a v-browserDetails request parameter.
![vaadin ui browser tab vaadin ui browser tab](https://fndong.files.wordpress.com/2016/03/result_vaadin.jpg)
GetBrowserDetailsUI is (supposedly) only triggered by "browser details" requests, i.e. for the same Flow UI) will lead to the original stacktrace. This means that running getBrowserDetailsUI twice with the same ui request parameter (i.e. That method calls AbstractMprUIProvider.createInstance(UICreateEvent) which tries to use an existing instance in the session based on the Flow UI id and otherwise creates a new instance.
#Vaadin ui browser tab code
The only obviously findable code path to doInit goes through getBrowserDetailsUI. It still seems like doInit is run multiple times for the same UI instance since that's the only method that writes to the uiId parameter.
![vaadin ui browser tab vaadin ui browser tab](https://miro.medium.com/max/847/1*4ki0mB8VDCrNVB5wRFdELg.jpeg)
This means that we're back at square one when it comes to guesses about the cause of this problem.
![vaadin ui browser tab vaadin ui browser tab](https://vaadin.com/static/content/learning-center/learn/tutorials/vaadin-designer-tutorial/images/app-grid-populated.png)
That parameter defines the id of the Flow UI from which the newly created MPR UI should find its contents - it has nothing to do with the id of the MPR UI. I had misunderstood the purpose of the ui parameter in the request.