### 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
gfx::Rect rect;
  gin_helper::Promise<gfx::Image> promise(isolate());
  v8::Local<v8::Promise> handle = promise.GetHandle();
   get rect arguments if they exist
  args->GetNext(&rect);
  auto* const view = ontents()->GetRenderWidgetHostView();
  if (!view) {
    promise.Resolve(gfx::Image());
    return handle;
  }
   Capture full page if user doesn't specify a |rect|.
  const gfx::Size view_size =
      rect.IsEmpty() ? view->GetViewBounds().size() : rect.size();
   By default, the requested bitmap size is the view size in screen
   coordinates.  However, if there's more pixel detail available on the
   current system, increase the requested bitmap size to capture it all.
  gfx::Size bitmap_size = view_size;
  const gfx::NativeView native_view = view->GetNativeView();
  const float scale = display::Screen::GetScreen()
                          ->GetDisplayNearestView(native_view)
                          .device_scale_factor();
  if (scale > 1.0f)
    bitmap_size = gfx::ScaleToCeiledSize(view_size, scale);
  view->CopyFromSurface(gfx::Rect(rect.origin(), view_size), bitmap_size,
                        base::BindOnce(&OnCapturePageDone, std::move(promise)));
  return handle;
}
void Ws::IncrementCapturerCount(gin_helper::Arguments* args) {