mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
Merge branch 'refactor-draggable-regions-again' into replace-browserview
This commit is contained in:
2
BUILD.gn
2
BUILD.gn
@@ -665,6 +665,8 @@ source_set("electron_lib") {
|
||||
sources += [
|
||||
"shell/common/plugin_info.cc",
|
||||
"shell/common/plugin_info.h",
|
||||
"shell/renderer/electron_renderer_pepper_host_factory.cc",
|
||||
"shell/renderer/electron_renderer_pepper_host_factory.h",
|
||||
"shell/renderer/pepper_helper.cc",
|
||||
"shell/renderer/pepper_helper.h",
|
||||
]
|
||||
|
||||
@@ -7,29 +7,29 @@ check out our [Electron Versioning](./electron-versioning.md) doc.
|
||||
|
||||
## Timeline
|
||||
|
||||
| Electron | Alpha | Beta | Stable | Chrome | Node | Supported |
|
||||
| ------- | ----- | ------- | ------ | ------ | ---- | ---- |
|
||||
| 22.0.0 | 2022-Sep-29 | 2022-Oct-25 | 2022-Nov-29 | M108 | TBD | ✅ |
|
||||
| 21.0.0 | 2022-Aug-04 | 2022-Aug-30 | 2022-Sep-27 | M106 | v16.17 | ✅ |
|
||||
| 20.0.0 | 2022-May-26 | 2022-Jun-21 | 2022-Aug-02 | M104 | v16.15 | ✅ |
|
||||
| 19.0.0 | 2022-Mar-31 | 2022-Apr-26 | 2022-May-24 | M102 | v16.14 | ✅ |
|
||||
| 18.0.0 | 2022-Feb-03 | 2022-Mar-03 | 2022-Mar-29 | M100 | v16.13 | 🚫 |
|
||||
| 17.0.0 | 2021-Nov-18 | 2022-Jan-06 | 2022-Feb-01 | M98 | v16.13 | 🚫 |
|
||||
| 16.0.0 | 2021-Sep-23 | 2021-Oct-20 | 2021-Nov-16 | M96 | v16.9 | 🚫 |
|
||||
| 15.0.0 | 2021-Jul-20 | 2021-Sep-01 | 2021-Sep-21 | M94 | v16.5 | 🚫 |
|
||||
| 14.0.0 | -- | 2021-May-27 | 2021-Aug-31 | M93 | v14.17 | 🚫 |
|
||||
| 13.0.0 | -- | 2021-Mar-04 | 2021-May-25 | M91 | v14.16 | 🚫 |
|
||||
| 12.0.0 | -- | 2020-Nov-19 | 2021-Mar-02 | M89 | v14.16 | 🚫 |
|
||||
| 11.0.0 | -- | 2020-Aug-27 | 2020-Nov-17 | M87 | v12.18 | 🚫 |
|
||||
| 10.0.0 | -- | 2020-May-21 | 2020-Aug-25 | M85 | v12.16 | 🚫 |
|
||||
| 9.0.0 | -- | 2020-Feb-06 | 2020-May-19 | M83 | v12.14 | 🚫 |
|
||||
| 8.0.0 | -- | 2019-Oct-24 | 2020-Feb-04 | M80 | v12.13 | 🚫 |
|
||||
| 7.0.0 | -- | 2019-Aug-01 | 2019-Oct-22 | M78 | v12.8 | 🚫 |
|
||||
| 6.0.0 | -- | 2019-May-01 | 2019-Jul-30 | M76 | v12.4 | 🚫 |
|
||||
| 5.0.0 | -- | 2019-Jan-22 | 2019-Apr-24 | M73 | v12.0 | 🚫 |
|
||||
| 4.0.0 | -- | 2018-Oct-11 | 2018-Dec-20 | M69 | v10.11 | 🚫 |
|
||||
| 3.0.0 | -- | 2018-Jun-21 | 2018-Sep-18 | M66 | v10.2 | 🚫 |
|
||||
| 2.0.0 | -- | 2018-Feb-21 | 2018-May-01 | M61 | v8.9 | 🚫 |
|
||||
| Electron | Alpha | Beta | Stable | EOL | Chrome | Node | Supported |
|
||||
| ------- | ----- | ------- | ------ | ------ | ---- | ---- | ---- |
|
||||
| 22.0.0 | 2022-Sep-29 | 2022-Oct-25 | 2022-Nov-29 | TBD | M108 | TBD | ✅ |
|
||||
| 21.0.0 | 2022-Aug-04 | 2022-Aug-30 | 2022-Sep-27 | TBD | M106 | v16.17 | ✅ |
|
||||
| 20.0.0 | 2022-May-26 | 2022-Jun-21 | 2022-Aug-02 | TBD | M104 | v16.15 | ✅ |
|
||||
| 19.0.0 | 2022-Mar-31 | 2022-Apr-26 | 2022-May-24 | TBD | M102 | v16.14 | ✅ |
|
||||
| 18.0.0 | 2022-Feb-03 | 2022-Mar-03 | 2022-Mar-29 | 2022-Sep-27 | M100 | v16.13 | 🚫 |
|
||||
| 17.0.0 | 2021-Nov-18 | 2022-Jan-06 | 2022-Feb-01 | 2022-Aug-02 | M98 | v16.13 | 🚫 |
|
||||
| 16.0.0 | 2021-Sep-23 | 2021-Oct-20 | 2021-Nov-16 | 2022-May-24 | M96 | v16.9 | 🚫 |
|
||||
| 15.0.0 | 2021-Jul-20 | 2021-Sep-01 | 2021-Sep-21 | 2022-May-24 | M94 | v16.5 | 🚫 |
|
||||
| 14.0.0 | -- | 2021-May-27 | 2021-Aug-31 | 2022-Mar-29 | M93 | v14.17 | 🚫 |
|
||||
| 13.0.0 | -- | 2021-Mar-04 | 2021-May-25 | 2022-Feb-01 | M91 | v14.16 | 🚫 |
|
||||
| 12.0.0 | -- | 2020-Nov-19 | 2021-Mar-02 | 2021-Nov-16 | M89 | v14.16 | 🚫 |
|
||||
| 11.0.0 | -- | 2020-Aug-27 | 2020-Nov-17 | 2021-Aug-31 | M87 | v12.18 | 🚫 |
|
||||
| 10.0.0 | -- | 2020-May-21 | 2020-Aug-25 | 2021-May-25 | M85 | v12.16 | 🚫 |
|
||||
| 9.0.0 | -- | 2020-Feb-06 | 2020-May-19 | 2021-Mar-02 | M83 | v12.14 | 🚫 |
|
||||
| 8.0.0 | -- | 2019-Oct-24 | 2020-Feb-04 | 2020-Nov-17 | M80 | v12.13 | 🚫 |
|
||||
| 7.0.0 | -- | 2019-Aug-01 | 2019-Oct-22 | 2020-Aug-25 | M78 | v12.8 | 🚫 |
|
||||
| 6.0.0 | -- | 2019-Apr-25 | 2019-Jul-30 | 2020-May-19 | M76 | v12.14.0 | 🚫 |
|
||||
| 5.0.0 | -- | 2019-Jan-22 | 2019-Apr-23 | 2020-Feb-04 | M73 | v12.0 | 🚫 |
|
||||
| 4.0.0 | -- | 2018-Oct-11 | 2018-Dec-20 | 2019-Oct-22 | M69 | v10.11 | 🚫 |
|
||||
| 3.0.0 | -- | 2018-Jun-21 | 2018-Sep-18 | 2019-Jul-30 | M66 | v10.2 | 🚫 |
|
||||
| 2.0.0 | -- | 2018-Feb-21 | 2018-May-01 | 2019-Apr-23 | M61 | v8.9 | 🚫 |
|
||||
|
||||
**Notes:**
|
||||
|
||||
|
||||
@@ -354,6 +354,7 @@ filenames = {
|
||||
"shell/browser/child_web_contents_tracker.h",
|
||||
"shell/browser/cookie_change_notifier.cc",
|
||||
"shell/browser/cookie_change_notifier.h",
|
||||
"shell/browser/draggable_region_provider.h",
|
||||
"shell/browser/electron_api_ipc_handler_impl.cc",
|
||||
"shell/browser/electron_api_ipc_handler_impl.h",
|
||||
"shell/browser/electron_autofill_driver.cc",
|
||||
@@ -665,8 +666,6 @@ filenames = {
|
||||
"shell/renderer/electron_render_frame_observer.h",
|
||||
"shell/renderer/electron_renderer_client.cc",
|
||||
"shell/renderer/electron_renderer_client.h",
|
||||
"shell/renderer/electron_renderer_pepper_host_factory.cc",
|
||||
"shell/renderer/electron_renderer_pepper_host_factory.h",
|
||||
"shell/renderer/electron_sandboxed_renderer_client.cc",
|
||||
"shell/renderer/electron_sandboxed_renderer_client.h",
|
||||
"shell/renderer/renderer_client_base.cc",
|
||||
|
||||
@@ -82,6 +82,7 @@ BrowserWindow::BrowserWindow(gin::Arguments* args,
|
||||
gin::Handle<WebContentsView> web_contents_view =
|
||||
WebContentsView::Create(isolate, web_preferences);
|
||||
DCHECK(web_contents_view.get());
|
||||
window_->AddDraggableRegionProvider(web_contents_view.get());
|
||||
|
||||
// Save a reference of the WebContents.
|
||||
gin::Handle<WebContents> web_contents =
|
||||
@@ -139,14 +140,6 @@ void BrowserWindow::OnRendererResponsive(content::RenderProcessHost*) {
|
||||
Emit("responsive");
|
||||
}
|
||||
|
||||
void BrowserWindow::OnDraggableRegionsUpdated(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) {
|
||||
if (window_->has_frame())
|
||||
return;
|
||||
|
||||
window_->UpdateDraggableRegions(regions);
|
||||
}
|
||||
|
||||
void BrowserWindow::OnSetContentBounds(const gfx::Rect& rect) {
|
||||
// window.resizeTo(...)
|
||||
// window.moveTo(...)
|
||||
|
||||
@@ -50,8 +50,6 @@ class BrowserWindow : public BaseWindow,
|
||||
void WebContentsDestroyed() override;
|
||||
|
||||
// ExtendedWebContentsObserver:
|
||||
void OnDraggableRegionsUpdated(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) override;
|
||||
void OnSetContentBounds(const gfx::Rect& rect) override;
|
||||
void OnActivateContents() override;
|
||||
void OnPageTitleUpdated(const std::u16string& title,
|
||||
@@ -87,10 +85,6 @@ class BrowserWindow : public BaseWindow,
|
||||
private:
|
||||
// Helpers.
|
||||
|
||||
// Called when the window needs to update its draggable region.
|
||||
void UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions);
|
||||
|
||||
// Schedule a notification unresponsive event.
|
||||
void ScheduleUnresponsiveEvent(int ms);
|
||||
|
||||
|
||||
@@ -1850,8 +1850,7 @@ void WebContents::MessageHost(const std::string& channel,
|
||||
|
||||
void WebContents::UpdateDraggableRegions(
|
||||
std::vector<mojom::DraggableRegionPtr> regions) {
|
||||
for (ExtendedWebContentsObserver& observer : observers_)
|
||||
observer.OnDraggableRegionsUpdated(regions);
|
||||
draggable_region_ = DraggableRegionsToSkRegion(regions);
|
||||
}
|
||||
|
||||
void WebContents::DidStartNavigation(
|
||||
|
||||
@@ -77,6 +77,8 @@ class Arguments;
|
||||
|
||||
class ExclusiveAccessManager;
|
||||
|
||||
class SkRegion;
|
||||
|
||||
namespace electron {
|
||||
|
||||
class ElectronBrowserContext;
|
||||
@@ -441,6 +443,7 @@ class WebContents : public ExclusiveAccessContext,
|
||||
void OnInputEvent(const blink::WebInputEvent& event) override;
|
||||
|
||||
void SetBackgroundColor(absl::optional<SkColor> color);
|
||||
SkRegion* draggable_region() { return draggable_region_.get(); }
|
||||
|
||||
// disable copy
|
||||
WebContents(const WebContents&) = delete;
|
||||
@@ -823,6 +826,8 @@ class WebContents : public ExclusiveAccessContext,
|
||||
// Stores the frame thats currently in fullscreen, nullptr if there is none.
|
||||
content::RenderFrameHost* fullscreen_frame_ = nullptr;
|
||||
|
||||
std::unique_ptr<SkRegion> draggable_region_;
|
||||
|
||||
base::WeakPtrFactory<WebContents> weak_factory_{this};
|
||||
};
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include "shell/common/gin_helper/dictionary.h"
|
||||
#include "shell/common/gin_helper/object_template_builder.h"
|
||||
#include "shell/common/node_includes.h"
|
||||
#include "third_party/skia/include/core/SkRegion.h"
|
||||
#include "ui/base/hit_test.h"
|
||||
#include "ui/views/layout/flex_layout_types.h"
|
||||
#include "ui/views/view_class_properties.h"
|
||||
|
||||
@@ -74,6 +76,15 @@ void WebContentsView::SetBackgroundColor(absl::optional<WrappedSkColor> color) {
|
||||
}
|
||||
}
|
||||
|
||||
int WebContentsView::NonClientHitTest(const gfx::Point& point) {
|
||||
gfx::Point local_point(point);
|
||||
views::View::ConvertPointFromWidget(view(), &local_point);
|
||||
SkRegion* region = api_web_contents_->draggable_region();
|
||||
if (region && region->contains(local_point.x(), local_point.y()))
|
||||
return HTCAPTION;
|
||||
return HTNOWHERE;
|
||||
}
|
||||
|
||||
void WebContentsView::WebContentsDestroyed() {
|
||||
api_web_contents_ = nullptr;
|
||||
web_contents_.Reset();
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "content/public/browser/web_contents_observer.h"
|
||||
#include "shell/browser/api/electron_api_view.h"
|
||||
#include "shell/browser/draggable_region_provider.h"
|
||||
|
||||
namespace gin_helper {
|
||||
class Dictionary;
|
||||
@@ -16,7 +17,9 @@ namespace electron::api {
|
||||
|
||||
class WebContents;
|
||||
|
||||
class WebContentsView : public View, public content::WebContentsObserver {
|
||||
class WebContentsView : public View,
|
||||
public content::WebContentsObserver,
|
||||
public DraggableRegionProvider {
|
||||
public:
|
||||
// Create a new instance of WebContentsView.
|
||||
static gin::Handle<WebContentsView> Create(
|
||||
@@ -34,6 +37,8 @@ class WebContentsView : public View, public content::WebContentsObserver {
|
||||
gin::Handle<WebContents> GetWebContents(v8::Isolate* isolate);
|
||||
void SetBackgroundColor(absl::optional<WrappedSkColor> color);
|
||||
|
||||
int NonClientHitTest(const gfx::Point& point) override;
|
||||
|
||||
protected:
|
||||
// Takes an existing WebContents.
|
||||
WebContentsView(v8::Isolate* isolate, gin::Handle<WebContents> web_contents);
|
||||
|
||||
13
shell/browser/draggable_region_provider.h
Normal file
13
shell/browser/draggable_region_provider.h
Normal file
@@ -0,0 +1,13 @@
|
||||
// Copyright (c) 2022 Salesforce, Inc.
|
||||
// Use of this source code is governed by the MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef ELECTRON_SHELL_BROWSER_DRAGGABLE_REGION_PROVIDER_H_
|
||||
#define ELECTRON_SHELL_BROWSER_DRAGGABLE_REGION_PROVIDER_H_
|
||||
|
||||
class DraggableRegionProvider {
|
||||
public:
|
||||
virtual int NonClientHitTest(const gfx::Point& point) = 0;
|
||||
};
|
||||
|
||||
#endif // ELECTRON_SHELL_BROWSER_DRAGGABLE_REGION_PROVIDER_H_
|
||||
117
shell/browser/native_browser_view_mac.mm
Normal file
117
shell/browser/native_browser_view_mac.mm
Normal file
@@ -0,0 +1,117 @@
|
||||
// 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 "shell/browser/native_browser_view_mac.h"
|
||||
|
||||
#include "shell/browser/ui/inspectable_web_contents.h"
|
||||
#include "shell/browser/ui/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 electron {
|
||||
|
||||
NativeBrowserViewMac::NativeBrowserViewMac(
|
||||
InspectableWebContents* inspectable_web_contents)
|
||||
: NativeBrowserView(inspectable_web_contents) {
|
||||
auto* iwc_view = GetInspectableWebContentsView();
|
||||
if (!iwc_view)
|
||||
return;
|
||||
auto* view = iwc_view->GetNativeView().GetNativeNSView();
|
||||
view.autoresizingMask = kDefaultAutoResizingMask;
|
||||
}
|
||||
|
||||
NativeBrowserViewMac::~NativeBrowserViewMac() = default;
|
||||
|
||||
void NativeBrowserViewMac::SetAutoResizeFlags(uint8_t flags) {
|
||||
NSAutoresizingMaskOptions autoresizing_mask = kDefaultAutoResizingMask;
|
||||
if (flags & kAutoResizeWidth) {
|
||||
autoresizing_mask |= NSViewWidthSizable;
|
||||
}
|
||||
if (flags & kAutoResizeHeight) {
|
||||
autoresizing_mask |= NSViewHeightSizable;
|
||||
}
|
||||
if (flags & kAutoResizeHorizontal) {
|
||||
autoresizing_mask |=
|
||||
NSViewMaxXMargin | NSViewMinXMargin | NSViewWidthSizable;
|
||||
}
|
||||
if (flags & kAutoResizeVertical) {
|
||||
autoresizing_mask |=
|
||||
NSViewMaxYMargin | NSViewMinYMargin | NSViewHeightSizable;
|
||||
}
|
||||
|
||||
auto* iwc_view = GetInspectableWebContentsView();
|
||||
if (!iwc_view)
|
||||
return;
|
||||
auto* view = iwc_view->GetNativeView().GetNativeNSView();
|
||||
view.autoresizingMask = autoresizing_mask;
|
||||
}
|
||||
|
||||
void NativeBrowserViewMac::SetBounds(const gfx::Rect& bounds) {
|
||||
auto* iwc_view = GetInspectableWebContentsView();
|
||||
if (!iwc_view)
|
||||
return;
|
||||
auto* view = iwc_view->GetNativeView().GetNativeNSView();
|
||||
auto* superview = view.superview;
|
||||
const auto superview_height = superview ? superview.frame.size.height : 0;
|
||||
|
||||
// We need to use the content rect to calculate the titlebar height if the
|
||||
// superview is an framed NSWindow, otherwise it will be offset incorrectly by
|
||||
// the height of the titlebar.
|
||||
auto titlebar_height = 0;
|
||||
if (auto* win = [superview window]) {
|
||||
const auto content_rect_height =
|
||||
[win contentRectForFrameRect:superview.frame].size.height;
|
||||
titlebar_height = superview_height - content_rect_height;
|
||||
}
|
||||
|
||||
auto new_height =
|
||||
superview_height - bounds.y() - bounds.height() + titlebar_height;
|
||||
view.frame =
|
||||
NSMakeRect(bounds.x(), new_height, bounds.width(), bounds.height());
|
||||
}
|
||||
|
||||
gfx::Rect NativeBrowserViewMac::GetBounds() {
|
||||
auto* iwc_view = GetInspectableWebContentsView();
|
||||
if (!iwc_view)
|
||||
return gfx::Rect();
|
||||
NSView* view = iwc_view->GetNativeView().GetNativeNSView();
|
||||
auto* superview = view.superview;
|
||||
const int superview_height = superview ? superview.frame.size.height : 0;
|
||||
|
||||
// We need to use the content rect to calculate the titlebar height if the
|
||||
// superview is an framed NSWindow, otherwise it will be offset incorrectly by
|
||||
// the height of the titlebar.
|
||||
auto titlebar_height = 0;
|
||||
if (auto* win = [superview window]) {
|
||||
const auto content_rect_height =
|
||||
[win contentRectForFrameRect:superview.frame].size.height;
|
||||
titlebar_height = superview_height - content_rect_height;
|
||||
}
|
||||
|
||||
auto new_height = superview_height - view.frame.origin.y -
|
||||
view.frame.size.height + titlebar_height;
|
||||
return gfx::Rect(view.frame.origin.x, new_height, view.frame.size.width,
|
||||
view.frame.size.height);
|
||||
}
|
||||
|
||||
void NativeBrowserViewMac::SetBackgroundColor(SkColor color) {
|
||||
auto* iwc_view = GetInspectableWebContentsView();
|
||||
if (!iwc_view)
|
||||
return;
|
||||
auto* view = iwc_view->GetNativeView().GetNativeNSView();
|
||||
view.wantsLayer = YES;
|
||||
view.layer.backgroundColor = skia::CGColorCreateFromSkColor(color);
|
||||
}
|
||||
|
||||
// static
|
||||
NativeBrowserView* NativeBrowserView::Create(
|
||||
InspectableWebContents* inspectable_web_contents) {
|
||||
return new NativeBrowserViewMac(inspectable_web_contents);
|
||||
}
|
||||
|
||||
} // namespace electron
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "shell/common/gin_helper/persistent_dictionary.h"
|
||||
#include "shell/common/options_switches.h"
|
||||
#include "third_party/skia/include/core/SkRegion.h"
|
||||
#include "ui/base/hit_test.h"
|
||||
#include "ui/views/widget/widget.h"
|
||||
|
||||
#if BUILDFLAG(IS_WIN)
|
||||
@@ -685,9 +686,28 @@ void NativeWindow::NotifyWindowMessage(UINT message,
|
||||
}
|
||||
#endif
|
||||
|
||||
void NativeWindow::UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) {
|
||||
draggable_region_ = DraggableRegionsToSkRegion(regions);
|
||||
int NativeWindow::NonClientHitTest(const gfx::Point& point) {
|
||||
for (auto* provider : draggable_region_providers_) {
|
||||
int hit = provider->NonClientHitTest(point);
|
||||
if (hit != HTNOWHERE)
|
||||
return hit;
|
||||
}
|
||||
return HTNOWHERE;
|
||||
}
|
||||
|
||||
void NativeWindow::AddDraggableRegionProvider(
|
||||
DraggableRegionProvider* provider) {
|
||||
if (std::find(draggable_region_providers_.begin(),
|
||||
draggable_region_providers_.end(),
|
||||
provider) == draggable_region_providers_.end()) {
|
||||
draggable_region_providers_.push_back(provider);
|
||||
}
|
||||
}
|
||||
|
||||
void NativeWindow::RemoveDraggableRegionProvider(
|
||||
DraggableRegionProvider* provider) {
|
||||
draggable_region_providers_.remove_if(
|
||||
[&provider](DraggableRegionProvider* p) { return p == provider; });
|
||||
}
|
||||
|
||||
views::Widget* NativeWindow::GetWidget() {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "content/public/browser/desktop_media_id.h"
|
||||
#include "content/public/browser/web_contents_user_data.h"
|
||||
#include "extensions/browser/app_window/size_constraints.h"
|
||||
#include "shell/browser/draggable_region_provider.h"
|
||||
#include "shell/browser/native_window_observer.h"
|
||||
#include "shell/browser/ui/inspectable_web_contents_view.h"
|
||||
#include "shell/common/api/api.mojom.h"
|
||||
@@ -341,11 +342,6 @@ class NativeWindow : public base::SupportsUserData,
|
||||
return fullscreen_transition_type_;
|
||||
}
|
||||
|
||||
SkRegion const* draggable_region() const { return draggable_region_.get(); }
|
||||
|
||||
void UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions);
|
||||
|
||||
views::Widget* widget() const { return widget_.get(); }
|
||||
views::View* content_view() const { return content_view_; }
|
||||
|
||||
@@ -372,12 +368,12 @@ class NativeWindow : public base::SupportsUserData,
|
||||
NativeWindow* parent() const { return parent_; }
|
||||
bool is_modal() const { return is_modal_; }
|
||||
|
||||
std::list<InspectableWebContentsView*> inspectable_views() const {
|
||||
return inspectable_views_;
|
||||
}
|
||||
|
||||
int32_t window_id() const { return next_id_; }
|
||||
|
||||
int NonClientHitTest(const gfx::Point& point);
|
||||
void AddDraggableRegionProvider(DraggableRegionProvider* provider);
|
||||
void RemoveDraggableRegionProvider(DraggableRegionProvider* provider);
|
||||
|
||||
protected:
|
||||
friend class api::BrowserView;
|
||||
|
||||
@@ -390,16 +386,6 @@ class NativeWindow : public base::SupportsUserData,
|
||||
|
||||
void set_content_view(views::View* view) { content_view_ = view; }
|
||||
|
||||
void add_inspectable_view(InspectableWebContentsView* inspectable_view) {
|
||||
inspectable_views_.push_back(inspectable_view);
|
||||
}
|
||||
void remove_inspectable_view(InspectableWebContentsView* inspectable_view) {
|
||||
inspectable_views_.remove_if(
|
||||
[&inspectable_view](InspectableWebContentsView* n) {
|
||||
return (n == inspectable_view);
|
||||
});
|
||||
}
|
||||
|
||||
// The boolean parsing of the "titleBarOverlay" option
|
||||
bool titlebar_overlay_ = false;
|
||||
|
||||
@@ -460,8 +446,7 @@ class NativeWindow : public base::SupportsUserData,
|
||||
// Is this a modal window.
|
||||
bool is_modal_ = false;
|
||||
|
||||
// The inspectable webContents views.
|
||||
std::list<InspectableWebContentsView*> inspectable_views_;
|
||||
std::list<DraggableRegionProvider*> draggable_region_providers_;
|
||||
|
||||
// Observers of this window.
|
||||
base::ObserverList<NativeWindowObserver> observers_;
|
||||
@@ -471,10 +456,6 @@ class NativeWindow : public base::SupportsUserData,
|
||||
|
||||
gfx::Rect overlay_rect_;
|
||||
|
||||
// For custom drag, the whole window is non-draggable and the draggable region
|
||||
// has to been explicitly provided.
|
||||
std::unique_ptr<SkRegion> draggable_region_; // used in custom drag.
|
||||
|
||||
base::WeakPtrFactory<NativeWindow> weak_factory_{this};
|
||||
};
|
||||
|
||||
|
||||
@@ -1586,9 +1586,9 @@ class NativeAppWindowFrameViewMac : public views::NativeFrameViewMac {
|
||||
|
||||
// Check for possible draggable region in the client area for the frameless
|
||||
// window.
|
||||
SkRegion const* draggable_region = native_window_->draggable_region();
|
||||
if (draggable_region && draggable_region->contains(point.x(), point.y()))
|
||||
return HTCAPTION;
|
||||
int contents_hit_test = native_window_->NonClientHitTest(point);
|
||||
if (contents_hit_test != HTNOWHERE)
|
||||
return contents_hit_test;
|
||||
|
||||
return HTCLIENT;
|
||||
}
|
||||
|
||||
@@ -41,10 +41,6 @@ class InspectableWebContentsView {
|
||||
}
|
||||
InspectableWebContentsViewDelegate* GetDelegate() const { return delegate_; }
|
||||
|
||||
const std::vector<mojom::DraggableRegionPtr>& GetDraggableRegions() const {
|
||||
return draggable_regions_;
|
||||
}
|
||||
|
||||
#if defined(TOOLKIT_VIEWS) && !BUILDFLAG(IS_MAC)
|
||||
// Returns the container control, which has devtools view attached.
|
||||
virtual views::View* GetView() = 0;
|
||||
@@ -66,16 +62,10 @@ class InspectableWebContentsView {
|
||||
const DevToolsContentsResizingStrategy& strategy) = 0;
|
||||
virtual void SetTitle(const std::u16string& title) = 0;
|
||||
|
||||
// Called when the window needs to update its draggable region.
|
||||
virtual void UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) = 0;
|
||||
|
||||
protected:
|
||||
// Owns us.
|
||||
InspectableWebContents* inspectable_web_contents_;
|
||||
|
||||
std::vector<mojom::DraggableRegionPtr> draggable_regions_;
|
||||
|
||||
private:
|
||||
InspectableWebContentsViewDelegate* delegate_ = nullptr; // weak references.
|
||||
};
|
||||
|
||||
@@ -34,8 +34,6 @@ class InspectableWebContentsViewMac : public InspectableWebContentsView {
|
||||
void SetContentsResizingStrategy(
|
||||
const DevToolsContentsResizingStrategy& strategy) override;
|
||||
void SetTitle(const std::u16string& title) override;
|
||||
void UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) override;
|
||||
|
||||
private:
|
||||
base::scoped_nsobject<ElectronInspectableWebContentsView> view_;
|
||||
|
||||
@@ -267,65 +267,4 @@ void InspectableWebContentsViewMac::SetTitle(const std::u16string& title) {
|
||||
[view_ setTitle:base::SysUTF16ToNSString(title)];
|
||||
}
|
||||
|
||||
void InspectableWebContentsViewMac::UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) {
|
||||
auto* web_contents = inspectable_web_contents()->GetWebContents();
|
||||
NSView* web_view = web_contents->GetNativeView().GetNativeNSView();
|
||||
NSView* inspectable_view = GetNativeView().GetNativeNSView();
|
||||
NSView* inspectable_superview = inspectable_view.superview;
|
||||
|
||||
NSInteger webViewWidth = NSWidth([web_view bounds]);
|
||||
NSInteger webViewHeight = NSHeight([web_view bounds]);
|
||||
|
||||
// Draggable regions are implemented by having the whole web view draggable
|
||||
// and overlaying regions that are not draggable.
|
||||
if (&draggable_regions_ != ®ions)
|
||||
draggable_regions_ = mojo::Clone(regions);
|
||||
|
||||
std::vector<gfx::Rect> drag_exclude_rects;
|
||||
if (draggable_regions_.empty()) {
|
||||
drag_exclude_rects.emplace_back(0, 0, webViewWidth, webViewHeight);
|
||||
} else {
|
||||
drag_exclude_rects = CalculateNonDraggableRegions(
|
||||
DraggableRegionsToSkRegion(draggable_regions_), webViewWidth,
|
||||
webViewHeight);
|
||||
}
|
||||
|
||||
// Remove all DragRegionViews that were added last time. Note that we need
|
||||
// to copy the `subviews` array to avoid mutation during iteration.
|
||||
base::scoped_nsobject<NSArray> subviews([[web_view subviews] copy]);
|
||||
for (NSView* subview in subviews.get()) {
|
||||
if ([subview isKindOfClass:[DragRegionView class]])
|
||||
[subview removeFromSuperview];
|
||||
}
|
||||
|
||||
// Create one giant NSView that is draggable.
|
||||
base::scoped_nsobject<NSView> drag_region_view(
|
||||
[[DragRegionView alloc] initWithFrame:web_view.bounds]);
|
||||
[web_view addSubview:drag_region_view];
|
||||
|
||||
// Then, on top of that, add "exclusion zones".
|
||||
const int superview_height =
|
||||
(inspectable_superview) ? inspectable_superview.frame.size.height : 0;
|
||||
if (!inspectable_superview)
|
||||
inspectable_superview = inspectable_view;
|
||||
const int offset_x = inspectable_view.frame.origin.x;
|
||||
const int offset_y = superview_height - inspectable_view.frame.origin.y -
|
||||
inspectable_view.frame.size.height;
|
||||
for (const auto& rect : drag_exclude_rects) {
|
||||
const auto x = rect.x() + offset_x;
|
||||
const auto y = superview_height - (rect.bottom() + offset_y);
|
||||
const auto exclude_rect = NSMakeRect(x, y, rect.width(), rect.height());
|
||||
|
||||
const auto drag_region_view_exclude_rect =
|
||||
[inspectable_superview convertRect:exclude_rect
|
||||
toView:drag_region_view];
|
||||
|
||||
base::scoped_nsobject<NSView> exclude_drag_region_view(
|
||||
[[ExcludeDragRegionView alloc]
|
||||
initWithFrame:drag_region_view_exclude_rect]);
|
||||
[drag_region_view addSubview:exclude_drag_region_view];
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace electron
|
||||
|
||||
@@ -79,26 +79,15 @@ int FramelessView::NonClientHitTest(const gfx::Point& cursor) {
|
||||
if (frame_->IsFullscreen())
|
||||
return HTCLIENT;
|
||||
|
||||
// Check attached BrowserViews for potential draggable areas.
|
||||
for (auto* view : window_->inspectable_views()) {
|
||||
auto* inspectable_view =
|
||||
static_cast<InspectableWebContentsViewViews*>(view);
|
||||
if (inspectable_view->IsContainedInDraggableRegion(window_->content_view(),
|
||||
cursor))
|
||||
return HTCAPTION;
|
||||
}
|
||||
int contents_hit_test = window_->NonClientHitTest(point);
|
||||
if (contents_hit_test != HTNOWHERE)
|
||||
return contents_hit_test;
|
||||
|
||||
// Support resizing frameless window by dragging the border.
|
||||
int frame_component = ResizingBorderHitTest(cursor);
|
||||
if (frame_component != HTNOWHERE)
|
||||
return frame_component;
|
||||
|
||||
// Check for possible draggable region in the client area for the frameless
|
||||
// window.
|
||||
const SkRegion* draggable_region = window_->draggable_region();
|
||||
if (draggable_region && draggable_region->contains(cursor.x(), cursor.y()))
|
||||
return HTCAPTION;
|
||||
|
||||
return HTCLIENT;
|
||||
}
|
||||
|
||||
|
||||
@@ -105,19 +105,6 @@ InspectableWebContentsViewViews::~InspectableWebContentsViewViews() {
|
||||
devtools_window_->GetWindowBoundsInScreen());
|
||||
}
|
||||
|
||||
bool InspectableWebContentsViewViews::IsContainedInDraggableRegion(
|
||||
views::View* root_view,
|
||||
const gfx::Point& location) {
|
||||
if (!draggable_region_.get())
|
||||
return false;
|
||||
// Draggable regions are defined relative to the web contents.
|
||||
gfx::Point point_in_contents_web_view_coords(location);
|
||||
views::View::ConvertPointToTarget(root_view, this,
|
||||
&point_in_contents_web_view_coords);
|
||||
return draggable_region_->contains(point_in_contents_web_view_coords.x(),
|
||||
point_in_contents_web_view_coords.y());
|
||||
}
|
||||
|
||||
views::View* InspectableWebContentsViewViews::GetView() {
|
||||
return this;
|
||||
}
|
||||
@@ -227,14 +214,6 @@ void InspectableWebContentsViewViews::SetTitle(const std::u16string& title) {
|
||||
}
|
||||
}
|
||||
|
||||
void InspectableWebContentsViewViews::UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) {
|
||||
if (&draggable_regions_ == ®ions)
|
||||
return;
|
||||
draggable_regions_ = mojo::Clone(regions);
|
||||
draggable_region_ = DraggableRegionsToSkRegion(draggable_regions_);
|
||||
}
|
||||
|
||||
void InspectableWebContentsViewViews::Layout() {
|
||||
if (!devtools_web_view_->GetVisible()) {
|
||||
contents_web_view_->SetBoundsRect(GetContentsBounds());
|
||||
|
||||
@@ -29,9 +29,6 @@ class InspectableWebContentsViewViews : public InspectableWebContentsView,
|
||||
InspectableWebContents* inspectable_web_contents);
|
||||
~InspectableWebContentsViewViews() override;
|
||||
|
||||
bool IsContainedInDraggableRegion(views::View* root_view,
|
||||
const gfx::Point& location);
|
||||
|
||||
// InspectableWebContentsView:
|
||||
views::View* GetView() override;
|
||||
views::View* GetWebView() override;
|
||||
@@ -43,8 +40,6 @@ class InspectableWebContentsViewViews : public InspectableWebContentsView,
|
||||
void SetContentsResizingStrategy(
|
||||
const DevToolsContentsResizingStrategy& strategy) override;
|
||||
void SetTitle(const std::u16string& title) override;
|
||||
void UpdateDraggableRegions(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) override;
|
||||
|
||||
// views::View:
|
||||
void Layout() override;
|
||||
@@ -61,8 +56,6 @@ class InspectableWebContentsViewViews : public InspectableWebContentsView,
|
||||
bool devtools_visible_ = false;
|
||||
views::WidgetDelegate* devtools_window_delegate_ = nullptr;
|
||||
std::u16string title_;
|
||||
|
||||
std::unique_ptr<SkRegion> draggable_region_;
|
||||
};
|
||||
|
||||
} // namespace electron
|
||||
|
||||
@@ -1665,9 +1665,7 @@ describe('webContents module', () => {
|
||||
});
|
||||
});
|
||||
|
||||
// TODO(jeremy): window.open() in a real browser passes the referrer, but
|
||||
// our hacked-up window.open() shim doesn't. It should.
|
||||
xit('propagates referrer information to windows opened with window.open', (done) => {
|
||||
it('propagates referrer information to windows opened with window.open', (done) => {
|
||||
const w = new BrowserWindow({ show: false });
|
||||
const server = http.createServer((req, res) => {
|
||||
if (req.url === '/should_have_referrer') {
|
||||
@@ -1685,7 +1683,7 @@ describe('webContents module', () => {
|
||||
w.webContents.once('did-finish-load', () => {
|
||||
w.webContents.setWindowOpenHandler(details => {
|
||||
expect(details.referrer.url).to.equal(url);
|
||||
expect(details.referrer.policy).to.equal('no-referrer-when-downgrade');
|
||||
expect(details.referrer.policy).to.equal('strict-origin-when-cross-origin');
|
||||
return { action: 'allow' };
|
||||
});
|
||||
w.webContents.executeJavaScript('window.open(location.href + "should_have_referrer")');
|
||||
|
||||
Reference in New Issue
Block a user