refactor: move draggable regions to WebContents (#36230)
This commit is contained in:
parent
2008c9a5d0
commit
184ac2b382
22 changed files with 96 additions and 202 deletions
|
@ -766,6 +766,7 @@ void BaseWindow::AddBrowserView(gin::Handle<BrowserView> browser_view) {
|
|||
}
|
||||
|
||||
window_->AddBrowserView(browser_view->view());
|
||||
window_->AddDraggableRegionProvider(browser_view.get());
|
||||
browser_view->SetOwnerWindow(this);
|
||||
browser_views_[browser_view->ID()].Reset(isolate(), browser_view.ToV8());
|
||||
}
|
||||
|
@ -775,6 +776,7 @@ void BaseWindow::RemoveBrowserView(gin::Handle<BrowserView> browser_view) {
|
|||
auto iter = browser_views_.find(browser_view->ID());
|
||||
if (iter != browser_views_.end()) {
|
||||
window_->RemoveBrowserView(browser_view->view());
|
||||
window_->RemoveDraggableRegionProvider(browser_view.get());
|
||||
browser_view->SetOwnerWindow(nullptr);
|
||||
iter->second.Reset();
|
||||
browser_views_.erase(iter);
|
||||
|
@ -1124,6 +1126,7 @@ void BaseWindow::ResetBrowserViews() {
|
|||
DCHECK_EQ(owner_window, this);
|
||||
browser_view->SetOwnerWindow(nullptr);
|
||||
window_->RemoveBrowserView(browser_view->view());
|
||||
window_->RemoveDraggableRegionProvider(browser_view.get());
|
||||
browser_view->SetOwnerWindow(nullptr);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "shell/common/gin_helper/object_template_builder.h"
|
||||
#include "shell/common/node_includes.h"
|
||||
#include "shell/common/options_switches.h"
|
||||
#include "ui/base/hit_test.h"
|
||||
#include "ui/gfx/geometry/rect.h"
|
||||
|
||||
namespace gin {
|
||||
|
@ -105,16 +106,16 @@ void BrowserView::SetOwnerWindow(BaseWindow* window) {
|
|||
if (web_contents())
|
||||
web_contents()->SetOwnerWindow(window ? window->window() : nullptr);
|
||||
|
||||
if (owner_window_.get()) {
|
||||
owner_window_->window()->remove_inspectable_view(
|
||||
view_->GetInspectableWebContentsView());
|
||||
}
|
||||
|
||||
owner_window_ = window ? window->GetWeakPtr() : nullptr;
|
||||
}
|
||||
|
||||
if (owner_window_.get() && view_->GetInspectableWebContentsView())
|
||||
owner_window_->window()->add_inspectable_view(
|
||||
view_->GetInspectableWebContentsView());
|
||||
int BrowserView::NonClientHitTest(const gfx::Point& point) {
|
||||
gfx::Rect bounds = GetBounds();
|
||||
gfx::Point local_point(point.x() - bounds.x(), point.y() - bounds.y());
|
||||
SkRegion* region = api_web_contents_->draggable_region();
|
||||
if (region && region->contains(local_point.x(), local_point.y()))
|
||||
return HTCAPTION;
|
||||
return HTNOWHERE;
|
||||
}
|
||||
|
||||
BrowserView::~BrowserView() {
|
||||
|
@ -130,14 +131,6 @@ void BrowserView::WebContentsDestroyed() {
|
|||
Unpin();
|
||||
}
|
||||
|
||||
void BrowserView::OnDraggableRegionsUpdated(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) {
|
||||
InspectableWebContentsView* iwc_view = view_->GetInspectableWebContentsView();
|
||||
if (!iwc_view)
|
||||
return;
|
||||
iwc_view->UpdateDraggableRegions(regions);
|
||||
}
|
||||
|
||||
// static
|
||||
gin::Handle<BrowserView> BrowserView::New(gin_helper::ErrorThrower thrower,
|
||||
gin::Arguments* args) {
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "content/public/browser/web_contents_observer.h"
|
||||
#include "gin/handle.h"
|
||||
#include "gin/wrappable.h"
|
||||
#include "shell/browser/draggable_region_provider.h"
|
||||
#include "shell/browser/extended_web_contents_observer.h"
|
||||
#include "shell/browser/native_browser_view.h"
|
||||
#include "shell/browser/native_window.h"
|
||||
|
@ -37,7 +38,8 @@ class BrowserView : public gin::Wrappable<BrowserView>,
|
|||
public gin_helper::Constructible<BrowserView>,
|
||||
public gin_helper::Pinnable<BrowserView>,
|
||||
public content::WebContentsObserver,
|
||||
public ExtendedWebContentsObserver {
|
||||
public ExtendedWebContentsObserver,
|
||||
public DraggableRegionProvider {
|
||||
public:
|
||||
// gin_helper::Constructible
|
||||
static gin::Handle<BrowserView> New(gin_helper::ErrorThrower thrower,
|
||||
|
@ -58,6 +60,8 @@ class BrowserView : public gin::Wrappable<BrowserView>,
|
|||
|
||||
int32_t ID() const { return id_; }
|
||||
|
||||
int NonClientHitTest(const gfx::Point& point) override;
|
||||
|
||||
// disable copy
|
||||
BrowserView(const BrowserView&) = delete;
|
||||
BrowserView& operator=(const BrowserView&) = delete;
|
||||
|
@ -69,10 +73,6 @@ class BrowserView : public gin::Wrappable<BrowserView>,
|
|||
// content::WebContentsObserver:
|
||||
void WebContentsDestroyed() override;
|
||||
|
||||
// ExtendedWebContentsObserver:
|
||||
void OnDraggableRegionsUpdated(
|
||||
const std::vector<mojom::DraggableRegionPtr>& regions) override;
|
||||
|
||||
private:
|
||||
void SetAutoResize(AutoResizeFlags flags);
|
||||
void SetBounds(const gfx::Rect& bounds);
|
||||
|
|
|
@ -83,6 +83,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 =
|
||||
|
@ -146,14 +147,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(...)
|
||||
|
@ -204,8 +197,8 @@ void BrowserWindow::OnCloseButtonClicked(bool* prevent_default) {
|
|||
api_web_contents_->NotifyUserActivation();
|
||||
|
||||
// Trigger beforeunload events for associated BrowserViews.
|
||||
for (InspectableWebContentsView* view : window_->inspectable_views()) {
|
||||
auto* vwc = view->inspectable_web_contents()->GetWebContents();
|
||||
for (NativeBrowserView* view : window_->browser_views()) {
|
||||
auto* vwc = view->GetInspectableWebContents()->GetWebContents();
|
||||
auto* api_web_contents = api::WebContents::From(vwc);
|
||||
|
||||
// Required to make beforeunload handler work.
|
||||
|
|
|
@ -51,8 +51,6 @@ class BrowserWindow : public BaseWindow,
|
|||
|
||||
// ExtendedWebContentsObserver:
|
||||
void OnCloseContents() override;
|
||||
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,
|
||||
|
@ -90,10 +88,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);
|
||||
|
||||
|
|
|
@ -1875,8 +1875,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;
|
||||
|
@ -438,6 +440,8 @@ class WebContents : public ExclusiveAccessContext,
|
|||
// content::RenderWidgetHost::InputEventObserver:
|
||||
void OnInputEvent(const blink::WebInputEvent& event) override;
|
||||
|
||||
SkRegion* draggable_region() { return draggable_region_.get(); }
|
||||
|
||||
// disable copy
|
||||
WebContents(const WebContents&) = delete;
|
||||
WebContents& operator=(const WebContents&) = delete;
|
||||
|
@ -819,6 +823,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};
|
||||
};
|
||||
|
||||
|
|
|
@ -14,6 +14,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"
|
||||
|
||||
#if BUILDFLAG(IS_MAC)
|
||||
#include "shell/browser/ui/cocoa/delayed_native_view_host.h"
|
||||
|
@ -50,6 +52,15 @@ gin::Handle<WebContents> WebContentsView::GetWebContents(v8::Isolate* isolate) {
|
|||
return gin::CreateHandle(isolate, api_web_contents_);
|
||||
}
|
||||
|
||||
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(
|
||||
|
@ -33,6 +36,8 @@ class WebContentsView : public View, public content::WebContentsObserver {
|
|||
// Public APIs.
|
||||
gin::Handle<WebContents> GetWebContents(v8::Isolate* isolate);
|
||||
|
||||
int NonClientHitTest(const gfx::Point& point) override;
|
||||
|
||||
protected:
|
||||
// Takes an existing WebContents.
|
||||
WebContentsView(v8::Isolate* isolate, gin::Handle<WebContents> web_contents);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue