electron/atom/browser/api/atom_api_browser_window.h

303 lines
9.5 KiB
C
Raw Normal View History

// Copyright (c) 2013 GitHub, Inc.
2014-04-25 09:49:37 +00:00
// 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_WINDOW_H_
#define ATOM_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_
#include <map>
2016-06-17 07:57:03 +00:00
#include <memory>
#include <string>
2013-11-22 06:23:19 +00:00
#include <vector>
2018-02-22 06:57:03 +00:00
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/native_window.h"
2014-03-16 00:30:26 +00:00
#include "atom/browser/native_window_observer.h"
2016-05-20 13:22:15 +00:00
#include "atom/common/api/atom_api_native_image.h"
2016-06-17 07:57:03 +00:00
#include "atom/common/key_weak_map.h"
#include "base/memory/weak_ptr.h"
#include "native_mate/persistent_dictionary.h"
class GURL;
namespace gfx {
class Rect;
}
namespace mate {
class Arguments;
class Dictionary;
}
namespace atom {
class NativeWindow;
namespace api {
class BrowserWindow : public mate::TrackableObject<BrowserWindow>,
public content::WebContentsObserver,
2018-02-22 06:57:03 +00:00
public ExtendedWebContentsObserver,
public NativeWindowObserver {
public:
static mate::WrappableBase* New(mate::Arguments* args);
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype);
2015-10-01 05:45:59 +00:00
// Returns the BrowserWindow object from |native_window|.
static v8::Local<v8::Value> From(v8::Isolate* isolate,
NativeWindow* native_window);
NativeWindow* window() const { return window_.get(); }
2017-02-16 18:58:02 +00:00
int32_t ID() const;
protected:
BrowserWindow(v8::Isolate* isolate,
v8::Local<v8::Object> wrapper,
const mate::Dictionary& options);
~BrowserWindow() override;
// content::WebContentsObserver:
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
void DidFirstVisuallyNonEmptyPaint() override;
bool OnMessageReceived(const IPC::Message& message,
content::RenderFrameHost* rfh) override;
2018-02-22 06:57:03 +00:00
// ExtendedWebContentsObserver:
void OnRendererResponsive() override;
2014-11-25 04:43:25 +00:00
// NativeWindowObserver:
void WillCloseWindow(bool* prevent_default) override;
void WillDestroyNativeObject() override;
void OnWindowClosed() override;
void OnWindowEndSession() override;
void OnWindowBlur() override;
void OnWindowFocus() override;
void OnWindowShow() override;
void OnWindowHide() override;
2014-11-25 04:43:25 +00:00
void OnWindowMaximize() override;
void OnWindowUnmaximize() override;
void OnWindowMinimize() override;
void OnWindowRestore() override;
2015-05-09 15:55:10 +00:00
void OnWindowResize() override;
void OnWindowMove() override;
2015-05-20 08:37:13 +00:00
void OnWindowMoved() override;
2016-01-22 00:31:09 +00:00
void OnWindowScrollTouchBegin() override;
void OnWindowScrollTouchEnd() override;
void OnWindowScrollTouchEdge() override;
void OnWindowSwipe(const std::string& direction) override;
void OnWindowSheetBegin() override;
void OnWindowSheetEnd() override;
2014-11-25 04:43:25 +00:00
void OnWindowEnterFullScreen() override;
void OnWindowLeaveFullScreen() override;
void OnWindowEnterHtmlFullScreen() override;
void OnWindowLeaveHtmlFullScreen() override;
void OnWindowUnresponsive() override;
void OnWindowResponsive() override;
2015-06-25 21:09:25 +00:00
void OnExecuteWindowsCommand(const std::string& command_name) override;
void OnTouchBarItemResult(const std::string& item_id,
const base::DictionaryValue& details) override;
void OnNewWindowForTab() override;
2015-10-27 01:12:01 +00:00
#if defined(OS_WIN)
2015-10-29 02:53:48 +00:00
void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) override;
2015-10-27 01:12:01 +00:00
#endif
base::WeakPtr<BrowserWindow> GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
private:
void Init(v8::Isolate* isolate,
v8::Local<v8::Object> wrapper,
const mate::Dictionary& options,
mate::Handle<class WebContents> web_contents);
// APIs for NativeWindow.
void Close();
void Focus();
2016-03-11 05:45:51 +00:00
void Blur();
bool IsFocused();
void Show();
2014-10-17 14:51:20 +00:00
void ShowInactive();
void Hide();
bool IsVisible();
bool IsEnabled();
void SetEnabled(bool enable);
void Maximize();
void Unmaximize();
2014-05-14 21:58:49 +00:00
bool IsMaximized();
void Minimize();
void Restore();
2014-07-26 05:58:26 +00:00
bool IsMinimized();
2014-11-25 06:34:14 +00:00
void SetFullScreen(bool fullscreen);
bool IsFullscreen();
void SetBounds(const gfx::Rect& bounds, mate::Arguments* args);
gfx::Rect GetBounds();
void SetSize(int width, int height, mate::Arguments* args);
std::vector<int> GetSize();
void SetContentSize(int width, int height, mate::Arguments* args);
2014-05-15 07:30:04 +00:00
std::vector<int> GetContentSize();
2016-08-04 19:02:24 +00:00
void SetContentBounds(const gfx::Rect& bounds, mate::Arguments* args);
2016-07-29 01:19:17 +00:00
gfx::Rect GetContentBounds();
void SetMinimumSize(int width, int height);
std::vector<int> GetMinimumSize();
void SetMaximumSize(int width, int height);
std::vector<int> GetMaximumSize();
void SetSheetOffset(double offsetY, mate::Arguments* args);
void SetResizable(bool resizable);
bool IsResizable();
void SetMovable(bool movable);
bool IsMovable();
void SetMinimizable(bool minimizable);
bool IsMinimizable();
2016-01-22 21:24:33 +00:00
void SetMaximizable(bool maximizable);
bool IsMaximizable();
2016-01-23 07:47:37 +00:00
void SetFullScreenable(bool fullscreenable);
bool IsFullScreenable();
void SetClosable(bool closable);
bool IsClosable();
void SetAlwaysOnTop(bool top, mate::Arguments* args);
bool IsAlwaysOnTop();
void Center();
void SetPosition(int x, int y, mate::Arguments* args);
std::vector<int> GetPosition();
void SetTitle(const std::string& title);
std::string GetTitle();
void FlashFrame(bool flash);
void SetSkipTaskbar(bool skip);
void SetSimpleFullScreen(bool simple_fullscreen);
bool IsSimpleFullScreen();
void SetKiosk(bool kiosk);
bool IsKiosk();
2015-10-23 03:35:33 +00:00
void SetBackgroundColor(const std::string& color_name);
void SetHasShadow(bool has_shadow);
bool HasShadow();
2017-09-29 02:26:02 +00:00
void SetOpacity(const double opacity);
double GetOpacity();
void FocusOnWebView();
void BlurWebView();
bool IsWebViewFocused();
void SetRepresentedFilename(const std::string& filename);
std::string GetRepresentedFilename();
void SetDocumentEdited(bool edited);
bool IsDocumentEdited();
void SetIgnoreMouseEvents(bool ignore, mate::Arguments* args);
void SetContentProtection(bool enable);
2016-06-13 08:10:28 +00:00
void SetFocusable(bool focusable);
void SetProgressBar(double progress, mate::Arguments* args);
2015-02-07 01:00:26 +00:00
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description);
2015-08-06 04:44:07 +00:00
bool SetThumbarButtons(mate::Arguments* args);
2015-06-24 11:51:11 +00:00
void SetMenu(v8::Isolate* isolate, v8::Local<v8::Value> menu);
2014-11-12 12:31:55 +00:00
void SetAutoHideMenuBar(bool auto_hide);
bool IsMenuBarAutoHide();
void SetMenuBarVisibility(bool visible);
bool IsMenuBarVisible();
void SetAspectRatio(double aspect_ratio, mate::Arguments* args);
2016-10-14 16:42:50 +00:00
void PreviewFile(const std::string& path, mate::Arguments* args);
2016-11-21 18:30:13 +00:00
void CloseFilePreview();
2016-06-17 07:57:03 +00:00
void SetParentWindow(v8::Local<v8::Value> value, mate::Arguments* args);
v8::Local<v8::Value> GetParentWindow() const;
std::vector<v8::Local<v8::Object>> GetChildWindows() const;
Implement initial, experimental BrowserView API Right now, `<webview>` is the only way to embed additional content in a `BrowserWindow`. Unfortunately `<webview>` suffers from a [number of problems](https://github.com/electron/electron/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Awebview%20). To make matters worse, many of these are upstream Chromium bugs instead of Electron-specific bugs. For us at [Figma](https://www.figma.com), the main issue is very slow performance. Despite the upstream improvements to `<webview>` through the OOPIF work, it is probable that there will continue to be `<webview>`-specific bugs in the future. Therefore, this introduces a `<webview>` alternative to called `BrowserView`, which... - is a thin wrapper around `api::WebContents` (so bugs in `BrowserView` will likely also be bugs in `BrowserWindow` web contents) - is instantiated in the main process like `BrowserWindow` (and unlike `<webview>`, which lives in the DOM of a `BrowserWindow` web contents) - needs to be added to a `BrowserWindow` to display something on the screen This implements the most basic API. The API is expected to evolve and change in the near future and has consequently been marked as experimental. Please do not use this API in production unless you are prepared to deal with breaking changes. In the future, we will want to change the API to support multiple `BrowserView`s per window. We will also want to consider z-ordering auto-resizing, and possibly even nested views.
2017-04-11 17:47:30 +00:00
v8::Local<v8::Value> GetBrowserView() const;
void SetBrowserView(v8::Local<v8::Value> value);
void ResetBrowserView();
bool IsModal() const;
2016-01-07 20:38:35 +00:00
v8::Local<v8::Value> GetNativeWindowHandle();
#if defined(OS_WIN)
typedef base::Callback<void(v8::Local<v8::Value>,
v8::Local<v8::Value>)> MessageCallback;
2015-10-29 02:53:48 +00:00
bool HookWindowMessage(UINT message, const MessageCallback& callback);
bool IsWindowMessageHooked(UINT message);
void UnhookWindowMessage(UINT message);
void UnhookAllWindowMessages();
2016-07-14 22:54:57 +00:00
bool SetThumbnailClip(const gfx::Rect& region);
bool SetThumbnailToolTip(const std::string& tooltip);
void SetAppDetails(const mate::Dictionary& options);
#endif
2016-05-20 13:22:15 +00:00
#if defined(TOOLKIT_VIEWS)
void SetIcon(mate::Handle<NativeImage> icon);
#endif
void SetVisibleOnAllWorkspaces(bool visible);
bool IsVisibleOnAllWorkspaces();
void SetAutoHideCursor(bool auto_hide);
void SelectPreviousTab();
void SelectNextTab();
void MergeAllWindows();
void MoveTabToNewWindow();
void ToggleTabBar();
void AddTabbedWindow(NativeWindow* window);
void SetVibrancy(mate::Arguments* args);
void SetTouchBar(const std::vector<mate::PersistentDictionary>& items);
2017-03-01 00:08:12 +00:00
void RefreshTouchBarItem(const std::string& item_id);
2017-03-29 04:11:39 +00:00
void SetEscapeTouchBarItem(const mate::PersistentDictionary& item);
2016-11-07 20:22:41 +00:00
2015-06-05 09:01:17 +00:00
v8::Local<v8::Value> WebContents(v8::Isolate* isolate);
// Remove this window from parent window's |child_windows_|.
2016-06-17 07:57:03 +00:00
void RemoveFromParentChildWindows();
// Called when the window needs to update its draggable region.
void UpdateDraggableRegions(
content::RenderFrameHost* rfh,
const std::vector<DraggableRegion>& regions);
2015-10-29 02:53:48 +00:00
#if defined(OS_WIN)
typedef std::map<UINT, MessageCallback> MessageCallbackMap;
MessageCallbackMap messages_callback_map_;
#endif
Implement initial, experimental BrowserView API Right now, `<webview>` is the only way to embed additional content in a `BrowserWindow`. Unfortunately `<webview>` suffers from a [number of problems](https://github.com/electron/electron/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Awebview%20). To make matters worse, many of these are upstream Chromium bugs instead of Electron-specific bugs. For us at [Figma](https://www.figma.com), the main issue is very slow performance. Despite the upstream improvements to `<webview>` through the OOPIF work, it is probable that there will continue to be `<webview>`-specific bugs in the future. Therefore, this introduces a `<webview>` alternative to called `BrowserView`, which... - is a thin wrapper around `api::WebContents` (so bugs in `BrowserView` will likely also be bugs in `BrowserWindow` web contents) - is instantiated in the main process like `BrowserWindow` (and unlike `<webview>`, which lives in the DOM of a `BrowserWindow` web contents) - needs to be added to a `BrowserWindow` to display something on the screen This implements the most basic API. The API is expected to evolve and change in the near future and has consequently been marked as experimental. Please do not use this API in production unless you are prepared to deal with breaking changes. In the future, we will want to change the API to support multiple `BrowserView`s per window. We will also want to consider z-ordering auto-resizing, and possibly even nested views.
2017-04-11 17:47:30 +00:00
v8::Global<v8::Value> browser_view_;
2015-06-05 09:01:17 +00:00
v8::Global<v8::Value> web_contents_;
2015-06-24 11:51:11 +00:00
v8::Global<v8::Value> menu_;
2016-06-17 07:09:43 +00:00
v8::Global<v8::Value> parent_window_;
2016-06-17 07:57:03 +00:00
KeyWeakMap<int> child_windows_;
api::WebContents* api_web_contents_;
2016-05-23 01:59:39 +00:00
std::unique_ptr<NativeWindow> window_;
base::WeakPtrFactory<BrowserWindow> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(BrowserWindow);
};
} // namespace api
} // namespace atom
2014-04-24 05:10:04 +00:00
namespace mate {
template<>
struct Converter<atom::NativeWindow*> {
2015-05-22 11:11:22 +00:00
static bool FromV8(v8::Isolate* isolate, v8::Local<v8::Value> val,
2014-04-24 05:10:04 +00:00
atom::NativeWindow** out) {
// null would be tranfered to NULL.
if (val->IsNull()) {
*out = NULL;
return true;
}
atom::api::BrowserWindow* window;
if (!Converter<atom::api::BrowserWindow*>::FromV8(isolate, val, &window))
2014-04-24 05:10:04 +00:00
return false;
*out = window->window();
return true;
}
};
} // namespace mate
#endif // ATOM_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_