2014-10-31 18:17:05 +00:00
|
|
|
// 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
|
2013-04-12 07:04:46 +00:00
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2019-06-19 20:56:58 +00:00
|
|
|
#ifndef SHELL_BROWSER_NATIVE_WINDOW_H_
|
|
|
|
#define SHELL_BROWSER_NATIVE_WINDOW_H_
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2018-12-22 01:49:26 +00:00
|
|
|
#include <list>
|
2014-04-05 03:00:35 +00:00
|
|
|
#include <map>
|
2016-07-04 06:08:55 +00:00
|
|
|
#include <memory>
|
2014-03-16 01:13:06 +00:00
|
|
|
#include <string>
|
2018-11-08 17:03:19 +00:00
|
|
|
#include <tuple>
|
2014-03-16 01:13:06 +00:00
|
|
|
#include <vector>
|
|
|
|
|
2013-11-29 06:52:12 +00:00
|
|
|
#include "base/memory/weak_ptr.h"
|
2013-04-18 12:50:58 +00:00
|
|
|
#include "base/observer_list.h"
|
2015-10-01 05:45:59 +00:00
|
|
|
#include "base/supports_user_data.h"
|
2015-06-24 14:14:46 +00:00
|
|
|
#include "content/public/browser/web_contents_user_data.h"
|
2015-10-05 08:19:01 +00:00
|
|
|
#include "extensions/browser/app_window/size_constraints.h"
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/native_window_observer.h"
|
2018-04-25 06:51:54 +00:00
|
|
|
#include "ui/views/widget/widget_delegate.h"
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2015-08-05 04:32:22 +00:00
|
|
|
class SkRegion;
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
namespace content {
|
2015-06-25 03:07:23 +00:00
|
|
|
struct NativeWebKeyboardEvent;
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace gfx {
|
2018-03-06 06:24:54 +00:00
|
|
|
class Image;
|
2013-04-12 07:04:46 +00:00
|
|
|
class Point;
|
|
|
|
class Rect;
|
2018-03-06 06:24:54 +00:00
|
|
|
class RectF;
|
2013-04-12 07:04:46 +00:00
|
|
|
class Size;
|
2018-04-18 01:44:10 +00:00
|
|
|
} // namespace gfx
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2014-06-23 13:51:42 +00:00
|
|
|
namespace mate {
|
|
|
|
class Dictionary;
|
2018-04-10 06:23:16 +00:00
|
|
|
class PersistentDictionary;
|
2018-04-18 01:44:10 +00:00
|
|
|
} // namespace mate
|
2014-06-23 13:51:42 +00:00
|
|
|
|
2019-06-19 21:23:04 +00:00
|
|
|
namespace electron {
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2018-04-10 06:23:16 +00:00
|
|
|
class AtomMenuModel;
|
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
|
|
|
class NativeBrowserView;
|
|
|
|
|
2018-12-11 17:45:55 +00:00
|
|
|
#if defined(OS_MACOSX)
|
|
|
|
typedef NSView* NativeWindowHandle;
|
|
|
|
#else
|
|
|
|
typedef gfx::AcceleratedWidget NativeWindowHandle;
|
|
|
|
#endif
|
|
|
|
|
2018-04-25 06:51:54 +00:00
|
|
|
class NativeWindow : public base::SupportsUserData,
|
|
|
|
public views::WidgetDelegate {
|
2013-04-12 07:04:46 +00:00
|
|
|
public:
|
2016-07-11 06:29:03 +00:00
|
|
|
~NativeWindow() override;
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2014-03-04 06:35:35 +00:00
|
|
|
// Create window with existing WebContents, the caller is responsible for
|
|
|
|
// managing the window's live.
|
2018-04-08 11:20:43 +00:00
|
|
|
static NativeWindow* Create(const mate::Dictionary& options,
|
|
|
|
NativeWindow* parent = nullptr);
|
2013-04-20 05:42:39 +00:00
|
|
|
|
2014-06-23 13:51:42 +00:00
|
|
|
void InitFromOptions(const mate::Dictionary& options);
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2018-05-08 03:51:27 +00:00
|
|
|
virtual void SetContentView(views::View* view) = 0;
|
2018-04-08 11:20:43 +00:00
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void Close() = 0;
|
2013-05-01 08:12:00 +00:00
|
|
|
virtual void CloseImmediately() = 0;
|
2018-04-17 23:47:47 +00:00
|
|
|
virtual bool IsClosed() const;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void Focus(bool focus) = 0;
|
2013-05-16 14:56:52 +00:00
|
|
|
virtual bool IsFocused() = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void Show() = 0;
|
2014-10-17 14:51:20 +00:00
|
|
|
virtual void ShowInactive() = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void Hide() = 0;
|
2013-10-03 00:27:59 +00:00
|
|
|
virtual bool IsVisible() = 0;
|
2016-06-17 08:38:44 +00:00
|
|
|
virtual bool IsEnabled() = 0;
|
2018-02-06 13:21:53 +00:00
|
|
|
virtual void SetEnabled(bool enable) = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void Maximize() = 0;
|
|
|
|
virtual void Unmaximize() = 0;
|
2014-05-14 21:58:49 +00:00
|
|
|
virtual bool IsMaximized() = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void Minimize() = 0;
|
|
|
|
virtual void Restore() = 0;
|
2014-07-26 05:58:26 +00:00
|
|
|
virtual bool IsMinimized() = 0;
|
2014-11-25 06:34:14 +00:00
|
|
|
virtual void SetFullScreen(bool fullscreen) = 0;
|
2015-04-21 13:35:36 +00:00
|
|
|
virtual bool IsFullscreen() const = 0;
|
2016-01-15 16:31:31 +00:00
|
|
|
virtual void SetBounds(const gfx::Rect& bounds, bool animate = false) = 0;
|
2015-05-01 10:50:53 +00:00
|
|
|
virtual gfx::Rect GetBounds() = 0;
|
2016-01-15 16:31:31 +00:00
|
|
|
virtual void SetSize(const gfx::Size& size, bool animate = false);
|
2015-05-04 04:43:40 +00:00
|
|
|
virtual gfx::Size GetSize();
|
2016-01-15 16:31:31 +00:00
|
|
|
virtual void SetPosition(const gfx::Point& position, bool animate = false);
|
2015-05-04 04:43:40 +00:00
|
|
|
virtual gfx::Point GetPosition();
|
2016-01-15 16:31:31 +00:00
|
|
|
virtual void SetContentSize(const gfx::Size& size, bool animate = false);
|
2015-10-05 08:19:01 +00:00
|
|
|
virtual gfx::Size GetContentSize();
|
2016-08-04 19:02:24 +00:00
|
|
|
virtual void SetContentBounds(const gfx::Rect& bounds, bool animate = false);
|
2016-08-04 17:58:59 +00:00
|
|
|
virtual gfx::Rect GetContentBounds();
|
2018-08-24 21:33:27 +00:00
|
|
|
virtual bool IsNormal();
|
|
|
|
virtual gfx::Rect GetNormalBounds() = 0;
|
2015-10-05 08:19:01 +00:00
|
|
|
virtual void SetSizeConstraints(
|
|
|
|
const extensions::SizeConstraints& size_constraints);
|
2017-05-21 18:57:19 +00:00
|
|
|
virtual extensions::SizeConstraints GetSizeConstraints() const;
|
2015-10-05 08:19:01 +00:00
|
|
|
virtual void SetContentSizeConstraints(
|
|
|
|
const extensions::SizeConstraints& size_constraints);
|
2017-05-21 18:57:19 +00:00
|
|
|
virtual extensions::SizeConstraints GetContentSizeConstraints() const;
|
2015-10-05 08:19:01 +00:00
|
|
|
virtual void SetMinimumSize(const gfx::Size& size);
|
2017-05-21 18:57:19 +00:00
|
|
|
virtual gfx::Size GetMinimumSize() const;
|
2015-10-05 08:19:01 +00:00
|
|
|
virtual void SetMaximumSize(const gfx::Size& size);
|
2017-05-21 18:57:19 +00:00
|
|
|
virtual gfx::Size GetMaximumSize() const;
|
2018-05-12 15:37:31 +00:00
|
|
|
virtual gfx::Size GetContentMinimumSize() const;
|
|
|
|
virtual gfx::Size GetContentMaximumSize() const;
|
2016-05-20 03:19:08 +00:00
|
|
|
virtual void SetSheetOffset(const double offsetX, const double offsetY);
|
2016-05-19 06:39:16 +00:00
|
|
|
virtual double GetSheetOffsetX();
|
|
|
|
virtual double GetSheetOffsetY();
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void SetResizable(bool resizable) = 0;
|
2018-04-03 13:04:32 +00:00
|
|
|
virtual void MoveTop() = 0;
|
2013-04-18 07:38:04 +00:00
|
|
|
virtual bool IsResizable() = 0;
|
2016-01-18 22:46:35 +00:00
|
|
|
virtual void SetMovable(bool movable) = 0;
|
|
|
|
virtual bool IsMovable() = 0;
|
|
|
|
virtual void SetMinimizable(bool minimizable) = 0;
|
|
|
|
virtual bool IsMinimizable() = 0;
|
2016-01-22 21:24:33 +00:00
|
|
|
virtual void SetMaximizable(bool maximizable) = 0;
|
|
|
|
virtual bool IsMaximizable() = 0;
|
2016-01-23 07:47:37 +00:00
|
|
|
virtual void SetFullScreenable(bool fullscreenable) = 0;
|
|
|
|
virtual bool IsFullScreenable() = 0;
|
2016-01-18 22:46:35 +00:00
|
|
|
virtual void SetClosable(bool closable) = 0;
|
|
|
|
virtual bool IsClosable() = 0;
|
2016-09-22 16:22:28 +00:00
|
|
|
virtual void SetAlwaysOnTop(bool top,
|
2017-01-24 04:36:09 +00:00
|
|
|
const std::string& level = "floating",
|
2017-01-25 04:08:08 +00:00
|
|
|
int relativeLevel = 0,
|
|
|
|
std::string* error = nullptr) = 0;
|
2013-04-18 07:38:04 +00:00
|
|
|
virtual bool IsAlwaysOnTop() = 0;
|
2013-05-10 12:34:05 +00:00
|
|
|
virtual void Center() = 0;
|
2017-02-14 03:41:24 +00:00
|
|
|
virtual void Invalidate() = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void SetTitle(const std::string& title) = 0;
|
2013-04-18 06:30:05 +00:00
|
|
|
virtual std::string GetTitle() = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void FlashFrame(bool flash) = 0;
|
2014-06-16 02:29:51 +00:00
|
|
|
virtual void SetSkipTaskbar(bool skip) = 0;
|
2019-03-27 12:10:23 +00:00
|
|
|
virtual void SetExcludedFromShownWindowsMenu(bool excluded) = 0;
|
|
|
|
virtual bool IsExcludedFromShownWindowsMenu() = 0;
|
2017-08-13 06:28:33 +00:00
|
|
|
virtual void SetSimpleFullScreen(bool simple_fullscreen) = 0;
|
|
|
|
virtual bool IsSimpleFullScreen() = 0;
|
2013-04-12 07:04:46 +00:00
|
|
|
virtual void SetKiosk(bool kiosk) = 0;
|
|
|
|
virtual bool IsKiosk() = 0;
|
2018-03-06 04:21:47 +00:00
|
|
|
virtual void SetBackgroundColor(SkColor color) = 0;
|
2016-01-23 10:55:12 +00:00
|
|
|
virtual void SetHasShadow(bool has_shadow) = 0;
|
|
|
|
virtual bool HasShadow() = 0;
|
2017-09-29 02:26:02 +00:00
|
|
|
virtual void SetOpacity(const double opacity) = 0;
|
2017-10-02 15:08:10 +00:00
|
|
|
virtual double GetOpacity() = 0;
|
2014-05-27 06:15:34 +00:00
|
|
|
virtual void SetRepresentedFilename(const std::string& filename);
|
2014-07-18 13:42:26 +00:00
|
|
|
virtual std::string GetRepresentedFilename();
|
2014-05-27 06:15:34 +00:00
|
|
|
virtual void SetDocumentEdited(bool edited);
|
2014-07-24 07:48:33 +00:00
|
|
|
virtual bool IsDocumentEdited();
|
2017-08-14 18:21:00 +00:00
|
|
|
virtual void SetIgnoreMouseEvents(bool ignore, bool forward) = 0;
|
2016-06-22 08:40:01 +00:00
|
|
|
virtual void SetContentProtection(bool enable) = 0;
|
2016-06-13 08:10:28 +00:00
|
|
|
virtual void SetFocusable(bool focusable);
|
2016-07-06 23:04:18 +00:00
|
|
|
virtual void SetMenu(AtomMenuModel* menu);
|
2016-06-20 05:49:24 +00:00
|
|
|
virtual void SetParentWindow(NativeWindow* parent);
|
2018-12-22 01:49:26 +00:00
|
|
|
virtual void AddBrowserView(NativeBrowserView* browser_view) = 0;
|
|
|
|
virtual void RemoveBrowserView(NativeBrowserView* browser_view) = 0;
|
2017-05-21 18:57:19 +00:00
|
|
|
virtual gfx::NativeView GetNativeView() const = 0;
|
|
|
|
virtual gfx::NativeWindow GetNativeWindow() const = 0;
|
|
|
|
virtual gfx::AcceleratedWidget GetAcceleratedWidget() const = 0;
|
2018-12-11 17:45:55 +00:00
|
|
|
virtual NativeWindowHandle GetNativeWindowHandle() const = 0;
|
2015-08-06 03:10:34 +00:00
|
|
|
|
|
|
|
// Taskbar/Dock APIs.
|
2019-05-03 18:11:41 +00:00
|
|
|
enum class ProgressState {
|
|
|
|
kNone, // no progress, no marking
|
|
|
|
kIndeterminate, // progress, indeterminate
|
|
|
|
kError, // progress, errored (red)
|
|
|
|
kPaused, // progress, paused (yellow)
|
|
|
|
kNormal, // progress, not marked (green)
|
2016-08-09 23:05:44 +00:00
|
|
|
};
|
|
|
|
|
2018-04-18 01:44:10 +00:00
|
|
|
virtual void SetProgressBar(double progress, const ProgressState state) = 0;
|
2015-02-07 01:00:26 +00:00
|
|
|
virtual void SetOverlayIcon(const gfx::Image& overlay,
|
2015-02-07 00:31:41 +00:00
|
|
|
const std::string& description) = 0;
|
2015-08-06 03:10:34 +00:00
|
|
|
|
|
|
|
// Workspace APIs.
|
2018-08-31 22:06:02 +00:00
|
|
|
virtual void SetVisibleOnAllWorkspaces(bool visible,
|
|
|
|
bool visibleOnFullScreen = false) = 0;
|
|
|
|
|
2015-03-27 11:41:07 +00:00
|
|
|
virtual bool IsVisibleOnAllWorkspaces() = 0;
|
2014-02-24 04:08:33 +00:00
|
|
|
|
2016-11-28 19:38:40 +00:00
|
|
|
virtual void SetAutoHideCursor(bool auto_hide);
|
|
|
|
|
2016-11-07 20:22:41 +00:00
|
|
|
// Vibrancy API
|
2016-11-10 10:59:25 +00:00
|
|
|
virtual void SetVibrancy(const std::string& type);
|
2016-11-07 20:22:41 +00:00
|
|
|
|
2016-11-27 05:57:01 +00:00
|
|
|
// Touchbar API
|
2017-03-01 00:14:02 +00:00
|
|
|
virtual void SetTouchBar(
|
|
|
|
const std::vector<mate::PersistentDictionary>& items);
|
2017-03-01 00:08:12 +00:00
|
|
|
virtual void RefreshTouchBarItem(const std::string& item_id);
|
2017-03-29 04:11:39 +00:00
|
|
|
virtual void SetEscapeTouchBarItem(const mate::PersistentDictionary& item);
|
2016-11-27 05:57:01 +00:00
|
|
|
|
2017-08-21 04:46:10 +00:00
|
|
|
// Native Tab API
|
|
|
|
virtual void SelectPreviousTab();
|
|
|
|
virtual void SelectNextTab();
|
|
|
|
virtual void MergeAllWindows();
|
|
|
|
virtual void MoveTabToNewWindow();
|
|
|
|
virtual void ToggleTabBar();
|
2018-02-27 21:00:42 +00:00
|
|
|
virtual bool AddTabbedWindow(NativeWindow* window);
|
2017-08-21 04:46:10 +00:00
|
|
|
|
2018-07-03 08:20:56 +00:00
|
|
|
// Returns false if unsupported.
|
|
|
|
virtual bool SetWindowButtonVisibility(bool visible);
|
|
|
|
|
2014-11-12 09:36:20 +00:00
|
|
|
// Toggle the menu bar.
|
|
|
|
virtual void SetAutoHideMenuBar(bool auto_hide);
|
|
|
|
virtual bool IsMenuBarAutoHide();
|
|
|
|
virtual void SetMenuBarVisibility(bool visible);
|
|
|
|
virtual bool IsMenuBarVisible();
|
|
|
|
|
2015-07-23 02:07:58 +00:00
|
|
|
// Set the aspect ratio when resizing window.
|
|
|
|
double GetAspectRatio();
|
|
|
|
gfx::Size GetAspectRatioExtraSize();
|
2016-05-22 23:50:50 +00:00
|
|
|
virtual void SetAspectRatio(double aspect_ratio, const gfx::Size& extra_size);
|
2016-11-21 18:30:13 +00:00
|
|
|
|
|
|
|
// File preview APIs.
|
2016-10-14 16:42:50 +00:00
|
|
|
virtual void PreviewFile(const std::string& path,
|
2016-10-26 00:47:22 +00:00
|
|
|
const std::string& display_name);
|
2016-11-21 18:30:13 +00:00
|
|
|
virtual void CloseFilePreview();
|
2015-07-23 02:07:58 +00:00
|
|
|
|
2018-02-22 06:16:24 +00:00
|
|
|
// Converts between content bounds and window bounds.
|
|
|
|
virtual gfx::Rect ContentBoundsToWindowBounds(
|
|
|
|
const gfx::Rect& bounds) const = 0;
|
|
|
|
virtual gfx::Rect WindowBoundsToContentBounds(
|
|
|
|
const gfx::Rect& bounds) const = 0;
|
|
|
|
|
2014-03-04 10:42:37 +00:00
|
|
|
base::WeakPtr<NativeWindow> GetWeakPtr() {
|
|
|
|
return weak_factory_.GetWeakPtr();
|
|
|
|
}
|
|
|
|
|
2015-06-25 03:07:23 +00:00
|
|
|
// Methods called by the WebContents.
|
|
|
|
virtual void HandleKeyboardEvent(
|
|
|
|
content::WebContents*,
|
|
|
|
const content::NativeWebKeyboardEvent& event) {}
|
|
|
|
|
2014-04-23 02:24:46 +00:00
|
|
|
// Public API used by platform-dependent delegates and observers to send UI
|
|
|
|
// related notifications.
|
2018-03-06 03:03:12 +00:00
|
|
|
void NotifyWindowRequestPreferredWith(int* width);
|
2018-02-22 07:15:21 +00:00
|
|
|
void NotifyWindowCloseButtonClicked();
|
2014-04-23 02:24:46 +00:00
|
|
|
void NotifyWindowClosed();
|
2017-04-24 18:49:21 +00:00
|
|
|
void NotifyWindowEndSession();
|
2014-04-23 02:24:46 +00:00
|
|
|
void NotifyWindowBlur();
|
2014-05-21 17:46:13 +00:00
|
|
|
void NotifyWindowFocus();
|
2016-03-08 17:36:41 +00:00
|
|
|
void NotifyWindowShow();
|
|
|
|
void NotifyWindowHide();
|
2014-11-25 04:43:25 +00:00
|
|
|
void NotifyWindowMaximize();
|
|
|
|
void NotifyWindowUnmaximize();
|
|
|
|
void NotifyWindowMinimize();
|
|
|
|
void NotifyWindowRestore();
|
2015-05-09 15:55:10 +00:00
|
|
|
void NotifyWindowMove();
|
2018-07-27 09:53:01 +00:00
|
|
|
void NotifyWindowWillResize(const gfx::Rect& new_bounds,
|
|
|
|
bool* prevent_default);
|
2015-05-09 15:55:10 +00:00
|
|
|
void NotifyWindowResize();
|
2018-08-28 13:44:10 +00:00
|
|
|
void NotifyWindowWillMove(const gfx::Rect& new_bounds, bool* prevent_default);
|
2015-05-20 08:37:13 +00:00
|
|
|
void NotifyWindowMoved();
|
2016-01-22 00:31:09 +00:00
|
|
|
void NotifyWindowScrollTouchBegin();
|
|
|
|
void NotifyWindowScrollTouchEnd();
|
2016-03-23 15:20:11 +00:00
|
|
|
void NotifyWindowSwipe(const std::string& direction);
|
2017-04-20 17:31:25 +00:00
|
|
|
void NotifyWindowSheetBegin();
|
|
|
|
void NotifyWindowSheetEnd();
|
2014-11-25 04:43:25 +00:00
|
|
|
void NotifyWindowEnterFullScreen();
|
|
|
|
void NotifyWindowLeaveFullScreen();
|
2015-05-21 05:09:31 +00:00
|
|
|
void NotifyWindowEnterHtmlFullScreen();
|
|
|
|
void NotifyWindowLeaveHtmlFullScreen();
|
2018-10-04 18:02:16 +00:00
|
|
|
void NotifyWindowAlwaysOnTopChanged();
|
2018-12-05 17:35:59 +00:00
|
|
|
void NotifyWindowExecuteAppCommand(const std::string& command);
|
2017-02-28 23:37:15 +00:00
|
|
|
void NotifyTouchBarItemInteraction(const std::string& item_id,
|
|
|
|
const base::DictionaryValue& details);
|
2017-06-11 08:19:01 +00:00
|
|
|
void NotifyNewWindowForTab();
|
2014-04-23 02:24:46 +00:00
|
|
|
|
2018-04-18 01:44:10 +00:00
|
|
|
#if defined(OS_WIN)
|
2015-10-27 01:12:01 +00:00
|
|
|
void NotifyWindowMessage(UINT message, WPARAM w_param, LPARAM l_param);
|
2018-04-18 01:44:10 +00:00
|
|
|
#endif
|
2015-10-27 01:12:01 +00:00
|
|
|
|
2018-04-18 01:44:10 +00:00
|
|
|
void AddObserver(NativeWindowObserver* obs) { observers_.AddObserver(obs); }
|
2013-04-18 12:50:58 +00:00
|
|
|
void RemoveObserver(NativeWindowObserver* obs) {
|
|
|
|
observers_.RemoveObserver(obs);
|
|
|
|
}
|
|
|
|
|
2018-04-25 07:05:43 +00:00
|
|
|
views::Widget* widget() const { return widget_.get(); }
|
2018-05-08 03:51:27 +00:00
|
|
|
views::View* content_view() const { return content_view_; }
|
2018-04-25 07:05:43 +00:00
|
|
|
|
2013-09-11 05:05:08 +00:00
|
|
|
bool has_frame() const { return has_frame_; }
|
2016-05-17 06:48:14 +00:00
|
|
|
void set_has_frame(bool has_frame) { has_frame_ = has_frame; }
|
|
|
|
|
2015-08-05 04:46:32 +00:00
|
|
|
bool transparent() const { return transparent_; }
|
|
|
|
bool enable_larger_than_screen() const { return enable_larger_than_screen_; }
|
2013-09-11 05:05:08 +00:00
|
|
|
|
2016-06-20 05:49:24 +00:00
|
|
|
NativeWindow* parent() const { return parent_; }
|
|
|
|
bool is_modal() const { return is_modal_; }
|
|
|
|
|
2018-12-22 01:49:26 +00:00
|
|
|
std::list<NativeBrowserView*> browser_views() const { return browser_views_; }
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
protected:
|
2018-04-18 01:44:10 +00:00
|
|
|
NativeWindow(const mate::Dictionary& options, NativeWindow* parent);
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2018-04-25 07:05:43 +00:00
|
|
|
// views::WidgetDelegate:
|
|
|
|
views::Widget* GetWidget() override;
|
|
|
|
const views::Widget* GetWidget() const override;
|
|
|
|
|
2018-05-08 03:51:27 +00:00
|
|
|
void set_content_view(views::View* view) { content_view_ = view; }
|
2018-12-22 01:49:26 +00:00
|
|
|
|
|
|
|
void add_browser_view(NativeBrowserView* browser_view) {
|
|
|
|
browser_views_.push_back(browser_view);
|
|
|
|
}
|
|
|
|
void remove_browser_view(NativeBrowserView* browser_view) {
|
|
|
|
browser_views_.remove_if(
|
|
|
|
[&browser_view](NativeBrowserView* n) { return (n == browser_view); });
|
2018-03-06 06:04:40 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
private:
|
2018-04-25 07:05:43 +00:00
|
|
|
std::unique_ptr<views::Widget> widget_;
|
|
|
|
|
2018-05-08 03:51:27 +00:00
|
|
|
// The content view, weak ref.
|
2018-05-21 22:18:38 +00:00
|
|
|
views::View* content_view_ = nullptr;
|
2018-05-08 03:51:27 +00:00
|
|
|
|
2015-08-05 04:46:32 +00:00
|
|
|
// Whether window has standard frame.
|
2018-05-21 22:18:38 +00:00
|
|
|
bool has_frame_ = true;
|
2015-08-05 04:46:32 +00:00
|
|
|
|
|
|
|
// Whether window is transparent.
|
2018-05-21 22:18:38 +00:00
|
|
|
bool transparent_ = false;
|
2015-08-05 04:46:32 +00:00
|
|
|
|
2015-10-05 08:19:01 +00:00
|
|
|
// Minimum and maximum size, stored as content size.
|
|
|
|
extensions::SizeConstraints size_constraints_;
|
|
|
|
|
2015-08-05 04:46:32 +00:00
|
|
|
// Whether window can be resized larger than screen.
|
2018-05-21 22:18:38 +00:00
|
|
|
bool enable_larger_than_screen_ = false;
|
2015-08-05 04:46:32 +00:00
|
|
|
|
2013-07-23 07:29:56 +00:00
|
|
|
// The windows has been closed.
|
2018-05-21 22:18:38 +00:00
|
|
|
bool is_closed_ = false;
|
2013-04-30 15:56:50 +00:00
|
|
|
|
2016-05-19 06:39:16 +00:00
|
|
|
// Used to display sheets at the appropriate horizontal and vertical offsets
|
2016-06-18 13:26:26 +00:00
|
|
|
// on macOS.
|
2018-05-21 22:18:38 +00:00
|
|
|
double sheet_offset_x_ = 0.0;
|
|
|
|
double sheet_offset_y_ = 0.0;
|
2016-03-27 01:12:25 +00:00
|
|
|
|
2015-07-16 18:26:48 +00:00
|
|
|
// Used to maintain the aspect ratio of a view which is inside of the
|
|
|
|
// content view.
|
2018-05-21 22:18:38 +00:00
|
|
|
double aspect_ratio_ = 0.0;
|
2015-07-23 02:07:58 +00:00
|
|
|
gfx::Size aspect_ratio_extraSize_;
|
2015-07-16 17:54:51 +00:00
|
|
|
|
2016-06-20 05:49:24 +00:00
|
|
|
// The parent window, it is guaranteed to be valid during this window's life.
|
2018-05-21 22:18:38 +00:00
|
|
|
NativeWindow* parent_ = nullptr;
|
2016-06-20 05:49:24 +00:00
|
|
|
|
|
|
|
// Is this a modal window.
|
2018-05-21 22:18:38 +00:00
|
|
|
bool is_modal_ = false;
|
2016-06-20 05:49:24 +00:00
|
|
|
|
2018-03-06 06:04:40 +00:00
|
|
|
// The browser view layer.
|
2018-12-22 01:49:26 +00:00
|
|
|
std::list<NativeBrowserView*> browser_views_;
|
2018-03-06 06:04:40 +00:00
|
|
|
|
2015-08-05 04:46:32 +00:00
|
|
|
// Observers of this window.
|
2015-09-02 07:16:49 +00:00
|
|
|
base::ObserverList<NativeWindowObserver> observers_;
|
2015-08-05 04:32:22 +00:00
|
|
|
|
2013-11-29 06:52:12 +00:00
|
|
|
base::WeakPtrFactory<NativeWindow> weak_factory_;
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
DISALLOW_COPY_AND_ASSIGN(NativeWindow);
|
|
|
|
};
|
|
|
|
|
2015-06-24 14:14:46 +00:00
|
|
|
// This class provides a hook to get a NativeWindow from a WebContents.
|
2018-04-18 01:44:10 +00:00
|
|
|
class NativeWindowRelay
|
|
|
|
: public content::WebContentsUserData<NativeWindowRelay> {
|
2015-06-24 14:14:46 +00:00
|
|
|
public:
|
2018-10-02 22:14:43 +00:00
|
|
|
static void CreateForWebContents(content::WebContents*,
|
|
|
|
base::WeakPtr<NativeWindow>);
|
2017-11-30 07:37:26 +00:00
|
|
|
|
2018-10-02 22:14:43 +00:00
|
|
|
~NativeWindowRelay() override;
|
|
|
|
|
|
|
|
NativeWindow* GetNativeWindow() const { return native_window_.get(); }
|
2015-06-24 14:14:46 +00:00
|
|
|
|
2019-01-21 16:56:54 +00:00
|
|
|
WEB_CONTENTS_USER_DATA_KEY_DECL();
|
|
|
|
|
2015-06-24 14:14:46 +00:00
|
|
|
private:
|
|
|
|
friend class content::WebContentsUserData<NativeWindow>;
|
2018-10-02 22:14:43 +00:00
|
|
|
explicit NativeWindowRelay(base::WeakPtr<NativeWindow> window);
|
|
|
|
|
|
|
|
base::WeakPtr<NativeWindow> native_window_;
|
2015-06-24 14:14:46 +00:00
|
|
|
};
|
|
|
|
|
2019-06-19 21:23:04 +00:00
|
|
|
} // namespace electron
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2019-06-19 20:56:58 +00:00
|
|
|
#endif // SHELL_BROWSER_NATIVE_WINDOW_H_
|