Skip to content

Commit

Permalink
feat: add frame to context-menu event params (#31057)
Browse files Browse the repository at this point in the history
* feat: add frame to context-menu event params

* doc: rephrase frame description

Co-authored-by: samuelmaddock <samuel.maddock@gmail.com>
  • Loading branch information
trop[bot] and samuelmaddock committed Sep 22, 2021
1 parent cde7f04 commit d072d40
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 8 deletions.
1 change: 1 addition & 0 deletions docs/api/web-contents.md
Expand Up @@ -650,6 +650,7 @@ Returns:
* `params` Object
* `x` Integer - x coordinate.
* `y` Integer - y coordinate.
* `frame` WebFrameMain - Frame from which the context menu was invoked.
* `linkURL` String - URL of the link that encloses the node the context menu
was invoked on.
* `linkText` String - Text associated with the link. May be an empty
Expand Down
2 changes: 1 addition & 1 deletion shell/browser/api/electron_api_web_contents.cc
Expand Up @@ -1288,7 +1288,7 @@ void WebContents::RendererResponsive(

bool WebContents::HandleContextMenu(content::RenderFrameHost* render_frame_host,
const content::ContextMenuParams& params) {
Emit("context-menu", std::make_pair(params, web_contents()));
Emit("context-menu", std::make_pair(params, render_frame_host));

return true;
}
Expand Down
7 changes: 5 additions & 2 deletions shell/common/gin_converters/content_converter.cc
Expand Up @@ -13,6 +13,7 @@
#include "shell/browser/web_contents_permission_helper.h"
#include "shell/common/gin_converters/blink_converter.h"
#include "shell/common/gin_converters/callback_converter.h"
#include "shell/common/gin_converters/frame_converter.h"
#include "shell/common/gin_converters/gfx_converter.h"
#include "shell/common/gin_converters/gurl_converter.h"
#include "shell/common/gin_helper/dictionary.h"
Expand Down Expand Up @@ -73,11 +74,13 @@ v8::Local<v8::Value> Converter<blink::mojom::MenuItem::Type>::ToV8(
}

// static
v8::Local<v8::Value> Converter<ContextMenuParamsWithWebContents>::ToV8(
v8::Local<v8::Value> Converter<ContextMenuParamsWithRenderFrameHost>::ToV8(
v8::Isolate* isolate,
const ContextMenuParamsWithWebContents& val) {
const ContextMenuParamsWithRenderFrameHost& val) {
const auto& params = val.first;
content::RenderFrameHost* render_frame_host = val.second;
gin_helper::Dictionary dict = gin::Dictionary::CreateEmpty(isolate);
dict.SetGetter("frame", render_frame_host);
dict.Set("x", params.x);
dict.Set("y", params.y);
dict.Set("linkURL", params.link_url);
Expand Down
12 changes: 7 additions & 5 deletions shell/common/gin_converters/content_converter.h
Expand Up @@ -17,11 +17,12 @@
namespace content {
struct ContextMenuParams;
struct NativeWebKeyboardEvent;
class RenderFrameHost;
class WebContents;
} // namespace content

using ContextMenuParamsWithWebContents =
std::pair<content::ContextMenuParams, content::WebContents*>;
using ContextMenuParamsWithRenderFrameHost =
std::pair<content::ContextMenuParams, content::RenderFrameHost*>;

namespace gin {

Expand All @@ -32,9 +33,10 @@ struct Converter<blink::mojom::MenuItem::Type> {
};

template <>
struct Converter<ContextMenuParamsWithWebContents> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const ContextMenuParamsWithWebContents& val);
struct Converter<ContextMenuParamsWithRenderFrameHost> {
static v8::Local<v8::Value> ToV8(
v8::Isolate* isolate,
const ContextMenuParamsWithRenderFrameHost& val);
};

template <>
Expand Down
22 changes: 22 additions & 0 deletions spec-main/api-web-contents-spec.ts
Expand Up @@ -2056,6 +2056,28 @@ describe('webContents module', () => {
});
});

describe('context-menu event', () => {
afterEach(closeAllWindows);
it('emits when right-clicked in page', async () => {
const w = new BrowserWindow({ show: false });
await w.loadFile(path.join(fixturesPath, 'pages', 'base-page.html'));

const promise = emittedOnce(w.webContents, 'context-menu');

// Simulate right-click to create context-menu event.
const opts = { x: 0, y: 0, button: 'right' as any };
w.webContents.sendInputEvent({ ...opts, type: 'mouseDown' });
w.webContents.sendInputEvent({ ...opts, type: 'mouseUp' });

const [, params] = await promise;

expect(params.pageURL).to.equal(w.webContents.getURL());
expect(params.frame).to.be.an('object');
expect(params.x).to.be.a('number');
expect(params.y).to.be.a('number');
});
});

it('emits a cancelable event before creating a child webcontents', async () => {
const w = new BrowserWindow({
show: false,
Expand Down

0 comments on commit d072d40

Please sign in to comment.