Commit 63cdb148 authored by Rouslan Solomakhin's avatar Rouslan Solomakhin Committed by Commit Bot

[Android] Expose origin of render frame host in Java.

Bug: 966507, 980641, 971339
Change-Id: I2ef7c051ba8b2cd9c6cc952743bfb3a55ab623ad
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1774322Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarTed Choc <tedchoc@chromium.org>
Commit-Queue: Rouslan Solomakhin <rouslan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701304}
parent 5cde5f16
...@@ -2425,6 +2425,7 @@ jumbo_source_set("browser") { ...@@ -2425,6 +2425,7 @@ jumbo_source_set("browser") {
"//ui/android", "//ui/android",
"//ui/compositor", "//ui/compositor",
"//ui/compositor/host", "//ui/compositor/host",
"//url:origin_android",
] ]
if (enable_vulkan) { if (enable_vulkan) {
deps += [ "//gpu/vulkan/init" ] deps += [ "//gpu/vulkan/init" ]
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "content/public/android/content_jni_headers/RenderFrameHostImpl_jni.h" #include "content/public/android/content_jni_headers/RenderFrameHostImpl_jni.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/site_instance.h" #include "content/public/browser/site_instance.h"
#include "url/origin.h"
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString; using base::android::ConvertUTF8ToJavaString;
...@@ -78,6 +79,12 @@ ScopedJavaLocalRef<jstring> RenderFrameHostAndroid::GetLastCommittedURL( ...@@ -78,6 +79,12 @@ ScopedJavaLocalRef<jstring> RenderFrameHostAndroid::GetLastCommittedURL(
env, render_frame_host_->GetLastCommittedURL().spec()); env, render_frame_host_->GetLastCommittedURL().spec());
} }
ScopedJavaLocalRef<jobject> RenderFrameHostAndroid::GetLastCommittedOrigin(
JNIEnv* env,
const JavaParamRef<jobject>& obj) {
return render_frame_host_->GetLastCommittedOrigin().CreateJavaObject();
}
void RenderFrameHostAndroid::GetCanonicalUrlForSharing( void RenderFrameHostAndroid::GetCanonicalUrlForSharing(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>&, const base::android::JavaParamRef<jobject>&,
......
...@@ -39,6 +39,10 @@ class RenderFrameHostAndroid : public base::SupportsUserData::Data { ...@@ -39,6 +39,10 @@ class RenderFrameHostAndroid : public base::SupportsUserData::Data {
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>&) const; const base::android::JavaParamRef<jobject>&) const;
base::android::ScopedJavaLocalRef<jobject> GetLastCommittedOrigin(
JNIEnv* env,
const base::android::JavaParamRef<jobject>&);
void GetCanonicalUrlForSharing( void GetCanonicalUrlForSharing(
JNIEnv* env, JNIEnv* env,
const base::android::JavaParamRef<jobject>&, const base::android::JavaParamRef<jobject>&,
......
...@@ -90,6 +90,7 @@ android_library("content_java") { ...@@ -90,6 +90,7 @@ android_library("content_java") {
"//third_party/jsr-305:jsr_305_javalib", "//third_party/jsr-305:jsr_305_javalib",
"//ui/android:ui_java", "//ui/android:ui_java",
"//ui/gfx/geometry/mojom:mojom_java", "//ui/gfx/geometry/mojom:mojom_java",
"//url:origin_java",
] ]
srcjar_deps = [ srcjar_deps = [
......
...@@ -12,6 +12,7 @@ import org.chromium.base.annotations.NativeMethods; ...@@ -12,6 +12,7 @@ import org.chromium.base.annotations.NativeMethods;
import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.mojo.system.impl.CoreImpl; import org.chromium.mojo.system.impl.CoreImpl;
import org.chromium.services.service_manager.InterfaceProvider; import org.chromium.services.service_manager.InterfaceProvider;
import org.chromium.url.Origin;
/** /**
* The RenderFrameHostImpl Java wrapper to allow communicating with the native RenderFrameHost * The RenderFrameHostImpl Java wrapper to allow communicating with the native RenderFrameHost
...@@ -72,6 +73,13 @@ public class RenderFrameHostImpl implements RenderFrameHost { ...@@ -72,6 +73,13 @@ public class RenderFrameHostImpl implements RenderFrameHost {
mNativeRenderFrameHostAndroid, RenderFrameHostImpl.this); mNativeRenderFrameHostAndroid, RenderFrameHostImpl.this);
} }
@Override
public Origin getLastCommittedOrigin() {
if (mNativeRenderFrameHostAndroid == 0) return null;
return RenderFrameHostImplJni.get().getLastCommittedOrigin(
mNativeRenderFrameHostAndroid, RenderFrameHostImpl.this);
}
@Override @Override
public void getCanonicalUrlForSharing(Callback<String> callback) { public void getCanonicalUrlForSharing(Callback<String> callback) {
if (mNativeRenderFrameHostAndroid == 0) { if (mNativeRenderFrameHostAndroid == 0) {
...@@ -121,6 +129,8 @@ public class RenderFrameHostImpl implements RenderFrameHost { ...@@ -121,6 +129,8 @@ public class RenderFrameHostImpl implements RenderFrameHost {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
String getLastCommittedURL(long nativeRenderFrameHostAndroid, RenderFrameHostImpl caller); String getLastCommittedURL(long nativeRenderFrameHostAndroid, RenderFrameHostImpl caller);
Origin getLastCommittedOrigin(
long nativeRenderFrameHostAndroid, RenderFrameHostImpl caller);
void getCanonicalUrlForSharing(long nativeRenderFrameHostAndroid, void getCanonicalUrlForSharing(long nativeRenderFrameHostAndroid,
RenderFrameHostImpl caller, Callback<String> callback); RenderFrameHostImpl caller, Callback<String> callback);
UnguessableToken getAndroidOverlayRoutingToken( UnguessableToken getAndroidOverlayRoutingToken(
......
...@@ -6,6 +6,7 @@ package org.chromium.content_public.browser; ...@@ -6,6 +6,7 @@ package org.chromium.content_public.browser;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.services.service_manager.InterfaceProvider; import org.chromium.services.service_manager.InterfaceProvider;
import org.chromium.url.Origin;
/** /**
* The RenderFrameHost Java wrapper to allow communicating with the native RenderFrameHost object. * The RenderFrameHost Java wrapper to allow communicating with the native RenderFrameHost object.
...@@ -18,6 +19,15 @@ public interface RenderFrameHost { ...@@ -18,6 +19,15 @@ public interface RenderFrameHost {
*/ */
String getLastCommittedURL(); String getLastCommittedURL();
/**
* Get the last committed Origin of the frame. This is not always the same as scheme/host/port
* of getLastCommittedURL(), since it can be an "opaque" origin in such cases as, for example,
* sandboxed frame.
*
* @return The last committed Origin of the frame.
*/
Origin getLastCommittedOrigin();
/** /**
* Fetch the canonical URL associated with the fame. * Fetch the canonical URL associated with the fame.
* *
......
...@@ -7,6 +7,7 @@ package org.chromium.content_public.browser.test.mock; ...@@ -7,6 +7,7 @@ package org.chromium.content_public.browser.test.mock;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.services.service_manager.InterfaceProvider; import org.chromium.services.service_manager.InterfaceProvider;
import org.chromium.url.Origin;
/** /**
* Mock class for {@link RenderFrameHost}. * Mock class for {@link RenderFrameHost}.
...@@ -17,6 +18,11 @@ public class MockRenderFrameHost implements RenderFrameHost { ...@@ -17,6 +18,11 @@ public class MockRenderFrameHost implements RenderFrameHost {
return null; return null;
} }
@Override
public Origin getLastCommittedOrigin() {
return null;
}
@Override @Override
public void getCanonicalUrlForSharing(Callback<String> callback) {} public void getCanonicalUrlForSharing(Callback<String> callback) {}
......
...@@ -97,6 +97,19 @@ component("url") { ...@@ -97,6 +97,19 @@ component("url") {
} }
if (is_android) { if (is_android) {
static_library("origin_android") {
sources = [
"android/origin_android.cc",
]
deps = [
":url",
":url_jni_headers",
"//base",
"//url/mojom:url_mojom_origin",
]
}
android_library("url_java") { android_library("url_java") {
java_files = [ "android/java/src/org/chromium/url/IDNStringUtil.java" ] java_files = [ "android/java/src/org/chromium/url/IDNStringUtil.java" ]
deps = [ deps = [
...@@ -104,9 +117,18 @@ if (is_android) { ...@@ -104,9 +117,18 @@ if (is_android) {
] ]
} }
android_library("origin_java") {
java_files = [ "android/java/src/org/chromium/url/Origin.java" ]
deps = [
"//base:base_java",
"//url/mojom:url_mojom_origin_java",
]
}
generate_jni("url_jni_headers") { generate_jni("url_jni_headers") {
sources = [ sources = [
"android/java/src/org/chromium/url/IDNStringUtil.java", "android/java/src/org/chromium/url/IDNStringUtil.java",
"android/java/src/org/chromium/url/Origin.java",
] ]
} }
} }
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.url;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import java.nio.ByteBuffer;
/** An origin is either a (scheme, host, port) tuple or is opaque. */
@JNINamespace("url")
public class Origin {
// The internal representation of the origin that should never be used directly.
private final org.chromium.url.internal.mojom.Origin mInternal;
/** @return The scheme of the origin. Returns an empty string for an opaque origin. */
public String getScheme() {
return !isOpaque() ? mInternal.scheme : "";
}
/** @return The host of the origin. Returns an empty string for an opaque origin. */
public String getHost() {
return !isOpaque() ? mInternal.host : "";
}
/** @return The port of the origin. Returns 0 for an opaque origin. */
public int getPort() {
return !isOpaque() ? mInternal.port : 0;
}
/** @return Whether the origin is opaque. */
public boolean isOpaque() {
return mInternal.nonceIfOpaque != null;
}
@CalledByNative
private static ByteBuffer serialize(Origin origin) {
return origin.mInternal.serialize();
}
@CalledByNative
private Origin(ByteBuffer byteBuffer) {
mInternal = org.chromium.url.internal.mojom.Origin.deserialize(byteBuffer);
}
}
\ No newline at end of file
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "url/origin.h"
#include <cstdint>
#include <vector>
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "url/mojom/origin.mojom.h"
#include "url/mojom/origin_mojom_traits.h"
#include "url/url_jni_headers/Origin_jni.h"
namespace url {
base::android::ScopedJavaLocalRef<jobject> Origin::CreateJavaObject() const {
std::vector<uint8_t> byte_vector = mojom::Origin::Serialize(this);
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jobject> byte_buffer =
base::android::ScopedJavaLocalRef<jobject>(
env,
env->NewDirectByteBuffer(byte_vector.data(), byte_vector.size()));
return Java_Origin_Constructor(env, byte_buffer);
}
// static
Origin Origin::FromJavaObject(
const base::android::JavaRef<jobject>& java_origin) {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jobject> byte_buffer =
Java_Origin_serialize(env, java_origin);
Origin result;
bool success = mojom::Origin::Deserialize(
static_cast<jbyte*>(env->GetDirectBufferAddress(byte_buffer.obj())),
env->GetDirectBufferCapacity(byte_buffer.obj()), &result);
DCHECK(success);
return result;
}
} // namespace url
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
[JavaPackage="org.chromium.url.internal.mojom"]
module url.mojom; module url.mojom;
import "mojo/public/mojom/base/unguessable_token.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom";
......
...@@ -16,12 +16,26 @@ ...@@ -16,12 +16,26 @@
#include "base/strings/string_piece.h" #include "base/strings/string_piece.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/unguessable_token.h" #include "base/unguessable_token.h"
#include "build/build_config.h"
#include "ipc/ipc_param_traits.h" #include "ipc/ipc_param_traits.h"
#include "url/scheme_host_port.h" #include "url/scheme_host_port.h"
#include "url/third_party/mozilla/url_parse.h" #include "url/third_party/mozilla/url_parse.h"
#include "url/url_canon.h" #include "url/url_canon.h"
#include "url/url_constants.h" #include "url/url_constants.h"
#if defined(OS_ANDROID)
#include <jni.h>
namespace base {
namespace android {
template <typename>
class ScopedJavaLocalRef;
template <typename>
class JavaRef;
} // namespace android
} // namespace base
#endif // OS_ANDROID
class GURL; class GURL;
namespace blink { namespace blink {
...@@ -266,6 +280,12 @@ class COMPONENT_EXPORT(URL) Origin { ...@@ -266,6 +280,12 @@ class COMPONENT_EXPORT(URL) Origin {
// and precursor information. // and precursor information.
std::string GetDebugString() const; std::string GetDebugString() const;
#if defined(OS_ANDROID)
base::android::ScopedJavaLocalRef<jobject> CreateJavaObject() const;
static Origin FromJavaObject(
const base::android::JavaRef<jobject>& java_origin);
#endif // OS_ANDROID
private: private:
friend class blink::SecurityOrigin; friend class blink::SecurityOrigin;
friend class OriginTest; friend class OriginTest;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment