Merge pull request #9166 from electron/browserview
Implement initial, experimental BrowserView API
This commit is contained in:
commit
7f4bd79b01
27 changed files with 832 additions and 156 deletions
162
atom/browser/api/atom_api_browser_view.cc
Normal file
162
atom/browser/api/atom_api_browser_view.cc
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/api/atom_api_browser_view.h"
|
||||||
|
|
||||||
|
#include "atom/browser/api/atom_api_web_contents.h"
|
||||||
|
#include "atom/browser/browser.h"
|
||||||
|
#include "atom/browser/native_browser_view.h"
|
||||||
|
#include "atom/common/color_util.h"
|
||||||
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/value_converter.h"
|
||||||
|
#include "atom/common/node_includes.h"
|
||||||
|
#include "atom/common/options_switches.h"
|
||||||
|
#include "native_mate/constructor.h"
|
||||||
|
#include "native_mate/dictionary.h"
|
||||||
|
#include "ui/gfx/geometry/rect.h"
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Converter<atom::AutoResizeFlags> {
|
||||||
|
static bool FromV8(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::Value> val,
|
||||||
|
atom::AutoResizeFlags* auto_resize_flags) {
|
||||||
|
mate::Dictionary params;
|
||||||
|
if (!ConvertFromV8(isolate, val, ¶ms)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t flags = 0;
|
||||||
|
bool width = false;
|
||||||
|
if (params.Get("width", &width) && width) {
|
||||||
|
flags |= atom::kAutoResizeWidth;
|
||||||
|
}
|
||||||
|
bool height = false;
|
||||||
|
if (params.Get("height", &height) && height) {
|
||||||
|
flags |= atom::kAutoResizeHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
*auto_resize_flags = static_cast<atom::AutoResizeFlags>(flags);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mate
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
|
||||||
|
BrowserView::BrowserView(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::Object> wrapper,
|
||||||
|
const mate::Dictionary& options)
|
||||||
|
: api_web_contents_(nullptr) {
|
||||||
|
Init(isolate, wrapper, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BrowserView::Init(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::Object> wrapper,
|
||||||
|
const mate::Dictionary& options) {
|
||||||
|
mate::Dictionary web_preferences = mate::Dictionary::CreateEmpty(isolate);
|
||||||
|
options.Get(options::kWebPreferences, &web_preferences);
|
||||||
|
web_preferences.Set("isBrowserView", true);
|
||||||
|
mate::Handle<class WebContents> web_contents =
|
||||||
|
WebContents::Create(isolate, web_preferences);
|
||||||
|
|
||||||
|
web_contents_.Reset(isolate, web_contents.ToV8());
|
||||||
|
api_web_contents_ = web_contents.get();
|
||||||
|
|
||||||
|
view_.reset(NativeBrowserView::Create(
|
||||||
|
api_web_contents_->managed_web_contents()->GetView()));
|
||||||
|
|
||||||
|
InitWith(isolate, wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
BrowserView::~BrowserView() {
|
||||||
|
api_web_contents_->DestroyWebContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::WrappableBase* BrowserView::New(mate::Arguments* args) {
|
||||||
|
if (!Browser::Get()->is_ready()) {
|
||||||
|
args->ThrowError("Cannot create BrowserView before app is ready");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args->Length() > 1) {
|
||||||
|
args->ThrowError("Too many arguments");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
mate::Dictionary options;
|
||||||
|
if (!(args->Length() == 1 && args->GetNext(&options))) {
|
||||||
|
options = mate::Dictionary::CreateEmpty(args->isolate());
|
||||||
|
}
|
||||||
|
|
||||||
|
return new BrowserView(args->isolate(), args->GetThis(), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t BrowserView::ID() const {
|
||||||
|
return weak_map_id();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BrowserView::SetAutoResize(AutoResizeFlags flags) {
|
||||||
|
view_->SetAutoResizeFlags(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BrowserView::SetBounds(const gfx::Rect& bounds) {
|
||||||
|
view_->SetBounds(bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BrowserView::SetBackgroundColor(const std::string& color_name) {
|
||||||
|
view_->SetBackgroundColor(ParseHexColor(color_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
v8::Local<v8::Value> BrowserView::WebContents() {
|
||||||
|
if (web_contents_.IsEmpty()) {
|
||||||
|
return v8::Null(isolate());
|
||||||
|
}
|
||||||
|
|
||||||
|
return v8::Local<v8::Value>::New(isolate(), web_contents_);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
void BrowserView::BuildPrototype(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::FunctionTemplate> prototype) {
|
||||||
|
prototype->SetClassName(mate::StringToV8(isolate, "BrowserView"));
|
||||||
|
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
|
||||||
|
.MakeDestroyable()
|
||||||
|
.SetMethod("setAutoResize", &BrowserView::SetAutoResize)
|
||||||
|
.SetMethod("setBounds", &BrowserView::SetBounds)
|
||||||
|
.SetMethod("setBackgroundColor", &BrowserView::SetBackgroundColor)
|
||||||
|
.SetProperty("webContents", &BrowserView::WebContents)
|
||||||
|
.SetProperty("id", &BrowserView::ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace api
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using atom::api::BrowserView;
|
||||||
|
|
||||||
|
void Initialize(v8::Local<v8::Object> exports,
|
||||||
|
v8::Local<v8::Value> unused,
|
||||||
|
v8::Local<v8::Context> context,
|
||||||
|
void* priv) {
|
||||||
|
v8::Isolate* isolate = context->GetIsolate();
|
||||||
|
BrowserView::SetConstructor(isolate, base::Bind(&BrowserView::New));
|
||||||
|
|
||||||
|
mate::Dictionary browser_view(
|
||||||
|
isolate, BrowserView::GetConstructor(isolate)->GetFunction());
|
||||||
|
|
||||||
|
mate::Dictionary dict(isolate, exports);
|
||||||
|
dict.Set("BrowserView", browser_view);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_browser_browser_view, Initialize)
|
72
atom/browser/api/atom_api_browser_view.h
Normal file
72
atom/browser/api/atom_api_browser_view.h
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_API_ATOM_API_BROWSER_VIEW_H_
|
||||||
|
#define ATOM_BROWSER_API_ATOM_API_BROWSER_VIEW_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "atom/browser/api/trackable_object.h"
|
||||||
|
#include "atom/browser/native_browser_view.h"
|
||||||
|
#include "native_mate/handle.h"
|
||||||
|
|
||||||
|
namespace gfx {
|
||||||
|
class Rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
class Arguments;
|
||||||
|
class Dictionary;
|
||||||
|
} // namespace mate
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
class NativeBrowserView;
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
|
||||||
|
class WebContents;
|
||||||
|
|
||||||
|
class BrowserView : public mate::TrackableObject<BrowserView> {
|
||||||
|
public:
|
||||||
|
static mate::WrappableBase* New(mate::Arguments* args);
|
||||||
|
|
||||||
|
static void BuildPrototype(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::FunctionTemplate> prototype);
|
||||||
|
|
||||||
|
NativeBrowserView* view() const { return view_.get(); }
|
||||||
|
|
||||||
|
int32_t ID() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BrowserView(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::Object> wrapper,
|
||||||
|
const mate::Dictionary& options);
|
||||||
|
~BrowserView() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Init(v8::Isolate* isolate,
|
||||||
|
v8::Local<v8::Object> wrapper,
|
||||||
|
const mate::Dictionary& options);
|
||||||
|
|
||||||
|
void SetAutoResize(AutoResizeFlags flags);
|
||||||
|
void SetBounds(const gfx::Rect& bounds);
|
||||||
|
void SetBackgroundColor(const std::string& color_name);
|
||||||
|
|
||||||
|
v8::Local<v8::Value> WebContents();
|
||||||
|
|
||||||
|
v8::Global<v8::Value> web_contents_;
|
||||||
|
class WebContents* api_web_contents_;
|
||||||
|
|
||||||
|
std::unique_ptr<NativeBrowserView> view_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(BrowserView);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace api
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_API_ATOM_API_BROWSER_VIEW_H_
|
|
@ -188,6 +188,7 @@ struct Converter<atom::api::WebContents::Type> {
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case Type::BACKGROUND_PAGE: type = "backgroundPage"; break;
|
case Type::BACKGROUND_PAGE: type = "backgroundPage"; break;
|
||||||
case Type::BROWSER_WINDOW: type = "window"; break;
|
case Type::BROWSER_WINDOW: type = "window"; break;
|
||||||
|
case Type::BROWSER_VIEW: type = "browserView"; break;
|
||||||
case Type::REMOTE: type = "remote"; break;
|
case Type::REMOTE: type = "remote"; break;
|
||||||
case Type::WEB_VIEW: type = "webview"; break;
|
case Type::WEB_VIEW: type = "webview"; break;
|
||||||
case Type::OFF_SCREEN: type = "offscreen"; break;
|
case Type::OFF_SCREEN: type = "offscreen"; break;
|
||||||
|
@ -202,10 +203,12 @@ struct Converter<atom::api::WebContents::Type> {
|
||||||
std::string type;
|
std::string type;
|
||||||
if (!ConvertFromV8(isolate, val, &type))
|
if (!ConvertFromV8(isolate, val, &type))
|
||||||
return false;
|
return false;
|
||||||
if (type == "webview") {
|
if (type == "backgroundPage") {
|
||||||
*out = Type::WEB_VIEW;
|
|
||||||
} else if (type == "backgroundPage") {
|
|
||||||
*out = Type::BACKGROUND_PAGE;
|
*out = Type::BACKGROUND_PAGE;
|
||||||
|
} else if (type == "browserView") {
|
||||||
|
*out = Type::BROWSER_VIEW;
|
||||||
|
} else if (type == "webview") {
|
||||||
|
*out = Type::WEB_VIEW;
|
||||||
} else if (type == "offscreen") {
|
} else if (type == "offscreen") {
|
||||||
*out = Type::OFF_SCREEN;
|
*out = Type::OFF_SCREEN;
|
||||||
} else {
|
} else {
|
||||||
|
@ -306,6 +309,8 @@ WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
|
||||||
type_ = WEB_VIEW;
|
type_ = WEB_VIEW;
|
||||||
else if (options.Get("isBackgroundPage", &b) && b)
|
else if (options.Get("isBackgroundPage", &b) && b)
|
||||||
type_ = BACKGROUND_PAGE;
|
type_ = BACKGROUND_PAGE;
|
||||||
|
else if (options.Get("isBrowserView", &b) && b)
|
||||||
|
type_ = BROWSER_VIEW;
|
||||||
else if (options.Get("offscreen", &b) && b)
|
else if (options.Get("offscreen", &b) && b)
|
||||||
type_ = OFF_SCREEN;
|
type_ = OFF_SCREEN;
|
||||||
|
|
||||||
|
|
|
@ -53,10 +53,11 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||||
public:
|
public:
|
||||||
enum Type {
|
enum Type {
|
||||||
BACKGROUND_PAGE, // A DevTools extension background page.
|
BACKGROUND_PAGE, // A DevTools extension background page.
|
||||||
BROWSER_WINDOW, // Used by BrowserWindow.
|
BROWSER_WINDOW, // Used by BrowserWindow.
|
||||||
REMOTE, // Thin wrap around an existing WebContents.
|
BROWSER_VIEW, // Used by BrowserView.
|
||||||
WEB_VIEW, // Used by <webview>.
|
REMOTE, // Thin wrap around an existing WebContents.
|
||||||
OFF_SCREEN, // Used for offscreen rendering
|
WEB_VIEW, // Used by <webview>.
|
||||||
|
OFF_SCREEN, // Used for offscreen rendering
|
||||||
};
|
};
|
||||||
|
|
||||||
// For node.js callback function type: function(error, buffer)
|
// For node.js callback function type: function(error, buffer)
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "atom/browser/api/atom_api_window.h"
|
#include "atom/browser/api/atom_api_window.h"
|
||||||
#include "atom/common/native_mate_converters/value_converter.h"
|
#include "atom/common/native_mate_converters/value_converter.h"
|
||||||
|
|
||||||
|
#include "atom/browser/api/atom_api_browser_view.h"
|
||||||
#include "atom/browser/api/atom_api_menu.h"
|
#include "atom/browser/api/atom_api_menu.h"
|
||||||
#include "atom/browser/api/atom_api_web_contents.h"
|
#include "atom/browser/api/atom_api_web_contents.h"
|
||||||
#include "atom/browser/browser.h"
|
#include "atom/browser/browser.h"
|
||||||
|
@ -816,6 +817,25 @@ std::vector<v8::Local<v8::Object>> Window::GetChildWindows() const {
|
||||||
return child_windows_.Values(isolate());
|
return child_windows_.Values(isolate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v8::Local<v8::Value> Window::GetBrowserView() const {
|
||||||
|
if (browser_view_.IsEmpty()) {
|
||||||
|
return v8::Null(isolate());
|
||||||
|
}
|
||||||
|
|
||||||
|
return v8::Local<v8::Value>::New(isolate(), browser_view_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::SetBrowserView(v8::Local<v8::Value> value) {
|
||||||
|
mate::Handle<BrowserView> browser_view;
|
||||||
|
if (value->IsNull()) {
|
||||||
|
window_->SetBrowserView(nullptr);
|
||||||
|
browser_view_.Reset();
|
||||||
|
} else if (mate::ConvertFromV8(isolate(), value, &browser_view)) {
|
||||||
|
window_->SetBrowserView(browser_view->view());
|
||||||
|
browser_view_.Reset(isolate(), value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool Window::IsModal() const {
|
bool Window::IsModal() const {
|
||||||
return window_->is_modal();
|
return window_->is_modal();
|
||||||
}
|
}
|
||||||
|
@ -862,10 +882,11 @@ int32_t Window::ID() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
v8::Local<v8::Value> Window::WebContents(v8::Isolate* isolate) {
|
v8::Local<v8::Value> Window::WebContents(v8::Isolate* isolate) {
|
||||||
if (web_contents_.IsEmpty())
|
if (web_contents_.IsEmpty()) {
|
||||||
return v8::Null(isolate);
|
return v8::Null(isolate);
|
||||||
else
|
}
|
||||||
return v8::Local<v8::Value>::New(isolate, web_contents_);
|
|
||||||
|
return v8::Local<v8::Value>::New(isolate, web_contents_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::RemoveFromParentChildWindows() {
|
void Window::RemoveFromParentChildWindows() {
|
||||||
|
@ -910,6 +931,8 @@ void Window::BuildPrototype(v8::Isolate* isolate,
|
||||||
#endif
|
#endif
|
||||||
.SetMethod("getParentWindow", &Window::GetParentWindow)
|
.SetMethod("getParentWindow", &Window::GetParentWindow)
|
||||||
.SetMethod("getChildWindows", &Window::GetChildWindows)
|
.SetMethod("getChildWindows", &Window::GetChildWindows)
|
||||||
|
.SetMethod("getBrowserView", &Window::GetBrowserView)
|
||||||
|
.SetMethod("setBrowserView", &Window::SetBrowserView)
|
||||||
.SetMethod("isModal", &Window::IsModal)
|
.SetMethod("isModal", &Window::IsModal)
|
||||||
.SetMethod("getNativeWindowHandle", &Window::GetNativeWindowHandle)
|
.SetMethod("getNativeWindowHandle", &Window::GetNativeWindowHandle)
|
||||||
.SetMethod("getBounds", &Window::GetBounds)
|
.SetMethod("getBounds", &Window::GetBounds)
|
||||||
|
|
|
@ -180,6 +180,8 @@ class Window : public mate::TrackableObject<Window>,
|
||||||
void SetParentWindow(v8::Local<v8::Value> value, mate::Arguments* args);
|
void SetParentWindow(v8::Local<v8::Value> value, mate::Arguments* args);
|
||||||
v8::Local<v8::Value> GetParentWindow() const;
|
v8::Local<v8::Value> GetParentWindow() const;
|
||||||
std::vector<v8::Local<v8::Object>> GetChildWindows() const;
|
std::vector<v8::Local<v8::Object>> GetChildWindows() const;
|
||||||
|
v8::Local<v8::Value> GetBrowserView() const;
|
||||||
|
void SetBrowserView(v8::Local<v8::Value> value);
|
||||||
bool IsModal() const;
|
bool IsModal() const;
|
||||||
v8::Local<v8::Value> GetNativeWindowHandle();
|
v8::Local<v8::Value> GetNativeWindowHandle();
|
||||||
|
|
||||||
|
@ -220,6 +222,7 @@ class Window : public mate::TrackableObject<Window>,
|
||||||
MessageCallbackMap messages_callback_map_;
|
MessageCallbackMap messages_callback_map_;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
v8::Global<v8::Value> browser_view_;
|
||||||
v8::Global<v8::Value> web_contents_;
|
v8::Global<v8::Value> web_contents_;
|
||||||
v8::Global<v8::Value> menu_;
|
v8::Global<v8::Value> menu_;
|
||||||
v8::Global<v8::Value> parent_window_;
|
v8::Global<v8::Value> parent_window_;
|
||||||
|
|
|
@ -178,9 +178,14 @@ void CommonWebContentsDelegate::SetOwnerWindow(NativeWindow* owner_window) {
|
||||||
|
|
||||||
void CommonWebContentsDelegate::SetOwnerWindow(
|
void CommonWebContentsDelegate::SetOwnerWindow(
|
||||||
content::WebContents* web_contents, NativeWindow* owner_window) {
|
content::WebContents* web_contents, NativeWindow* owner_window) {
|
||||||
owner_window_ = owner_window->GetWeakPtr();
|
owner_window_ = owner_window ? owner_window->GetWeakPtr() : nullptr;
|
||||||
NativeWindowRelay* relay = new NativeWindowRelay(owner_window_);
|
NativeWindowRelay* relay = new NativeWindowRelay(owner_window_);
|
||||||
web_contents->SetUserData(relay->key, relay);
|
if (owner_window) {
|
||||||
|
web_contents->SetUserData(relay->key, relay);
|
||||||
|
} else {
|
||||||
|
web_contents->RemoveUserData(relay->key);
|
||||||
|
delete relay;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommonWebContentsDelegate::ResetManagedWebContents() {
|
void CommonWebContentsDelegate::ResetManagedWebContents() {
|
||||||
|
|
18
atom/browser/native_browser_view.cc
Normal file
18
atom/browser/native_browser_view.cc
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view.h"
|
||||||
|
|
||||||
|
#include "atom/browser/api/atom_api_web_contents.h"
|
||||||
|
#include "brightray/browser/inspectable_web_contents_view.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
NativeBrowserView::NativeBrowserView(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view)
|
||||||
|
: web_contents_view_(web_contents_view) {}
|
||||||
|
|
||||||
|
NativeBrowserView::~NativeBrowserView() {}
|
||||||
|
|
||||||
|
} // namespace atom
|
57
atom/browser/native_browser_view.h
Normal file
57
atom/browser/native_browser_view.h
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_NATIVE_BROWSER_VIEW_H_
|
||||||
|
#define ATOM_BROWSER_NATIVE_BROWSER_VIEW_H_
|
||||||
|
|
||||||
|
#include "base/macros.h"
|
||||||
|
#include "third_party/skia/include/core/SkColor.h"
|
||||||
|
|
||||||
|
namespace brightray {
|
||||||
|
class InspectableWebContentsView;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace gfx {
|
||||||
|
class Rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
class WebContents;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum AutoResizeFlags {
|
||||||
|
kAutoResizeWidth = 0x1,
|
||||||
|
kAutoResizeHeight = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
|
class NativeBrowserView {
|
||||||
|
public:
|
||||||
|
virtual ~NativeBrowserView();
|
||||||
|
|
||||||
|
static NativeBrowserView* Create(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view);
|
||||||
|
|
||||||
|
brightray::InspectableWebContentsView* GetInspectableWebContentsView() {
|
||||||
|
return web_contents_view_;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void SetAutoResizeFlags(uint8_t flags) = 0;
|
||||||
|
virtual void SetBounds(const gfx::Rect& bounds) = 0;
|
||||||
|
virtual void SetBackgroundColor(SkColor color) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
explicit NativeBrowserView(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view);
|
||||||
|
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(NativeBrowserView);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_NATIVE_BROWSER_VIEW_H_
|
30
atom/browser/native_browser_view_mac.h
Normal file
30
atom/browser/native_browser_view_mac.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_NATIVE_BROWSER_VIEW_MAC_H_
|
||||||
|
#define ATOM_BROWSER_NATIVE_BROWSER_VIEW_MAC_H_
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
class NativeBrowserViewMac : public NativeBrowserView {
|
||||||
|
public:
|
||||||
|
explicit NativeBrowserViewMac(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view);
|
||||||
|
~NativeBrowserViewMac() override;
|
||||||
|
|
||||||
|
void SetAutoResizeFlags(uint8_t flags) override;
|
||||||
|
void SetBounds(const gfx::Rect& bounds) override;
|
||||||
|
void SetBackgroundColor(SkColor color) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(NativeBrowserViewMac);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_NATIVE_BROWSER_VIEW_MAC_H_
|
60
atom/browser/native_browser_view_mac.mm
Normal file
60
atom/browser/native_browser_view_mac.mm
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view_mac.h"
|
||||||
|
|
||||||
|
#include "brightray/browser/inspectable_web_contents_view.h"
|
||||||
|
#include "skia/ext/skia_utils_mac.h"
|
||||||
|
#include "ui/gfx/geometry/rect.h"
|
||||||
|
|
||||||
|
// Match view::Views behavior where the view sticks to the top-left origin.
|
||||||
|
const NSAutoresizingMaskOptions kDefaultAutoResizingMask =
|
||||||
|
NSViewMaxXMargin | NSViewMinYMargin;
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
NativeBrowserViewMac::NativeBrowserViewMac(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view)
|
||||||
|
: NativeBrowserView(web_contents_view) {
|
||||||
|
auto* view = GetInspectableWebContentsView()->GetNativeView();
|
||||||
|
view.autoresizingMask = kDefaultAutoResizingMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeBrowserViewMac::~NativeBrowserViewMac() {}
|
||||||
|
|
||||||
|
void NativeBrowserViewMac::SetAutoResizeFlags(uint8_t flags) {
|
||||||
|
NSAutoresizingMaskOptions autoresizing_mask = kDefaultAutoResizingMask;
|
||||||
|
if (flags & kAutoResizeWidth) {
|
||||||
|
autoresizing_mask |= NSViewWidthSizable;
|
||||||
|
}
|
||||||
|
if (flags & kAutoResizeHeight) {
|
||||||
|
autoresizing_mask |= NSViewHeightSizable;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* view = GetInspectableWebContentsView()->GetNativeView();
|
||||||
|
view.autoresizingMask = autoresizing_mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NativeBrowserViewMac::SetBounds(const gfx::Rect& bounds) {
|
||||||
|
auto* view = GetInspectableWebContentsView()->GetNativeView();
|
||||||
|
auto* superview = view.superview;
|
||||||
|
const auto superview_height = superview ? superview.frame.size.height : 0;
|
||||||
|
view.frame =
|
||||||
|
NSMakeRect(bounds.x(), superview_height - bounds.y() - bounds.height(),
|
||||||
|
bounds.width(), bounds.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
void NativeBrowserViewMac::SetBackgroundColor(SkColor color) {
|
||||||
|
auto* view = GetInspectableWebContentsView()->GetNativeView();
|
||||||
|
view.wantsLayer = YES;
|
||||||
|
view.layer.backgroundColor = skia::CGColorCreateFromSkColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
NativeBrowserView* NativeBrowserView::Create(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view) {
|
||||||
|
return new NativeBrowserViewMac(web_contents_view);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
36
atom/browser/native_browser_view_views.cc
Normal file
36
atom/browser/native_browser_view_views.cc
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view_views.h"
|
||||||
|
|
||||||
|
#include "brightray/browser/inspectable_web_contents_view.h"
|
||||||
|
#include "ui/gfx/geometry/rect.h"
|
||||||
|
#include "ui/views/background.h"
|
||||||
|
#include "ui/views/view.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
NativeBrowserViewViews::NativeBrowserViewViews(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view)
|
||||||
|
: NativeBrowserView(web_contents_view) {}
|
||||||
|
|
||||||
|
NativeBrowserViewViews::~NativeBrowserViewViews() {}
|
||||||
|
|
||||||
|
void NativeBrowserViewViews::SetBounds(const gfx::Rect& bounds) {
|
||||||
|
auto* view = GetInspectableWebContentsView()->GetView();
|
||||||
|
view->SetBoundsRect(bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NativeBrowserViewViews::SetBackgroundColor(SkColor color) {
|
||||||
|
auto* view = GetInspectableWebContentsView()->GetView();
|
||||||
|
view->set_background(views::Background::CreateSolidBackground(color));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
NativeBrowserView* NativeBrowserView::Create(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view) {
|
||||||
|
return new NativeBrowserViewViews(web_contents_view);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
33
atom/browser/native_browser_view_views.h
Normal file
33
atom/browser/native_browser_view_views.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright (c) 2017 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_NATIVE_BROWSER_VIEW_VIEWS_H_
|
||||||
|
#define ATOM_BROWSER_NATIVE_BROWSER_VIEW_VIEWS_H_
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
class NativeBrowserViewViews : public NativeBrowserView {
|
||||||
|
public:
|
||||||
|
explicit NativeBrowserViewViews(
|
||||||
|
brightray::InspectableWebContentsView* web_contents_view);
|
||||||
|
~NativeBrowserViewViews() override;
|
||||||
|
|
||||||
|
uint8_t GetAutoResizeFlags() { return auto_resize_flags_; }
|
||||||
|
void SetAutoResizeFlags(uint8_t flags) override {
|
||||||
|
auto_resize_flags_ = flags;
|
||||||
|
}
|
||||||
|
void SetBounds(const gfx::Rect& bounds) override;
|
||||||
|
void SetBackgroundColor(SkColor color) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t auto_resize_flags_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(NativeBrowserViewViews);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_NATIVE_BROWSER_VIEW_VIEWS_H_
|
|
@ -47,6 +47,8 @@ class Dictionary;
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
|
class NativeBrowserView;
|
||||||
|
|
||||||
struct DraggableRegion;
|
struct DraggableRegion;
|
||||||
|
|
||||||
class NativeWindow : public base::SupportsUserData,
|
class NativeWindow : public base::SupportsUserData,
|
||||||
|
@ -144,6 +146,7 @@ class NativeWindow : public base::SupportsUserData,
|
||||||
virtual void SetFocusable(bool focusable);
|
virtual void SetFocusable(bool focusable);
|
||||||
virtual void SetMenu(AtomMenuModel* menu);
|
virtual void SetMenu(AtomMenuModel* menu);
|
||||||
virtual void SetParentWindow(NativeWindow* parent);
|
virtual void SetParentWindow(NativeWindow* parent);
|
||||||
|
virtual void SetBrowserView(NativeBrowserView* browser_view) = 0;
|
||||||
virtual gfx::NativeWindow GetNativeWindow() = 0;
|
virtual gfx::NativeWindow GetNativeWindow() = 0;
|
||||||
virtual gfx::AcceleratedWidget GetAcceleratedWidget() = 0;
|
virtual gfx::AcceleratedWidget GetAcceleratedWidget() = 0;
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,7 @@ class NativeWindowMac : public NativeWindow,
|
||||||
bool IsDocumentEdited() override;
|
bool IsDocumentEdited() override;
|
||||||
void SetIgnoreMouseEvents(bool ignore) override;
|
void SetIgnoreMouseEvents(bool ignore) override;
|
||||||
void SetContentProtection(bool enable) override;
|
void SetContentProtection(bool enable) override;
|
||||||
|
void SetBrowserView(NativeBrowserView* browser_view) override;
|
||||||
void SetParentWindow(NativeWindow* parent) override;
|
void SetParentWindow(NativeWindow* parent) override;
|
||||||
gfx::NativeWindow GetNativeWindow() override;
|
gfx::NativeWindow GetNativeWindow() override;
|
||||||
gfx::AcceleratedWidget GetAcceleratedWidget() override;
|
gfx::AcceleratedWidget GetAcceleratedWidget() override;
|
||||||
|
@ -164,6 +165,8 @@ class NativeWindowMac : public NativeWindow,
|
||||||
// The view that will fill the whole frameless window.
|
// The view that will fill the whole frameless window.
|
||||||
base::scoped_nsobject<FullSizeContentView> content_view_;
|
base::scoped_nsobject<FullSizeContentView> content_view_;
|
||||||
|
|
||||||
|
NativeBrowserView* browser_view_;
|
||||||
|
|
||||||
std::vector<DraggableRegion> draggable_regions_;
|
std::vector<DraggableRegion> draggable_regions_;
|
||||||
|
|
||||||
bool is_kiosk_;
|
bool is_kiosk_;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <Quartz/Quartz.h>
|
#include <Quartz/Quartz.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view_mac.h"
|
||||||
#include "atom/browser/ui/cocoa/atom_touch_bar.h"
|
#include "atom/browser/ui/cocoa/atom_touch_bar.h"
|
||||||
#include "atom/browser/window_list.h"
|
#include "atom/browser/window_list.h"
|
||||||
#include "atom/common/color_util.h"
|
#include "atom/common/color_util.h"
|
||||||
|
@ -19,9 +20,9 @@
|
||||||
#include "brightray/browser/inspectable_web_contents_view.h"
|
#include "brightray/browser/inspectable_web_contents_view.h"
|
||||||
#include "brightray/browser/mac/event_dispatching_window.h"
|
#include "brightray/browser/mac/event_dispatching_window.h"
|
||||||
#include "content/public/browser/browser_accessibility_state.h"
|
#include "content/public/browser/browser_accessibility_state.h"
|
||||||
#include "content/public/browser/web_contents.h"
|
|
||||||
#include "content/public/browser/render_view_host.h"
|
#include "content/public/browser/render_view_host.h"
|
||||||
#include "content/public/browser/render_widget_host_view.h"
|
#include "content/public/browser/render_widget_host_view.h"
|
||||||
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "skia/ext/skia_utils_mac.h"
|
#include "skia/ext/skia_utils_mac.h"
|
||||||
#include "third_party/skia/include/core/SkRegion.h"
|
#include "third_party/skia/include/core/SkRegion.h"
|
||||||
|
@ -671,6 +672,7 @@ NativeWindowMac::NativeWindowMac(
|
||||||
const mate::Dictionary& options,
|
const mate::Dictionary& options,
|
||||||
NativeWindow* parent)
|
NativeWindow* parent)
|
||||||
: NativeWindow(web_contents, options, parent),
|
: NativeWindow(web_contents, options, parent),
|
||||||
|
browser_view_(nullptr),
|
||||||
is_kiosk_(false),
|
is_kiosk_(false),
|
||||||
was_fullscreen_(false),
|
was_fullscreen_(false),
|
||||||
zoom_to_page_width_(false),
|
zoom_to_page_width_(false),
|
||||||
|
@ -1269,6 +1271,26 @@ void NativeWindowMac::SetContentProtection(bool enable) {
|
||||||
: NSWindowSharingReadOnly];
|
: NSWindowSharingReadOnly];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowMac::SetBrowserView(NativeBrowserView* browser_view) {
|
||||||
|
if (browser_view_) {
|
||||||
|
[browser_view_->GetInspectableWebContentsView()->GetNativeView()
|
||||||
|
removeFromSuperview];
|
||||||
|
browser_view_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!browser_view) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
browser_view_ = browser_view;
|
||||||
|
auto* native_view =
|
||||||
|
browser_view->GetInspectableWebContentsView()->GetNativeView();
|
||||||
|
[[window_ contentView] addSubview:native_view
|
||||||
|
positioned:NSWindowAbove
|
||||||
|
relativeTo:nil];
|
||||||
|
native_view.hidden = NO;
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowMac::SetParentWindow(NativeWindow* parent) {
|
void NativeWindowMac::SetParentWindow(NativeWindow* parent) {
|
||||||
if (is_modal())
|
if (is_modal())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "atom/browser/native_browser_view_views.h"
|
||||||
#include "atom/browser/ui/views/menu_bar.h"
|
#include "atom/browser/ui/views/menu_bar.h"
|
||||||
#include "atom/browser/ui/views/menu_layout.h"
|
|
||||||
#include "atom/browser/window_list.h"
|
#include "atom/browser/window_list.h"
|
||||||
#include "atom/common/color_util.h"
|
#include "atom/common/color_util.h"
|
||||||
#include "atom/common/draggable_region.h"
|
#include "atom/common/draggable_region.h"
|
||||||
|
@ -70,6 +70,20 @@ const int kMenuBarHeight = 25;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
|
gfx::Rect SubtractBorderSize(gfx::Rect bounds) {
|
||||||
|
gfx::Point borderSize = gfx::Point(
|
||||||
|
GetSystemMetrics(SM_CXSIZEFRAME) - 1, // width
|
||||||
|
GetSystemMetrics(SM_CYSIZEFRAME) - 1); // height
|
||||||
|
gfx::Point dpiAdjustedSize =
|
||||||
|
display::win::ScreenWin::ScreenToDIPPoint(borderSize);
|
||||||
|
|
||||||
|
bounds.set_x(bounds.x() + dpiAdjustedSize.x());
|
||||||
|
bounds.set_y(bounds.y() + dpiAdjustedSize.y());
|
||||||
|
bounds.set_width(bounds.width() - 2 * dpiAdjustedSize.x());
|
||||||
|
bounds.set_height(bounds.height() - 2 * dpiAdjustedSize.y());
|
||||||
|
return bounds;
|
||||||
|
}
|
||||||
|
|
||||||
void FlipWindowStyle(HWND handle, bool on, DWORD flag) {
|
void FlipWindowStyle(HWND handle, bool on, DWORD flag) {
|
||||||
DWORD style = ::GetWindowLong(handle, GWL_STYLE);
|
DWORD style = ::GetWindowLong(handle, GWL_STYLE);
|
||||||
if (on)
|
if (on)
|
||||||
|
@ -135,6 +149,7 @@ NativeWindowViews::NativeWindowViews(
|
||||||
: NativeWindow(web_contents, options, parent),
|
: NativeWindow(web_contents, options, parent),
|
||||||
window_(new views::Widget),
|
window_(new views::Widget),
|
||||||
web_view_(inspectable_web_contents()->GetView()->GetView()),
|
web_view_(inspectable_web_contents()->GetView()->GetView()),
|
||||||
|
browser_view_(nullptr),
|
||||||
menu_bar_autohide_(false),
|
menu_bar_autohide_(false),
|
||||||
menu_bar_visible_(false),
|
menu_bar_visible_(false),
|
||||||
menu_bar_alt_pressed_(false),
|
menu_bar_alt_pressed_(false),
|
||||||
|
@ -274,9 +289,6 @@ NativeWindowViews::NativeWindowViews(
|
||||||
SetWindowType(GetAcceleratedWidget(), window_type);
|
SetWindowType(GetAcceleratedWidget(), window_type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Add web view.
|
|
||||||
SetLayoutManager(new MenuLayout(this, kMenuBarHeight));
|
|
||||||
|
|
||||||
AddChildView(web_view_);
|
AddChildView(web_view_);
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
|
@ -881,6 +893,24 @@ void NativeWindowViews::SetMenu(AtomMenuModel* menu_model) {
|
||||||
Layout();
|
Layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowViews::SetBrowserView(NativeBrowserView* browser_view) {
|
||||||
|
if (browser_view_) {
|
||||||
|
web_view_->RemoveChildView(
|
||||||
|
browser_view_->GetInspectableWebContentsView()->GetView());
|
||||||
|
browser_view_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!browser_view) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add as child of the main web view to avoid (0, 0) origin from overlapping
|
||||||
|
// with menu bar.
|
||||||
|
browser_view_ = browser_view;
|
||||||
|
web_view_->AddChildView(
|
||||||
|
browser_view->GetInspectableWebContentsView()->GetView());
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowViews::SetParentWindow(NativeWindow* parent) {
|
void NativeWindowViews::SetParentWindow(NativeWindow* parent) {
|
||||||
NativeWindow::SetParentWindow(parent);
|
NativeWindow::SetParentWindow(parent);
|
||||||
|
|
||||||
|
@ -1248,6 +1278,52 @@ void NativeWindowViews::HandleKeyboardEvent(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowViews::Layout() {
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
// Reserve border space for maximized frameless window so we won't have the
|
||||||
|
// content go outside of screen.
|
||||||
|
if (!has_frame() && IsMaximized()) {
|
||||||
|
gfx::Rect bounds = SubtractBorderSize(GetContentsBounds());
|
||||||
|
web_view_->SetBoundsRect(bounds);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const auto size = GetContentsBounds().size();
|
||||||
|
const auto menu_bar_bounds =
|
||||||
|
menu_bar_ ? gfx::Rect(0, 0, size.width(), kMenuBarHeight) : gfx::Rect();
|
||||||
|
if (menu_bar_) {
|
||||||
|
menu_bar_->SetBoundsRect(menu_bar_bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto old_web_view_size = web_view_ ? web_view_->size() : gfx::Size();
|
||||||
|
if (web_view_) {
|
||||||
|
web_view_->SetBoundsRect(
|
||||||
|
gfx::Rect(0, menu_bar_bounds.height(), size.width(),
|
||||||
|
size.height() - menu_bar_bounds.height()));
|
||||||
|
}
|
||||||
|
const auto new_web_view_size = web_view_ ? web_view_->size() : gfx::Size();
|
||||||
|
|
||||||
|
if (browser_view_) {
|
||||||
|
const auto flags = static_cast<NativeBrowserViewViews*>(browser_view_)
|
||||||
|
->GetAutoResizeFlags();
|
||||||
|
int width_delta = 0;
|
||||||
|
int height_delta = 0;
|
||||||
|
if (flags & kAutoResizeWidth) {
|
||||||
|
width_delta = new_web_view_size.width() - old_web_view_size.width();
|
||||||
|
}
|
||||||
|
if (flags & kAutoResizeHeight) {
|
||||||
|
height_delta = new_web_view_size.height() - old_web_view_size.height();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* view = browser_view_->GetInspectableWebContentsView()->GetView();
|
||||||
|
auto new_view_size = view->size();
|
||||||
|
new_view_size.set_width(new_view_size.width() + width_delta);
|
||||||
|
new_view_size.set_height(new_view_size.height() + height_delta);
|
||||||
|
view->SetSize(new_view_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gfx::Size NativeWindowViews::GetMinimumSize() {
|
gfx::Size NativeWindowViews::GetMinimumSize() {
|
||||||
return NativeWindow::GetMinimumSize();
|
return NativeWindow::GetMinimumSize();
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,6 +104,7 @@ class NativeWindowViews : public NativeWindow,
|
||||||
void SetContentProtection(bool enable) override;
|
void SetContentProtection(bool enable) override;
|
||||||
void SetFocusable(bool focusable) override;
|
void SetFocusable(bool focusable) override;
|
||||||
void SetMenu(AtomMenuModel* menu_model) override;
|
void SetMenu(AtomMenuModel* menu_model) override;
|
||||||
|
void SetBrowserView(NativeBrowserView* browser_view) override;
|
||||||
void SetParentWindow(NativeWindow* parent) override;
|
void SetParentWindow(NativeWindow* parent) override;
|
||||||
gfx::NativeWindow GetNativeWindow() override;
|
gfx::NativeWindow GetNativeWindow() override;
|
||||||
void SetOverlayIcon(const gfx::Image& overlay,
|
void SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
@ -176,6 +177,7 @@ class NativeWindowViews : public NativeWindow,
|
||||||
const content::NativeWebKeyboardEvent& event) override;
|
const content::NativeWebKeyboardEvent& event) override;
|
||||||
|
|
||||||
// views::View:
|
// views::View:
|
||||||
|
void Layout() override;
|
||||||
gfx::Size GetMinimumSize() override;
|
gfx::Size GetMinimumSize() override;
|
||||||
gfx::Size GetMaximumSize() override;
|
gfx::Size GetMaximumSize() override;
|
||||||
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
|
bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
|
||||||
|
@ -189,6 +191,8 @@ class NativeWindowViews : public NativeWindow,
|
||||||
std::unique_ptr<views::Widget> window_;
|
std::unique_ptr<views::Widget> window_;
|
||||||
views::View* web_view_; // Managed by inspectable_web_contents_.
|
views::View* web_view_; // Managed by inspectable_web_contents_.
|
||||||
|
|
||||||
|
NativeBrowserView* browser_view_;
|
||||||
|
|
||||||
std::unique_ptr<MenuBar> menu_bar_;
|
std::unique_ptr<MenuBar> menu_bar_;
|
||||||
bool menu_bar_autohide_;
|
bool menu_bar_autohide_;
|
||||||
bool menu_bar_visible_;
|
bool menu_bar_visible_;
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
// Copyright (c) 2014 GitHub, Inc.
|
|
||||||
// Use of this source code is governed by the MIT license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "atom/browser/ui/views/menu_layout.h"
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
#include "atom/browser/native_window_views.h"
|
|
||||||
#include "ui/display/win/screen_win.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace atom {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
gfx::Rect SubtractBorderSize(gfx::Rect bounds) {
|
|
||||||
gfx::Point borderSize = gfx::Point(
|
|
||||||
GetSystemMetrics(SM_CXSIZEFRAME) - 1, // width
|
|
||||||
GetSystemMetrics(SM_CYSIZEFRAME) - 1); // height
|
|
||||||
gfx::Point dpiAdjustedSize =
|
|
||||||
display::win::ScreenWin::ScreenToDIPPoint(borderSize);
|
|
||||||
|
|
||||||
bounds.set_x(bounds.x() + dpiAdjustedSize.x());
|
|
||||||
bounds.set_y(bounds.y() + dpiAdjustedSize.y());
|
|
||||||
bounds.set_width(bounds.width() - 2 * dpiAdjustedSize.x());
|
|
||||||
bounds.set_height(bounds.height() - 2 * dpiAdjustedSize.y());
|
|
||||||
return bounds;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
MenuLayout::MenuLayout(NativeWindowViews* window, int menu_height)
|
|
||||||
: window_(window),
|
|
||||||
menu_height_(menu_height) {
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuLayout::~MenuLayout() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void MenuLayout::Layout(views::View* host) {
|
|
||||||
#if defined(OS_WIN)
|
|
||||||
// Reserve border space for maximized frameless window so we won't have the
|
|
||||||
// content go outside of screen.
|
|
||||||
if (!window_->has_frame() && window_->IsMaximized()) {
|
|
||||||
gfx::Rect bounds = SubtractBorderSize(host->GetContentsBounds());
|
|
||||||
host->child_at(0)->SetBoundsRect(bounds);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!HasMenu(host)) {
|
|
||||||
views::FillLayout::Layout(host);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::Size size = host->GetContentsBounds().size();
|
|
||||||
gfx::Rect menu_Bar_bounds = gfx::Rect(0, 0, size.width(), menu_height_);
|
|
||||||
gfx::Rect web_view_bounds = gfx::Rect(
|
|
||||||
0, menu_height_, size.width(), size.height() - menu_height_);
|
|
||||||
|
|
||||||
views::View* web_view = host->child_at(0);
|
|
||||||
views::View* menu_bar = host->child_at(1);
|
|
||||||
web_view->SetBoundsRect(web_view_bounds);
|
|
||||||
menu_bar->SetBoundsRect(menu_Bar_bounds);
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::Size MenuLayout::GetPreferredSize(const views::View* host) const {
|
|
||||||
gfx::Size size = views::FillLayout::GetPreferredSize(host);
|
|
||||||
if (!HasMenu(host))
|
|
||||||
return size;
|
|
||||||
|
|
||||||
size.set_height(size.height() + menu_height_);
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int MenuLayout::GetPreferredHeightForWidth(
|
|
||||||
const views::View* host, int width) const {
|
|
||||||
int height = views::FillLayout::GetPreferredHeightForWidth(host, width);
|
|
||||||
if (!HasMenu(host))
|
|
||||||
return height;
|
|
||||||
|
|
||||||
return height + menu_height_;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MenuLayout::HasMenu(const views::View* host) const {
|
|
||||||
return host->child_count() == 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace atom
|
|
|
@ -1,36 +0,0 @@
|
||||||
// Copyright (c) 2014 GitHub, Inc.
|
|
||||||
// Use of this source code is governed by the MIT license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef ATOM_BROWSER_UI_VIEWS_MENU_LAYOUT_H_
|
|
||||||
#define ATOM_BROWSER_UI_VIEWS_MENU_LAYOUT_H_
|
|
||||||
|
|
||||||
#include "ui/views/layout/fill_layout.h"
|
|
||||||
|
|
||||||
namespace atom {
|
|
||||||
|
|
||||||
class NativeWindowViews;
|
|
||||||
|
|
||||||
class MenuLayout : public views::FillLayout {
|
|
||||||
public:
|
|
||||||
MenuLayout(NativeWindowViews* window, int menu_height);
|
|
||||||
virtual ~MenuLayout();
|
|
||||||
|
|
||||||
// views::LayoutManager:
|
|
||||||
void Layout(views::View* host) override;
|
|
||||||
gfx::Size GetPreferredSize(const views::View* host) const override;
|
|
||||||
int GetPreferredHeightForWidth(
|
|
||||||
const views::View* host, int width) const override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool HasMenu(const views::View* host) const;
|
|
||||||
|
|
||||||
NativeWindowViews* window_;
|
|
||||||
int menu_height_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(MenuLayout);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace atom
|
|
||||||
|
|
||||||
#endif // ATOM_BROWSER_UI_VIEWS_MENU_LAYOUT_H_
|
|
|
@ -33,17 +33,18 @@
|
||||||
// Electron's builtin modules.
|
// Electron's builtin modules.
|
||||||
REFERENCE_MODULE(atom_browser_app);
|
REFERENCE_MODULE(atom_browser_app);
|
||||||
REFERENCE_MODULE(atom_browser_auto_updater);
|
REFERENCE_MODULE(atom_browser_auto_updater);
|
||||||
|
REFERENCE_MODULE(atom_browser_browser_view);
|
||||||
REFERENCE_MODULE(atom_browser_content_tracing);
|
REFERENCE_MODULE(atom_browser_content_tracing);
|
||||||
REFERENCE_MODULE(atom_browser_dialog);
|
|
||||||
REFERENCE_MODULE(atom_browser_debugger);
|
REFERENCE_MODULE(atom_browser_debugger);
|
||||||
REFERENCE_MODULE(atom_browser_desktop_capturer);
|
REFERENCE_MODULE(atom_browser_desktop_capturer);
|
||||||
|
REFERENCE_MODULE(atom_browser_dialog);
|
||||||
REFERENCE_MODULE(atom_browser_download_item);
|
REFERENCE_MODULE(atom_browser_download_item);
|
||||||
|
REFERENCE_MODULE(atom_browser_global_shortcut);
|
||||||
REFERENCE_MODULE(atom_browser_menu);
|
REFERENCE_MODULE(atom_browser_menu);
|
||||||
REFERENCE_MODULE(atom_browser_net);
|
REFERENCE_MODULE(atom_browser_net);
|
||||||
REFERENCE_MODULE(atom_browser_power_monitor);
|
REFERENCE_MODULE(atom_browser_power_monitor);
|
||||||
REFERENCE_MODULE(atom_browser_power_save_blocker);
|
REFERENCE_MODULE(atom_browser_power_save_blocker);
|
||||||
REFERENCE_MODULE(atom_browser_protocol);
|
REFERENCE_MODULE(atom_browser_protocol);
|
||||||
REFERENCE_MODULE(atom_browser_global_shortcut);
|
|
||||||
REFERENCE_MODULE(atom_browser_render_process_preferences);
|
REFERENCE_MODULE(atom_browser_render_process_preferences);
|
||||||
REFERENCE_MODULE(atom_browser_session);
|
REFERENCE_MODULE(atom_browser_session);
|
||||||
REFERENCE_MODULE(atom_browser_system_preferences);
|
REFERENCE_MODULE(atom_browser_system_preferences);
|
||||||
|
|
74
docs/api/browser-view.md
Normal file
74
docs/api/browser-view.md
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
## Class: BrowserView
|
||||||
|
|
||||||
|
> Create and control views.
|
||||||
|
|
||||||
|
**Note:** The BrowserView API is currently experimental and may change or be
|
||||||
|
removed in future Electron releases.
|
||||||
|
|
||||||
|
Process: [Main](../glossary.md#main-process)
|
||||||
|
|
||||||
|
A `BrowserView` can be used to embed additional web content into a
|
||||||
|
`BrowserWindow`. It is like a child window, except that it is positioned
|
||||||
|
relative to its owning window. It is meant to be an alternative to the
|
||||||
|
`webview` tag.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// In the main process.
|
||||||
|
const {BrowserView, BrowserWindow} = require('electron')
|
||||||
|
|
||||||
|
let win = new BrowserWindow({width: 800, height: 600})
|
||||||
|
win.on('closed', () => {
|
||||||
|
win = null
|
||||||
|
})
|
||||||
|
|
||||||
|
let view = new BrowserView({
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
win.addChildView(view)
|
||||||
|
view.setBounds(0, 0, 300, 300)
|
||||||
|
view.webContents.loadURL('https://electron.atom.io')
|
||||||
|
```
|
||||||
|
|
||||||
|
### `new BrowserView([options])` _Experimental_
|
||||||
|
|
||||||
|
* `options` Object (optional)
|
||||||
|
* `webPreferences` Object (optional) - See [BrowserWindow](browser-window.md).
|
||||||
|
|
||||||
|
### Instance Properties
|
||||||
|
|
||||||
|
Objects created with `new BrowserView` have the following properties:
|
||||||
|
|
||||||
|
#### `view.webContents` _Experimental_
|
||||||
|
|
||||||
|
A [`webContents`](web-contents.md) object owned by this view.
|
||||||
|
|
||||||
|
#### `win.id` _Experimental_
|
||||||
|
|
||||||
|
A `Integer` representing the unique ID of the view.
|
||||||
|
|
||||||
|
### Instance Methods
|
||||||
|
|
||||||
|
Objects created with `new BrowserWindow` have the following instance methods:
|
||||||
|
|
||||||
|
#### `win.setAutoResize(options)` _Experimental_
|
||||||
|
|
||||||
|
* `options` Object
|
||||||
|
* `width`: If `true`, the view's width will grow and shrink together with
|
||||||
|
the window. `false` by default.
|
||||||
|
* `height`: If `true`, the view's height will grow and shrink together with
|
||||||
|
the window. `false` by default.
|
||||||
|
|
||||||
|
#### `win.setBounds(bounds)` _Experimental_
|
||||||
|
|
||||||
|
* `bounds` [Rectangle](structures/rectangle.md)
|
||||||
|
|
||||||
|
Resizes and moves the view to the supplied bounds relative to the window.
|
||||||
|
|
||||||
|
#### `win.setBackgroundColor(color)` _Experimental_
|
||||||
|
|
||||||
|
* `color` String - Color in `#aarrggbb` or `#argb` form. The alpha channel is
|
||||||
|
optional.
|
|
@ -1289,6 +1289,13 @@ machine has a touch bar and is running on macOS 10.12.1+.
|
||||||
**Note:** The TouchBar API is currently experimental and may change or be
|
**Note:** The TouchBar API is currently experimental and may change or be
|
||||||
removed in future Electron releases.
|
removed in future Electron releases.
|
||||||
|
|
||||||
|
#### `win.setBrowserView(browserView)` _Experimental_
|
||||||
|
|
||||||
|
* `browserView` [BrowserView](browser-view.md)
|
||||||
|
|
||||||
|
**Note:** The BrowserView API is currently experimental and may change or be
|
||||||
|
removed in future Electron releases.
|
||||||
|
|
||||||
[blink-feature-string]: https://cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5?l=62
|
[blink-feature-string]: https://cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5?l=62
|
||||||
[quick-look]: https://en.wikipedia.org/wiki/Quick_Look
|
[quick-look]: https://en.wikipedia.org/wiki/Quick_Look
|
||||||
[vibrancy-docs]: https://developer.apple.com/reference/appkit/nsvisualeffectview?language=objc
|
[vibrancy-docs]: https://developer.apple.com/reference/appkit/nsvisualeffectview?language=objc
|
||||||
|
|
|
@ -13,23 +13,24 @@
|
||||||
'lib/browser/api/auto-updater/auto-updater-native.js',
|
'lib/browser/api/auto-updater/auto-updater-native.js',
|
||||||
'lib/browser/api/auto-updater/auto-updater-win.js',
|
'lib/browser/api/auto-updater/auto-updater-win.js',
|
||||||
'lib/browser/api/auto-updater/squirrel-update-win.js',
|
'lib/browser/api/auto-updater/squirrel-update-win.js',
|
||||||
|
'lib/browser/api/browser-view.js',
|
||||||
'lib/browser/api/browser-window.js',
|
'lib/browser/api/browser-window.js',
|
||||||
'lib/browser/api/content-tracing.js',
|
'lib/browser/api/content-tracing.js',
|
||||||
'lib/browser/api/dialog.js',
|
'lib/browser/api/dialog.js',
|
||||||
'lib/browser/api/exports/electron.js',
|
'lib/browser/api/exports/electron.js',
|
||||||
'lib/browser/api/global-shortcut.js',
|
'lib/browser/api/global-shortcut.js',
|
||||||
'lib/browser/api/ipc-main.js',
|
'lib/browser/api/ipc-main.js',
|
||||||
'lib/browser/api/menu.js',
|
|
||||||
'lib/browser/api/menu-item.js',
|
|
||||||
'lib/browser/api/menu-item-roles.js',
|
'lib/browser/api/menu-item-roles.js',
|
||||||
|
'lib/browser/api/menu-item.js',
|
||||||
|
'lib/browser/api/menu.js',
|
||||||
'lib/browser/api/module-list.js',
|
'lib/browser/api/module-list.js',
|
||||||
'lib/browser/api/navigation-controller.js',
|
'lib/browser/api/navigation-controller.js',
|
||||||
'lib/browser/api/net.js',
|
'lib/browser/api/net.js',
|
||||||
'lib/browser/api/power-monitor.js',
|
'lib/browser/api/power-monitor.js',
|
||||||
'lib/browser/api/power-save-blocker.js',
|
'lib/browser/api/power-save-blocker.js',
|
||||||
'lib/browser/api/protocol.js',
|
'lib/browser/api/protocol.js',
|
||||||
'lib/browser/api/session.js',
|
|
||||||
'lib/browser/api/screen.js',
|
'lib/browser/api/screen.js',
|
||||||
|
'lib/browser/api/session.js',
|
||||||
'lib/browser/api/system-preferences.js',
|
'lib/browser/api/system-preferences.js',
|
||||||
'lib/browser/api/touch-bar.js',
|
'lib/browser/api/touch-bar.js',
|
||||||
'lib/browser/api/tray.js',
|
'lib/browser/api/tray.js',
|
||||||
|
@ -103,6 +104,8 @@
|
||||||
'atom/browser/api/atom_api_app.h',
|
'atom/browser/api/atom_api_app.h',
|
||||||
'atom/browser/api/atom_api_auto_updater.cc',
|
'atom/browser/api/atom_api_auto_updater.cc',
|
||||||
'atom/browser/api/atom_api_auto_updater.h',
|
'atom/browser/api/atom_api_auto_updater.h',
|
||||||
|
'atom/browser/api/atom_api_browser_view.cc',
|
||||||
|
'atom/browser/api/atom_api_browser_view.h',
|
||||||
'atom/browser/api/atom_api_content_tracing.cc',
|
'atom/browser/api/atom_api_content_tracing.cc',
|
||||||
'atom/browser/api/atom_api_cookies.cc',
|
'atom/browser/api/atom_api_cookies.cc',
|
||||||
'atom/browser/api/atom_api_cookies.h',
|
'atom/browser/api/atom_api_cookies.h',
|
||||||
|
@ -110,27 +113,27 @@
|
||||||
'atom/browser/api/atom_api_debugger.h',
|
'atom/browser/api/atom_api_debugger.h',
|
||||||
'atom/browser/api/atom_api_desktop_capturer.cc',
|
'atom/browser/api/atom_api_desktop_capturer.cc',
|
||||||
'atom/browser/api/atom_api_desktop_capturer.h',
|
'atom/browser/api/atom_api_desktop_capturer.h',
|
||||||
|
'atom/browser/api/atom_api_dialog.cc',
|
||||||
'atom/browser/api/atom_api_download_item.cc',
|
'atom/browser/api/atom_api_download_item.cc',
|
||||||
'atom/browser/api/atom_api_download_item.h',
|
'atom/browser/api/atom_api_download_item.h',
|
||||||
'atom/browser/api/atom_api_dialog.cc',
|
|
||||||
'atom/browser/api/atom_api_global_shortcut.cc',
|
'atom/browser/api/atom_api_global_shortcut.cc',
|
||||||
'atom/browser/api/atom_api_global_shortcut.h',
|
'atom/browser/api/atom_api_global_shortcut.h',
|
||||||
'atom/browser/api/atom_api_menu.cc',
|
'atom/browser/api/atom_api_menu.cc',
|
||||||
'atom/browser/api/atom_api_menu.h',
|
'atom/browser/api/atom_api_menu.h',
|
||||||
'atom/browser/api/atom_api_menu_views.cc',
|
|
||||||
'atom/browser/api/atom_api_menu_views.h',
|
|
||||||
'atom/browser/api/atom_api_menu_mac.h',
|
'atom/browser/api/atom_api_menu_mac.h',
|
||||||
'atom/browser/api/atom_api_menu_mac.mm',
|
'atom/browser/api/atom_api_menu_mac.mm',
|
||||||
|
'atom/browser/api/atom_api_menu_views.cc',
|
||||||
|
'atom/browser/api/atom_api_menu_views.h',
|
||||||
'atom/browser/api/atom_api_net.cc',
|
'atom/browser/api/atom_api_net.cc',
|
||||||
'atom/browser/api/atom_api_net.h',
|
'atom/browser/api/atom_api_net.h',
|
||||||
'atom/browser/api/atom_api_power_monitor.cc',
|
'atom/browser/api/atom_api_power_monitor.cc',
|
||||||
'atom/browser/api/atom_api_power_monitor.h',
|
'atom/browser/api/atom_api_power_monitor.h',
|
||||||
'atom/browser/api/atom_api_power_save_blocker.cc',
|
'atom/browser/api/atom_api_power_save_blocker.cc',
|
||||||
'atom/browser/api/atom_api_power_save_blocker.h',
|
'atom/browser/api/atom_api_power_save_blocker.h',
|
||||||
'atom/browser/api/atom_api_render_process_preferences.cc',
|
|
||||||
'atom/browser/api/atom_api_render_process_preferences.h',
|
|
||||||
'atom/browser/api/atom_api_protocol.cc',
|
'atom/browser/api/atom_api_protocol.cc',
|
||||||
'atom/browser/api/atom_api_protocol.h',
|
'atom/browser/api/atom_api_protocol.h',
|
||||||
|
'atom/browser/api/atom_api_render_process_preferences.cc',
|
||||||
|
'atom/browser/api/atom_api_render_process_preferences.h',
|
||||||
'atom/browser/api/atom_api_screen.cc',
|
'atom/browser/api/atom_api_screen.cc',
|
||||||
'atom/browser/api/atom_api_screen.h',
|
'atom/browser/api/atom_api_screen.h',
|
||||||
'atom/browser/api/atom_api_session.cc',
|
'atom/browser/api/atom_api_session.cc',
|
||||||
|
@ -216,6 +219,12 @@
|
||||||
'atom/browser/mac/atom_application_delegate.mm',
|
'atom/browser/mac/atom_application_delegate.mm',
|
||||||
'atom/browser/mac/dict_util.h',
|
'atom/browser/mac/dict_util.h',
|
||||||
'atom/browser/mac/dict_util.mm',
|
'atom/browser/mac/dict_util.mm',
|
||||||
|
'atom/browser/native_browser_view.cc',
|
||||||
|
'atom/browser/native_browser_view.h',
|
||||||
|
'atom/browser/native_browser_view_mac.h',
|
||||||
|
'atom/browser/native_browser_view_mac.mm',
|
||||||
|
'atom/browser/native_browser_view_views.h',
|
||||||
|
'atom/browser/native_browser_view_views.cc',
|
||||||
'atom/browser/native_window.cc',
|
'atom/browser/native_window.cc',
|
||||||
'atom/browser/native_window.h',
|
'atom/browser/native_window.h',
|
||||||
'atom/browser/native_window_views_win.cc',
|
'atom/browser/native_window_views_win.cc',
|
||||||
|
@ -313,8 +322,6 @@
|
||||||
'atom/browser/ui/views/menu_bar.h',
|
'atom/browser/ui/views/menu_bar.h',
|
||||||
'atom/browser/ui/views/menu_delegate.cc',
|
'atom/browser/ui/views/menu_delegate.cc',
|
||||||
'atom/browser/ui/views/menu_delegate.h',
|
'atom/browser/ui/views/menu_delegate.h',
|
||||||
'atom/browser/ui/views/menu_layout.cc',
|
|
||||||
'atom/browser/ui/views/menu_layout.h',
|
|
||||||
'atom/browser/ui/views/menu_model_adapter.cc',
|
'atom/browser/ui/views/menu_model_adapter.cc',
|
||||||
'atom/browser/ui/views/menu_model_adapter.h',
|
'atom/browser/ui/views/menu_model_adapter.h',
|
||||||
'atom/browser/ui/views/native_frame_view.cc',
|
'atom/browser/ui/views/native_frame_view.cc',
|
||||||
|
|
8
lib/browser/api/browser-view.js
Normal file
8
lib/browser/api/browser-view.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const {EventEmitter} = require('events')
|
||||||
|
const {BrowserView} = process.atomBinding('browser_view')
|
||||||
|
|
||||||
|
Object.setPrototypeOf(BrowserView.prototype, EventEmitter.prototype)
|
||||||
|
|
||||||
|
module.exports = BrowserView
|
|
@ -2,6 +2,7 @@
|
||||||
module.exports = [
|
module.exports = [
|
||||||
{name: 'app', file: 'app'},
|
{name: 'app', file: 'app'},
|
||||||
{name: 'autoUpdater', file: 'auto-updater'},
|
{name: 'autoUpdater', file: 'auto-updater'},
|
||||||
|
{name: 'BrowserView', file: 'browser-view'},
|
||||||
{name: 'BrowserWindow', file: 'browser-window'},
|
{name: 'BrowserWindow', file: 'browser-window'},
|
||||||
{name: 'contentTracing', file: 'content-tracing'},
|
{name: 'contentTracing', file: 'content-tracing'},
|
||||||
{name: 'dialog', file: 'dialog'},
|
{name: 'dialog', file: 'dialog'},
|
||||||
|
|
92
spec/api-browser-view-spec.js
Normal file
92
spec/api-browser-view-spec.js
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const assert = require('assert')
|
||||||
|
const {closeWindow} = require('./window-helpers')
|
||||||
|
|
||||||
|
const {remote} = require('electron')
|
||||||
|
const {BrowserView, BrowserWindow} = remote
|
||||||
|
|
||||||
|
describe('View module', function () {
|
||||||
|
var w = null
|
||||||
|
var view = null
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
w = new BrowserWindow({
|
||||||
|
show: false,
|
||||||
|
width: 400,
|
||||||
|
height: 400,
|
||||||
|
webPreferences: {
|
||||||
|
backgroundThrottling: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
if (view) {
|
||||||
|
view.destroy()
|
||||||
|
view = null
|
||||||
|
}
|
||||||
|
|
||||||
|
return closeWindow(w).then(function () { w = null })
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('BrowserView.setBackgroundColor()', function () {
|
||||||
|
it('does not throw for valid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
view.setBackgroundColor('#000')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws for invalid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
assert.throws(function () {
|
||||||
|
view.setBackgroundColor(null)
|
||||||
|
}, /conversion failure/)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('BrowserView.setAutoResize()', function () {
|
||||||
|
it('does not throw for valid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
view.setAutoResize({})
|
||||||
|
view.setAutoResize({ width: true, height: false })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws for invalid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
assert.throws(function () {
|
||||||
|
view.setAutoResize(null)
|
||||||
|
}, /conversion failure/)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('BrowserView.setBounds()', function () {
|
||||||
|
it('does not throw for valid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
view.setBounds({ x: 0, y: 0, width: 1, height: 1 })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws for invalid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
assert.throws(function () {
|
||||||
|
view.setBounds(null)
|
||||||
|
}, /conversion failure/)
|
||||||
|
assert.throws(function () {
|
||||||
|
view.setBounds({})
|
||||||
|
}, /conversion failure/)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('BrowserWindow.setBrowserView()', function () {
|
||||||
|
it('does not throw for valid args', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
w.setBrowserView(view)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('does not throw if called multiple times with same view', function () {
|
||||||
|
view = new BrowserView()
|
||||||
|
w.setBrowserView(view)
|
||||||
|
w.setBrowserView(view)
|
||||||
|
w.setBrowserView(view)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in a new issue