Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add frame to context-menu event params #31057

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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