Skip to content

Commit

Permalink
feat: add support for webContents option in BrowserView (#27032)
Browse files Browse the repository at this point in the history
* feat: add support for webContents option in BrowserView

* tests: add tests

Co-authored-by: sentialx <sentialx@gmail.com>
  • Loading branch information
trop[bot] and sentialx committed Jan 5, 2021
1 parent 97b40e4 commit 1bbf71c
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 21 deletions.
13 changes: 11 additions & 2 deletions shell/browser/api/electron_api_browser_view.cc
Expand Up @@ -78,8 +78,17 @@ BrowserView::BrowserView(gin::Arguments* args,
gin::Dictionary::CreateEmpty(isolate);
options.Get(options::kWebPreferences, &web_preferences);
web_preferences.Set("type", "browserView");
gin::Handle<class WebContents> web_contents =
WebContents::New(isolate, web_preferences);

v8::Local<v8::Value> value;

// Copy the webContents option to webPreferences. This is only used internally
// to implement nativeWindowOpen option.
if (options.Get("webContents", &value)) {
web_preferences.SetHidden("webContents", value);
}

auto web_contents =
WebContents::CreateFromWebPreferences(args->isolate(), web_preferences);

web_contents_.Reset(isolate, web_contents.ToV8());
api_web_contents_ = web_contents.get();
Expand Down
27 changes: 27 additions & 0 deletions shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -3783,6 +3783,33 @@ gin::Handle<WebContents> WebContents::FromOrCreate(
return gin::CreateHandle(isolate, api_web_contents);
}

// static
gin::Handle<WebContents> WebContents::CreateFromWebPreferences(
v8::Isolate* isolate,
const gin_helper::Dictionary& web_preferences) {
// Check if webPreferences has |webContents| option.
gin::Handle<WebContents> web_contents;
if (web_preferences.GetHidden("webContents", &web_contents) &&
!web_contents.IsEmpty()) {
// Set webPreferences from options if using an existing webContents.
// These preferences will be used when the webContent launches new
// render processes.
auto* existing_preferences =
WebContentsPreferences::From(web_contents->web_contents());
base::DictionaryValue web_preferences_dict;
if (gin::ConvertFromV8(isolate, web_preferences.GetHandle(),
&web_preferences_dict)) {
existing_preferences->Clear();
existing_preferences->Merge(web_preferences_dict);
}
} else {
// Create one if not.
web_contents = WebContents::New(isolate, web_preferences);
}

return web_contents;
}

// static
WebContents* WebContents::FromID(int32_t id) {
return GetAllWebContents().Lookup(id);
Expand Down
4 changes: 4 additions & 0 deletions shell/browser/api/electron_api_web_contents.h
Expand Up @@ -135,6 +135,10 @@ class WebContents : public gin::Wrappable<WebContents>,
v8::Isolate* isolate,
content::WebContents* web_contents);

static gin::Handle<WebContents> CreateFromWebPreferences(
v8::Isolate* isolate,
const gin_helper::Dictionary& web_preferences);

// gin::Wrappable
static gin::WrapperInfo kWrapperInfo;
static v8::Local<v8::ObjectTemplate> FillObjectTemplate(
Expand Down
22 changes: 3 additions & 19 deletions shell/browser/api/electron_api_web_contents_view.cc
Expand Up @@ -97,25 +97,9 @@ v8::Local<v8::Function> WebContentsView::GetConstructor(v8::Isolate* isolate) {
gin_helper::WrappableBase* WebContentsView::New(
gin_helper::Arguments* args,
const gin_helper::Dictionary& web_preferences) {
// Check if BrowserWindow has passend |webContents| option to us.
gin::Handle<WebContents> web_contents;
if (web_preferences.GetHidden("webContents", &web_contents) &&
!web_contents.IsEmpty()) {
// Set webPreferences from options if using an existing webContents.
// These preferences will be used when the webContent launches new
// render processes.
auto* existing_preferences =
WebContentsPreferences::From(web_contents->web_contents());
base::DictionaryValue web_preferences_dict;
if (gin::ConvertFromV8(args->isolate(), web_preferences.GetHandle(),
&web_preferences_dict)) {
existing_preferences->Clear();
existing_preferences->Merge(web_preferences_dict);
}
} else {
// Create one if not.
web_contents = WebContents::New(args->isolate(), web_preferences);
}
auto web_contents =
WebContents::CreateFromWebPreferences(args->isolate(), web_preferences);

// Constructor call.
auto* view = new WebContentsView(args->isolate(), web_contents);
view->InitWithArgs(args);
Expand Down
9 changes: 9 additions & 0 deletions spec-main/api-browser-view-spec.ts
Expand Up @@ -39,6 +39,15 @@ describe('BrowserView module', () => {
expect(webContents.getAllWebContents()).to.have.length(0);
});

it('can be created with an existing webContents', async () => {
const wc = (webContents as any).create({ sandbox: true });
await wc.loadURL('about:blank');

view = new BrowserView({ webContents: wc } as any);

expect(view.webContents.getURL()).to.equal('about:blank');
});

describe('BrowserView.setBackgroundColor()', () => {
it('does not throw for valid args', () => {
view = new BrowserView();
Expand Down

0 comments on commit 1bbf71c

Please sign in to comment.