Skip to content

Commit

Permalink
refactor: mojofy draggable regions (#18536)
Browse files Browse the repository at this point in the history
  • Loading branch information
nornagon committed Jun 3, 2019
1 parent 52c76d7 commit 0b25176
Show file tree
Hide file tree
Showing 17 changed files with 59 additions and 91 deletions.
36 changes: 15 additions & 21 deletions atom/browser/api/atom_api_browser_window.cc
Original file line number Diff line number Diff line change
Expand Up @@ -170,17 +170,6 @@ void BrowserWindow::OnRendererUnresponsive(content::RenderProcessHost*) {
ScheduleUnresponsiveEvent(50);
}

bool BrowserWindow::OnMessageReceived(const IPC::Message& message,
content::RenderFrameHost* rfh) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(BrowserWindow, message, rfh)
IPC_MESSAGE_HANDLER(AtomFrameHostMsg_UpdateDraggableRegions,
UpdateDraggableRegions)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}

void BrowserWindow::OnCloseContents() {
// On some machines it may happen that the window gets destroyed for twice,
// checking web_contents() can effectively guard against that.
Expand Down Expand Up @@ -216,6 +205,11 @@ void BrowserWindow::OnRendererResponsive() {
Emit("responsive");
}

void BrowserWindow::OnDraggableRegionsUpdated(
const std::vector<mojom::DraggableRegionPtr>& regions) {
UpdateDraggableRegions(regions);
}

void BrowserWindow::RequestPreferredWidth(int* width) {
*width = web_contents()->GetPreferredSize().width();
}
Expand Down Expand Up @@ -276,7 +270,7 @@ void BrowserWindow::OnWindowFocus() {
void BrowserWindow::OnWindowResize() {
#if defined(OS_MACOSX)
if (!draggable_regions_.empty())
UpdateDraggableRegions(nullptr, draggable_regions_);
UpdateDraggableRegions(draggable_regions_);
#endif
TopLevelWindow::OnWindowResize();
}
Expand Down Expand Up @@ -314,28 +308,28 @@ void BrowserWindow::SetBrowserView(v8::Local<v8::Value> value) {
TopLevelWindow::ResetBrowserViews();
TopLevelWindow::AddBrowserView(value);
#if defined(OS_MACOSX)
UpdateDraggableRegions(nullptr, draggable_regions_);
UpdateDraggableRegions(draggable_regions_);
#endif
}

void BrowserWindow::AddBrowserView(v8::Local<v8::Value> value) {
TopLevelWindow::AddBrowserView(value);
#if defined(OS_MACOSX)
UpdateDraggableRegions(nullptr, draggable_regions_);
UpdateDraggableRegions(draggable_regions_);
#endif
}

void BrowserWindow::RemoveBrowserView(v8::Local<v8::Value> value) {
TopLevelWindow::RemoveBrowserView(value);
#if defined(OS_MACOSX)
UpdateDraggableRegions(nullptr, draggable_regions_);
UpdateDraggableRegions(draggable_regions_);
#endif
}

void BrowserWindow::ResetBrowserViews() {
TopLevelWindow::ResetBrowserViews();
#if defined(OS_MACOSX)
UpdateDraggableRegions(nullptr, draggable_regions_);
UpdateDraggableRegions(draggable_regions_);
#endif
}

Expand Down Expand Up @@ -377,13 +371,13 @@ v8::Local<v8::Value> BrowserWindow::GetWebContents(v8::Isolate* isolate) {

// Convert draggable regions in raw format to SkRegion format.
std::unique_ptr<SkRegion> BrowserWindow::DraggableRegionsToSkRegion(
const std::vector<DraggableRegion>& regions) {
const std::vector<mojom::DraggableRegionPtr>& regions) {
auto sk_region = std::make_unique<SkRegion>();
for (const DraggableRegion& region : regions) {
for (const auto& region : regions) {
sk_region->op(
region.bounds.x(), region.bounds.y(), region.bounds.right(),
region.bounds.bottom(),
region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
region->bounds.x(), region->bounds.y(), region->bounds.right(),
region->bounds.bottom(),
region->draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
}
return sk_region;
}
Expand Down
12 changes: 6 additions & 6 deletions atom/browser/api/atom_api_browser_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ class BrowserWindow : public TopLevelWindow,
void DidFirstVisuallyNonEmptyPaint() override;
void BeforeUnloadDialogCancelled() override;
void OnRendererUnresponsive(content::RenderProcessHost*) override;
bool OnMessageReceived(const IPC::Message& message,
content::RenderFrameHost* rfh) override;

// ExtendedWebContentsObserver:
void OnCloseContents() override;
void OnRendererResponsive() override;
void OnDraggableRegionsUpdated(
const std::vector<mojom::DraggableRegionPtr>& regions) override;

// NativeWindowObserver:
void RequestPreferredWidth(int* width) override;
Expand Down Expand Up @@ -91,12 +91,12 @@ class BrowserWindow : public TopLevelWindow,
// Helpers.

// Called when the window needs to update its draggable region.
void UpdateDraggableRegions(content::RenderFrameHost* rfh,
const std::vector<DraggableRegion>& regions);
void UpdateDraggableRegions(
const std::vector<mojom::DraggableRegionPtr>& regions);

// Convert draggable regions in raw format to SkRegion format.
std::unique_ptr<SkRegion> DraggableRegionsToSkRegion(
const std::vector<DraggableRegion>& regions);
const std::vector<mojom::DraggableRegionPtr>& regions);

// Schedule a notification unresponsive event.
void ScheduleUnresponsiveEvent(int ms);
Expand All @@ -112,7 +112,7 @@ class BrowserWindow : public TopLevelWindow,
base::CancelableClosure window_unresponsive_closure_;

#if defined(OS_MACOSX)
std::vector<DraggableRegion> draggable_regions_;
std::vector<mojom::DraggableRegionPtr> draggable_regions_;
#endif

v8::Global<v8::Value> web_contents_;
Expand Down
10 changes: 5 additions & 5 deletions atom/browser/api/atom_api_browser_window_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "atom/browser/native_browser_view.h"
#include "atom/browser/native_window_mac.h"
#include "atom/browser/ui/inspectable_web_contents_view.h"
#include "atom/common/draggable_region.h"
#include "base/mac/scoped_nsobject.h"

@interface NSView (WebContentsView)
Expand Down Expand Up @@ -76,8 +75,7 @@ - (NSView*)hitTest:(NSPoint)aPoint {
}

void BrowserWindow::UpdateDraggableRegions(
content::RenderFrameHost* rfh,
const std::vector<DraggableRegion>& regions) {
const std::vector<mojom::DraggableRegionPtr>& regions) {
if (window_->has_frame())
return;

Expand All @@ -103,7 +101,9 @@ - (NSView*)hitTest:(NSPoint)aPoint {

// Draggable regions is implemented by having the whole web view draggable
// (mouseDownCanMoveWindow) and overlaying regions that are not draggable.
draggable_regions_ = regions;
draggable_regions_.clear();
for (const auto& r : regions)
draggable_regions_.push_back(r.Clone());
std::vector<gfx::Rect> drag_exclude_rects;
if (regions.empty()) {
drag_exclude_rects.push_back(gfx::Rect(0, 0, webViewWidth, webViewHeight));
Expand All @@ -114,7 +114,7 @@ - (NSView*)hitTest:(NSPoint)aPoint {

auto browser_views = window_->browser_views();
for (NativeBrowserView* view : browser_views) {
(view)->UpdateDraggableRegions(drag_exclude_rects);
view->UpdateDraggableRegions(drag_exclude_rects);
}

// Create and add a ControlRegionView for each region that needs to be
Expand Down
3 changes: 1 addition & 2 deletions atom/browser/api/atom_api_browser_window_views.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ namespace atom {
namespace api {

void BrowserWindow::UpdateDraggableRegions(
content::RenderFrameHost* rfh,
const std::vector<DraggableRegion>& regions) {
const std::vector<mojom::DraggableRegionPtr>& regions) {
if (window_->has_frame())
return;
static_cast<NativeWindowViews*>(window_.get())
Expand Down
6 changes: 6 additions & 0 deletions atom/browser/api/atom_api_web_contents.cc
Original file line number Diff line number Diff line change
Expand Up @@ -964,6 +964,12 @@ void WebContents::MessageHost(const std::string& channel,
base::nullopt, channel, std::move(arguments));
}

void WebContents::UpdateDraggableRegions(
std::vector<mojom::DraggableRegionPtr> regions) {
for (ExtendedWebContentsObserver& observer : observers_)
observer.OnDraggableRegionsUpdated(regions);
}

void WebContents::RenderFrameDeleted(
content::RenderFrameHost* render_frame_host) {
// A RenderFrameHost can be destroyed before the related Mojo binding is
Expand Down
4 changes: 4 additions & 0 deletions atom/browser/api/atom_api_web_contents.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ class ExtendedWebContentsObserver : public base::CheckedObserver {
public:
virtual void OnCloseContents() {}
virtual void OnRendererResponsive() {}
virtual void OnDraggableRegionsUpdated(
const std::vector<mojom::DraggableRegionPtr>& regions) {}

protected:
~ExtendedWebContentsObserver() override {}
Expand Down Expand Up @@ -505,6 +507,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
const std::string& channel,
base::Value arguments) override;
void MessageHost(const std::string& channel, base::Value arguments) override;
void UpdateDraggableRegions(
std::vector<mojom::DraggableRegionPtr> regions) override;

// Called when we receive a CursorChange message from chromium.
void OnCursorChange(const content::WebCursor& cursor);
Expand Down
1 change: 0 additions & 1 deletion atom/browser/native_browser_view.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

#include <vector>

#include "atom/common/draggable_region.h"
#include "base/macros.h"
#include "content/public/browser/web_contents.h"
#include "third_party/skia/include/core/SkColor.h"
Expand Down
1 change: 0 additions & 1 deletion atom/browser/native_browser_view_mac.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
#include <vector>

#include "atom/browser/native_browser_view.h"
#include "atom/common/draggable_region.h"
#include "base/mac/scoped_nsobject.h"

namespace atom {
Expand Down
2 changes: 0 additions & 2 deletions atom/browser/native_window.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,6 @@ namespace atom {
class AtomMenuModel;
class NativeBrowserView;

struct DraggableRegion;

#if defined(OS_MACOSX)
typedef NSView* NativeWindowHandle;
#else
Expand Down
1 change: 0 additions & 1 deletion atom/browser/native_window_views.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include "atom/browser/web_view_manager.h"
#include "atom/browser/window_list.h"
#include "atom/common/atom_constants.h"
#include "atom/common/draggable_region.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/options_switches.h"
#include "base/strings/utf_string_conversions.h"
Expand Down
1 change: 1 addition & 0 deletions atom/common/api/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ mojom("mojo") {

public_deps = [
"//mojo/public/mojom/base",
"//ui/gfx/geometry/mojo",
]
}
9 changes: 9 additions & 0 deletions atom/common/api/api.mojom
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module atom.mojom;

import "mojo/public/mojom/base/values.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom";

interface ElectronRenderer {
Message(
Expand All @@ -13,6 +14,11 @@ interface ElectronRenderer {
TakeHeapSnapshot(handle file) => (bool success);
};

struct DraggableRegion {
bool draggable;
gfx.mojom.Rect bounds;
};

interface ElectronBrowser {
// Emits an event on |channel| from the ipcMain JavaScript object in the main
// process.
Expand Down Expand Up @@ -50,4 +56,7 @@ interface ElectronBrowser {
MessageHost(
string channel,
mojo_base.mojom.ListValue arguments);

UpdateDraggableRegions(
array<DraggableRegion> regions);
};
10 changes: 0 additions & 10 deletions atom/common/api/api_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

// Multiply-included file, no traditional include guard.

#include "atom/common/draggable_region.h"
#include "base/strings/string16.h"
#include "base/values.h"
#include "content/public/common/common_param_traits.h"
Expand All @@ -20,11 +19,6 @@

#define IPC_MESSAGE_START ElectronMsgStart

IPC_STRUCT_TRAITS_BEGIN(atom::DraggableRegion)
IPC_STRUCT_TRAITS_MEMBER(draggable)
IPC_STRUCT_TRAITS_MEMBER(bounds)
IPC_STRUCT_TRAITS_END()

IPC_MESSAGE_ROUTED3(AtomAutofillFrameHostMsg_ShowPopup,
gfx::RectF /* bounds */,
std::vector<base::string16> /* values */,
Expand All @@ -35,10 +29,6 @@ IPC_MESSAGE_ROUTED0(AtomAutofillFrameHostMsg_HidePopup)
IPC_MESSAGE_ROUTED1(AtomAutofillFrameMsg_AcceptSuggestion,
base::string16 /* suggestion */)

// Sent by the renderer when the draggable regions are updated.
IPC_MESSAGE_ROUTED1(AtomFrameHostMsg_UpdateDraggableRegions,
std::vector<atom::DraggableRegion> /* regions */)

// Update renderer process preferences.
IPC_MESSAGE_CONTROL1(AtomMsg_UpdatePreferences, base::ListValue)

Expand Down
11 changes: 0 additions & 11 deletions atom/common/draggable_region.cc

This file was deleted.

21 changes: 0 additions & 21 deletions atom/common/draggable_region.h

This file was deleted.

20 changes: 12 additions & 8 deletions atom/renderer/atom_render_frame_observer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "atom/renderer/atom_render_frame_observer.h"

#include <string>
#include <utility>
#include <vector>

#include "atom/common/api/api_messages.h"
Expand All @@ -19,11 +20,10 @@
#include "content/public/renderer/render_view.h"
#include "electron/atom/common/api/api.mojom.h"
#include "ipc/ipc_message_macros.h"
#include "mojo/public/cpp/bindings/associated_binding.h"
#include "native_mate/dictionary.h"
#include "net/base/net_module.h"
#include "net/grit/net_resources.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/platform/web_isolated_world_info.h"
#include "third_party/blink/public/web/blink.h"
#include "third_party/blink/public/web/web_document.h"
Expand Down Expand Up @@ -95,16 +95,20 @@ void AtomRenderFrameObserver::DidCreateScriptContext(
void AtomRenderFrameObserver::DraggableRegionsChanged() {
blink::WebVector<blink::WebDraggableRegion> webregions =
render_frame_->GetWebFrame()->GetDocument().DraggableRegions();
std::vector<DraggableRegion> regions;
std::vector<mojom::DraggableRegionPtr> regions;
for (auto& webregion : webregions) {
DraggableRegion region;
auto region = mojom::DraggableRegion::New();
render_frame_->GetRenderView()->ConvertViewportToWindowViaWidget(
&webregion.bounds);
region.bounds = webregion.bounds;
region.draggable = webregion.draggable;
regions.push_back(region);
region->bounds = webregion.bounds;
region->draggable = webregion.draggable;
regions.push_back(std::move(region));
}
Send(new AtomFrameHostMsg_UpdateDraggableRegions(routing_id(), regions));

mojom::ElectronBrowserPtr browser_ptr;
render_frame_->GetRemoteInterfaces()->GetInterface(
mojo::MakeRequest(&browser_ptr));
browser_ptr->UpdateDraggableRegions(std::move(regions));
}

void AtomRenderFrameObserver::WillReleaseScriptContext(
Expand Down
2 changes: 0 additions & 2 deletions filenames.gni
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,6 @@ filenames = {
"atom/common/crash_reporter/win/crash_service.h",
"atom/common/crash_reporter/win/crash_service_main.cc",
"atom/common/crash_reporter/win/crash_service_main.h",
"atom/common/draggable_region.cc",
"atom/common/draggable_region.h",
"atom/common/gin_util.h",
"atom/common/heap_snapshot.cc",
"atom/common/heap_snapshot.h",
Expand Down

0 comments on commit 0b25176

Please sign in to comment.