Bug 1445240 - [1.0] Add element type to onContextMenu callback for image and media elements. r=snorp

This commit is contained in:
Eugen Sawin 2018-03-13 16:43:15 +01:00
parent bda3ae0619
commit 1f9570b937
6 changed files with 38 additions and 12 deletions

View File

@ -899,7 +899,7 @@ public abstract class GeckoApp extends GeckoActivity
@Override
public void onContextMenu(final GeckoSession session, final int screenX,
final int screenY, final String uri,
final String elementSrc) {
int elementType, final String elementSrc) {
}
protected void setFullScreen(final boolean fullscreen) {

View File

@ -704,7 +704,8 @@ public class CustomTabsActivity extends AppCompatActivity
@Override
public void onContextMenu(GeckoSession session, int screenX, int screenY,
final String uri, final String elementSrc) {
final String uri, int elementType,
final String elementSrc) {
final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
final Uri validUri = WebApps.getValidURL(content);

View File

@ -354,7 +354,7 @@ public class WebAppActivity extends AppCompatActivity
@Override // GeckoSession.ContentDelegate
public void onContextMenu(GeckoSession session, int screenX, int screenY,
String uri, String elementSrc) {
String uri, int elementType, String elementSrc) {
final String content = uri != null ? uri : elementSrc != null ? elementSrc : "";
final Uri validUri = WebApps.getValidURL(content);
if (validUri == null) {

View File

@ -136,19 +136,21 @@ class GeckoViewContent extends GeckoViewContentModule {
return node && node.href;
}
let node = aEvent.target;
let hrefNode = nearestParentHref(node);
let isImageNode = (ChromeUtils.getClassName(node) === "HTMLImageElement");
let isMediaNode = (ChromeUtils.getClassName(node) === "HTMLVideoElement" ||
ChromeUtils.getClassName(node) === "HTMLAudioElement");
const node = aEvent.target;
const hrefNode = nearestParentHref(node);
const elementType = ChromeUtils.getClassName(node);
const isImage = elementType === "HTMLImageElement";
const isMedia = elementType === "HTMLVideoElement" ||
elementType === "HTMLAudioElement";
if (hrefNode || isImageNode || isMediaNode) {
if (hrefNode || isImage || isMedia) {
this.eventDispatcher.sendRequest({
type: "GeckoView:ContextMenu",
screenX: aEvent.screenX,
screenY: aEvent.screenY,
uri: hrefNode,
elementSrc: isImageNode || isMediaNode
elementType,
elementSrc: (isImage || isMedia)
? node.currentSrc || node.src
: null
});

View File

@ -108,10 +108,14 @@ public class GeckoSession extends LayerSession
final EventCallback callback) {
if ("GeckoView:ContextMenu".equals(event)) {
final int type = getContentElementType(
message.getString("elementType"));
delegate.onContextMenu(GeckoSession.this,
message.getInt("screenX"),
message.getInt("screenY"),
message.getString("uri"),
type,
message.getString("elementSrc"));
} else if ("GeckoView:DOMTitleChanged".equals(event)) {
delegate.onTitleChange(GeckoSession.this,
@ -1418,7 +1422,23 @@ public class GeckoSession extends LayerSession
void onSecurityChange(GeckoSession session, SecurityInformation securityInfo);
}
private static int getContentElementType(final String name) {
if ("HTMLImageElement".equals(name)) {
return ContentDelegate.ELEMENT_TYPE_IMAGE;
} else if ("HTMLVideoElement".equals(name)) {
return ContentDelegate.ELEMENT_TYPE_VIDEO;
} else if ("HTMLAudioElement".equals(name)) {
return ContentDelegate.ELEMENT_TYPE_AUDIO;
}
return ContentDelegate.ELEMENT_TYPE_NONE;
}
public interface ContentDelegate {
static final int ELEMENT_TYPE_NONE = 0;
static final int ELEMENT_TYPE_IMAGE = 1;
static final int ELEMENT_TYPE_VIDEO = 2;
static final int ELEMENT_TYPE_AUDIO = 3;
/**
* A page title was discovered in the content or updated after the content
* loaded.
@ -1461,11 +1481,13 @@ public class GeckoSession extends LayerSession
* @param screenY The screen coordinates of the press.
* @param uri The URI of the pressed link, set for links and
* image-links.
* @param elementType The type of the pressed element.
* One of the {@link ContentDelegate#ELEMENT_TYPE_LINK} flags.
* @param elementSrc The source URI of the pressed element, set for
* (nested) images and media elements.
*/
void onContextMenu(GeckoSession session, int screenX, int screenY,
String uri, String elementSrc);
String uri, int elementTypes, String elementSrc);
}
/**

View File

@ -190,9 +190,10 @@ public class GeckoViewActivity extends Activity {
@Override
public void onContextMenu(GeckoSession session, int screenX, int screenY,
String uri, String elementSrc) {
String uri, int elementType, String elementSrc) {
Log.d(LOGTAG, "onContextMenu screenX=" + screenX +
" screenY=" + screenY + " uri=" + uri +
" elementType=" + elementType +
" elementSrc=" + elementSrc);
}
}