<!--  As an open source project with a dedicated but small maintainer team, it can sometimes take a long time for issues to be addressed so please be patient and we will get back to you as soon as we can.
-->

### Preflight Checklist
<!-- Please ensure you've completed the following steps by replacing [ ] with [x]-->

* [x] I have read the [Contributing Guidelines](https://github.com/electron/electron/blob/master/CONTRIBUTING.md) for this project.
* [x] I agree to follow the [Code of Conduct](https://github.com/electron/electron/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
* [x] I have searched the issue tracker for an issue that matches the one I want to file, without success.

### Issue Details

* **Electron Version:** 8 (but same in sources)
  * <!-- (output of `node_modules/.bin/electron --version`) e.g. 4.0.3 -->
* **Operating System:** Windows 10 (1909)
  * <!-- (Platform and Version) e.g. macOS 10.13.6 / Windows 10 (1803) / Ubuntu 18.04 x64 -->
* **Last Known Working Electron version:** N/A
  * <!-- (if applicable) e.g. 3.1.0 -->

### Expected Behavior

In the [Debugger.message event](https://www.electronjs.org/docs/api/debugger#event-message), it is necessary to get the `sessionId` to be able to distinguish messages relevant to the page versus any iframes, service workers, etc. I would expect the session ID to be given in the event callback.

### Actual Behavior

The debugger domain does not expose these.

Messages are emitted only with the method and params, but not the session ID

https://github.com/electron/electron/blob/e1e73fa5f5e96af7c352053f34879e44ea8ab0bd/shell/browser/api/electron_api_debugger.cc#L67

In CDP these messages would normally come like:


```js
{
  "method": "Debugger.scriptParsed",
  "params": { /* bunch o' script info */ },
  "sessionId": "8700AB9D8FEA7A760268CE9B50F369E2" // <-- we need this!
}
```

### To Reproduce

Fiddle: https://gist.github.com/c480df80e612d06befb2d7068f0aff6e

The fiddle connect the debugger to a page with an iframe, and attaches to all targets. It logs all the arguments/data sent in the `message` event. Observe that the session ID is missing; there's no way to distinguish which frame the scriptParsed events are coming from.
shell/browser/api/electron_api_debugger.cc
DCHECK(agent_host == agent_host_);
  agent_host_ = nullptr;
  ClearPendingRequests();
  Emit("detach", "target closed");
}
void Debugger::DispatchProtocolMessage(DevToolsAgentHost* agent_host,
                                       base::span<const uint8_t> message) {
  DCHECK(agent_host == agent_host_);
  v8::Isolate* isolate = JavascriptEnvironment::GetIsolate();
  v8::Locker locker(isolate);
  v8::HandleScope handle_scope(isolate);
  base::StringPiece message_str(reinterpret_cast<const char*>(message.data()),
                                message.size());
  std::unique_ptr<base::Value> parsed_message =
      base::JSONReader::ReadDeprecated(message_str,
                                       base::JSON_REPLACE_INVALID_CHARACTERS);
  if (!parsed_message || !parsed_message->is_dict())
    return;
  base::DictionaryValue* dict =
      static_cast<base::DictionaryValue*>(parsed_message.get());
  int id;
  if (!dict->GetInteger("id", &id)) {
    std::string method;
    if (!dict->GetString("method", &method))
      return;
    base::DictionaryValue* params_value = nullptr;
    base::DictionaryValue params;
    if (dict->GetDictionary("params", &params_value))
      params.Swap(params_value);
    Emit("message", method, params);