### 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.

Ref #19447

### Issue Details

* **Electron Version:**
  * 9.0.0-beta.24
* **Operating System:**
  * macOS 10.15, Windows 10
* **Last Known Working Electron version:**
  * none

### Expected Behavior
`e.sender` object received from an extension background page should have `webPreferences` and `session` initialized. It looks like `options` in `api::WebContents` constructor don't get initialized properly for an extension background page.

### Actual Behavior
`e.sender` object doesn't have `session` and `e.sender.getWebPreferences()` returns `null`.

### To Reproduce
https://github.com/sentialx/electron-quick-start/tree/extensions/no-session

Just run it and you will see something like this:
![image](https://user-images.githubusercontent.com/11065386/82097607-82994400-9703-11ea-8291-0eb987d8aca0.png)

### Additional Information
This is a real blocker for anyone who would want to provide own `chrome` APIs in background pages initialized from different sessions.
shell/browser/api/electron_api_web_contents.cc
int object_id,
                                            int ref_count) {
  base::ListValue args;
  args.Append(context_id);
  args.Append(object_id);
  args.Append(ref_count);
  EmitWithSender("-ipc-message", bindings_.dispatch_context(), InvokeCallback(),
                 /* interELECTRON_BROWSER_DEREFERENCE",
                 std::move(args));
}
#endif
void Ws::UpdateDraggableRegions(
    std::vector<mojom::DraggableRegionPtr> regions) {
  for (ExtendedWsObserver& observer : observers_)
    observer.OnDraggableRegionsUpdated(regions);
}
void Ws::RenderFrameDeleted(
    content::RenderFrameHost* render_frame_host) {
   A RenderFrameHost can be destroyed before the related Mojo binding is
   closed, which can result in Mojo calls being sent for RenderFrameHosts
   that no longer exist. To prevent this from happening, when a
   RenderFrameHost goes away, we close all the bindings related to that
   frame.
  auto it = frame_to_bindings_map_.find(render_frame_host);
  if (it == frame_to_bindings_map_.end())
    return;
  for (auto id : it->second)
    bindings_.RemoveBinding(id);