Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Unified Diff: content/browser/android/content_view_client.cc

Issue 10536066: android content shell bringup. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync and merge Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/android/content_view_client.h ('k') | content/browser/android/content_view_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/android/content_view_client.cc
diff --git a/content/browser/android/content_view_client.cc b/content/browser/android/content_view_client.cc
new file mode 100644
index 0000000000000000000000000000000000000000..983db4f77b8e5d1ffcd1a39949d82422bd303725
--- /dev/null
+++ b/content/browser/android/content_view_client.cc
@@ -0,0 +1,587 @@
+// Copyright (c) 2010 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 "content/browser/android/content_view_client.h"
+
+#include <android/keycodes.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "content/browser/android/content_util.h"
+#include "content/browser/android/content_view_impl.h"
+#include "content/browser/android/download_controller.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/common/find_match_rect_android.h"
+#include "content/public/browser/render_widget_host_view.h"
+#include "content/public/browser/download_item.h"
+#include "content/public/browser/invalidate_type.h"
+#include "content/public/browser/page_navigator.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/page_transition_types.h"
+#include "content/public/common/referrer.h"
+#include "jni/content_view_client_jni.h"
+#include "net/http/http_request_headers.h"
+#include "ui/gfx/rect.h"
+#include "webkit/glue/window_open_disposition.h"
+
+using base::android::AttachCurrentThread;
+using base::android::CheckException;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ConvertUTF16ToJavaString;
+using base::android::GetClass;
+using base::android::GetMethodID;
+using base::android::HasClass;
+using base::android::ScopedJavaLocalRef;
+
+namespace content {
+
+ContentViewClient::ContentViewClient(JNIEnv* env, jobject obj)
+ : weak_java_client_(env, obj),
+ find_helper_(NULL),
+ javascript_dialog_creator_(NULL) {
+}
+
+ContentViewClient::~ContentViewClient() {
+}
+
+// static
+ContentViewClient* ContentViewClient::CreateNativeContentViewClient(
+ JNIEnv* env, jobject obj) {
+ DCHECK(obj);
+ return new ContentViewClient(env, obj);
+}
+
+void ContentViewClient::OnInternalPageLoadRequest(
+ WebContents* source, const GURL& url) {
+ last_requested_navigation_url_ = url;
+}
+
+
+void ContentViewClient::OnPageStarted(const GURL& url) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jstring_url =
+ ConvertUTF8ToJavaString(env, url.spec());
+ Java_ContentViewClient_onPageStarted(env, weak_java_client_.get(env).obj(),
+ jstring_url.obj());
+}
+
+void ContentViewClient::OnPageFinished(const GURL& url) {
+ if (url == last_requested_navigation_url_)
+ last_requested_navigation_url_ = GURL::EmptyGURL();
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jstring_url =
+ ConvertUTF8ToJavaString(env, url.spec());
+
+ Java_ContentViewClient_onPageFinished(env, weak_java_client_.get(env).obj(),
+ jstring_url.obj());
+ CheckException(env);
+}
+
+void ContentViewClient::OnReceivedError(int error_code,
+ const string16& description,
+ const GURL& url) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jstring_error_description =
+ ConvertUTF8ToJavaString(env, url.spec());
+ ScopedJavaLocalRef<jstring> jstring_url =
+ ConvertUTF8ToJavaString(env, url.spec());
+
+ Java_ContentViewClient_onReceivedError(
+ env, weak_java_client_.get(env).obj(),
+ ToContentViewClientError(error_code),
+ jstring_error_description.obj(), jstring_url.obj());
+}
+
+void ContentViewClient::OnReceivedHttpAuthRequest(
+ jobject auth_handler,
+ const string16& host,
+ const string16& realm) {
+ /* TODO(jrg): upstream this once ContentHttpAuthHandler.java is
+ upstreamed, and onReceivedHttpAuthRequest() is upstreamed in
+ ContentViewClient.java */
+ NOTREACHED();
+}
+
+void ContentViewClient::OnDidCommitMainFrame(const GURL& url,
+ const GURL& base_url) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jstring_url =
+ ConvertUTF8ToJavaString(env, url.spec());
+ ScopedJavaLocalRef<jstring> jstring_base_url =
+ ConvertUTF8ToJavaString(env, base_url.spec());
+
+ Java_ContentViewClient_onMainFrameCommitted(
+ env, weak_java_client_.get(env).obj(),
+ jstring_url.obj(), jstring_base_url.obj());
+}
+
+void ContentViewClient::OnInterstitialShown() {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ContentViewClient_onInterstitialShown(
+ env, weak_java_client_.get(env).obj());
+}
+
+void ContentViewClient::OnInterstitialHidden() {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ContentViewClient_onInterstitialHidden(
+ env, weak_java_client_.get(env).obj());
+}
+
+void ContentViewClient::SetFindHelper(FindHelper* find_helper) {
+ find_helper_ = find_helper;
+}
+
+void ContentViewClient::SetJavaScriptDialogCreator(
+ JavaScriptDialogCreator* javascript_dialog_creator) {
+ javascript_dialog_creator_ = javascript_dialog_creator;
+}
+
+bool ContentViewClient::OnJSModalDialog(JavaScriptMessageType type,
+ bool is_before_unload_dialog,
+ const GURL& url,
+ const string16& message,
+ const string16& default_value) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString(env, url.spec()));
+ ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString(env, message));
+
+ // Special case for beforeunload dialogs, as that isn't encoded in the
+ // |type| of the dialog.
+ if (is_before_unload_dialog) {
+ return Java_ContentViewClient_onJsBeforeUnload(env,
+ weak_java_client_.get(env).obj(),
+ jurl.obj(),
+ jmessage.obj());
+ }
+
+ switch (type) {
+ case JAVASCRIPT_MESSAGE_TYPE_ALERT:
+ return Java_ContentViewClient_onJsAlert(env,
+ weak_java_client_.get(env).obj(),
+ jurl.obj(),
+ jmessage.obj());
+
+ case JAVASCRIPT_MESSAGE_TYPE_CONFIRM:
+ return Java_ContentViewClient_onJsConfirm(env,
+ weak_java_client_.get(env).obj(),
+ jurl.obj(),
+ jmessage.obj());
+
+ case JAVASCRIPT_MESSAGE_TYPE_PROMPT: {
+ ScopedJavaLocalRef<jstring> jdefault_value(
+ ConvertUTF16ToJavaString(env, default_value));
+ return Java_ContentViewClient_onJsPrompt(env,
+ weak_java_client_.get(env).obj(),
+ jurl.obj(),
+ jmessage.obj(),
+ jdefault_value.obj());
+ }
+
+ default:
+ NOTREACHED();
+ return false;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// WebContentsDelegate methods
+// ----------------------------------------------------------------------------
+
+// OpenURLFromTab() will be called when we're performing a browser-intiated
+// navigation. The most common scenario for this is opening new tabs (see
+// RenderViewImpl::decidePolicyForNavigation for more details).
+WebContents* ContentViewClient::OpenURLFromTab(
+ WebContents* source,
+ const OpenURLParams& params) {
+ const GURL& url = params.url;
+ WindowOpenDisposition disposition = params.disposition;
+ PageTransition transition(
+ PageTransitionFromInt(params.transition));
+
+ if (!source || (disposition != CURRENT_TAB &&
+ disposition != NEW_FOREGROUND_TAB &&
+ disposition != NEW_BACKGROUND_TAB &&
+ disposition != OFF_THE_RECORD)) {
+ NOTIMPLEMENTED();
+ return NULL;
+ }
+
+ if (disposition == NEW_FOREGROUND_TAB ||
+ disposition == NEW_BACKGROUND_TAB ||
+ disposition == OFF_THE_RECORD) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> java_url =
+ ConvertUTF8ToJavaString(env, url.spec());
+ Java_ContentViewClient_openNewTab(env,
+ weak_java_client_.get(env).obj(),
+ java_url.obj(),
+ disposition == OFF_THE_RECORD);
+ return NULL;
+ }
+
+ // TODO(mkosiba): This should be in platform_utils OpenExternal, b/6174564.
+ if (transition == PAGE_TRANSITION_LINK && ShouldOverrideLoading(url))
+ return NULL;
+
+ source->GetController().LoadURL(url, params.referrer, transition,
+ std::string());
+ return source;
+}
+
+// ShouldIgnoreNavigation will be called for every non-local top level
+// navigation made by the renderer. If true is returned the renderer will
+// not perform the navigation. This is done by using synchronous IPC so we
+// should avoid blocking calls from this method.
+bool ContentViewClient::ShouldIgnoreNavigation(
+ WebContents* source,
+ const GURL& url,
+ const Referrer& referrer,
+ WindowOpenDisposition disposition,
+ PageTransition transition_type) {
+
+ // Don't override new tabs.
+ if (disposition == NEW_FOREGROUND_TAB ||
+ disposition == NEW_BACKGROUND_TAB ||
+ disposition == OFF_THE_RECORD)
+ return false;
+
+ // Don't override the navigation that has just been requested via the
+ // ContentView.loadUrl method.
+ if (url == last_requested_navigation_url_) {
+ last_requested_navigation_url_ = GURL::EmptyGURL();
+ return false;
+ }
+
+ return ShouldOverrideLoading(url);
+}
+
+void ContentViewClient::NavigationStateChanged(
+ const WebContents* source, unsigned changed_flags) {
+ if (changed_flags & (
+ INVALIDATE_TYPE_TAB | INVALIDATE_TYPE_TITLE)) {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ContentViewClient_onTabHeaderStateChanged(
+ env, weak_java_client_.get(env).obj());
+ }
+}
+
+void ContentViewClient::AddNewContents(WebContents* source,
+ WebContents* new_contents,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture) {
+ JNIEnv* env = AttachCurrentThread();
+ bool handled = Java_ContentViewClient_addNewContents(
+ env,
+ weak_java_client_.get(env).obj(),
+ reinterpret_cast<jint>(source),
+ reinterpret_cast<jint>(new_contents),
+ static_cast<jint>(disposition),
+ NULL,
+ user_gesture);
+ if (!handled)
+ delete new_contents;
+}
+
+void ContentViewClient::ActivateContents(WebContents* contents) {
+ // TODO(dtrainor) When doing the merge I came across this. Should we be
+ // activating this tab here?
+}
+
+void ContentViewClient::DeactivateContents(WebContents* contents) {
+ // Do nothing.
+}
+
+void ContentViewClient::LoadingStateChanged(WebContents* source) {
+ JNIEnv* env = AttachCurrentThread();
+ bool has_stopped = source == NULL || !source->IsLoading();
+
+ if (has_stopped)
+ Java_ContentViewClient_onLoadStopped(
+ env, weak_java_client_.get(env).obj());
+ else
+ Java_ContentViewClient_onLoadStarted(
+ env, weak_java_client_.get(env).obj());
+}
+
+void ContentViewClient::LoadProgressChanged(double progress) {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ContentViewClient_onLoadProgressChanged(
+ env,
+ weak_java_client_.get(env).obj(),
+ progress);
+}
+
+void ContentViewClient::CloseContents(WebContents* source) {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ContentViewClient_closeContents(env, weak_java_client_.get(env).obj());
+}
+
+void ContentViewClient::MoveContents(WebContents* source,
+ const gfx::Rect& pos) {
+ // Do nothing.
+}
+
+// TODO(merge): WARNING! method no longer available on the base class.
+// See http://b/issue?id=5862108
+void ContentViewClient::URLStarredChanged(WebContents* source, bool starred) {
+ JNIEnv* env = AttachCurrentThread();
+ Java_ContentViewClient_onUrlStarredChanged(env,
+ weak_java_client_.get(env).obj(),
+ starred);
+}
+
+// This is either called from TabContents::DidNavigateMainFramePostCommit() with
+// an empty GURL or responding to RenderViewHost::OnMsgUpateTargetURL(). In
+// Chrome, the latter is not always called, especially not during history
+// navigation. So we only handle the first case and pass the source TabContents'
+// url to Java to update the UI.
+void ContentViewClient::UpdateTargetURL(WebContents* source,
+ int32 page_id,
+ const GURL& url) {
+ if (url.is_empty()) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> java_url =
+ ConvertUTF8ToJavaString(env, source->GetURL().spec());
+ Java_ContentViewClient_onUpdateUrl(env,
+ weak_java_client_.get(env).obj(),
+ java_url.obj());
+ }
+}
+
+bool ContentViewClient::CanDownload(RenderViewHost* source,
+ int request_id,
+ const std::string& request_method) {
+ if (request_method == net::HttpRequestHeaders::kGetMethod) {
+ DownloadController::GetInstance()->CreateGETDownload(
+ source, request_id);
+ return false;
+ }
+ return true;
+}
+
+void ContentViewClient::OnStartDownload(WebContents* source,
+ DownloadItem* download) {
+ DownloadController::GetInstance()->OnPostDownloadStarted(
+ source, download);
+}
+
+void ContentViewClient::FindReply(WebContents* web_contents,
+ int request_id,
+ int number_of_matches,
+ const gfx::Rect& selection_rect,
+ int active_match_ordinal,
+ bool final_update) {
+ /* TODO(jrg): upstream this; requires
+ content/browser/android/find_helper.h to be upstreamed */
+}
+
+void ContentViewClient::OnReceiveFindMatchRects(
+ int version, const std::vector<FindMatchRect>& rects,
+ const FindMatchRect& active_rect) {
+ JNIEnv* env = AttachCurrentThread();
+
+ // Constructs an float[] of (left, top, right, bottom) tuples and passes it on
+ // to the Java onReceiveFindMatchRects handler which will use it to create
+ // RectF objects equivalent to the std::vector<FindMatchRect>.
+ ScopedJavaLocalRef<jfloatArray> rect_data(env,
+ env->NewFloatArray(rects.size() * 4));
+ jfloat* rect_data_floats = env->GetFloatArrayElements(rect_data.obj(), NULL);
+ for (size_t i = 0; i < rects.size(); ++i) {
+ rect_data_floats[4 * i] = rects[i].left;
+ rect_data_floats[4 * i + 1] = rects[i].top;
+ rect_data_floats[4 * i + 2] = rects[i].right;
+ rect_data_floats[4 * i + 3] = rects[i].bottom;
+ }
+ env->ReleaseFloatArrayElements(rect_data.obj(), rect_data_floats, 0);
+
+ ScopedJavaLocalRef<jobject> active_rect_object;
+ if (active_rect.left < active_rect.right &&
+ active_rect.top < active_rect.bottom) {
+ ScopedJavaLocalRef<jclass> rect_clazz =
+ GetClass(env, "android/graphics/RectF");
+ jmethodID rect_constructor =
+ GetMethodID(env, rect_clazz, "<init>", "(FFFF)V");
+ active_rect_object.Reset(env, env->NewObject(rect_clazz.obj(),
+ rect_constructor,
+ active_rect.left,
+ active_rect.top,
+ active_rect.right,
+ active_rect.bottom));
+ DCHECK(!active_rect_object.is_null());
+ }
+
+
+ Java_ContentViewClient_onReceiveFindMatchRects(
+ env,
+ weak_java_client_.get(env).obj(),
+ version, rect_data.obj(),
+ active_rect_object.obj());
+}
+
+bool ContentViewClient::ShouldOverrideLoading(const GURL& url) {
+ if (!url.is_valid())
+ return false;
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> jstring_url =
+ ConvertUTF8ToJavaString(env, url.spec());
+ bool ret = Java_ContentViewClient_shouldOverrideUrlLoading(
+ env, weak_java_client_.get(env).obj(), jstring_url.obj());
+ return ret;
+}
+
+void ContentViewClient::HandleKeyboardEvent(
+ const NativeWebKeyboardEvent& event) {
+ /* TODO(jrg): to upstream this implementation, we need these files as well:
+ browser/android/ime_helper.cc
+ browser/android/ime_helper.h
+ browser/renderer_host/native_web_keyboard_event_android.h
+ browser/renderer_host/native_web_keyboard_event_android.cc
+ Also the @CalledByNative handleKeyboardEvent() in ContentViewClient.java.
+ */
+ NOTREACHED();
+}
+
+bool ContentViewClient::TakeFocus(bool reverse) {
+ JNIEnv* env = AttachCurrentThread();
+ return Java_ContentViewClient_takeFocus(env,
+ weak_java_client_.get(env).obj(),
+ reverse);
+}
+
+ContentViewClientError ContentViewClient::ToContentViewClientError(
+ int net_error) {
+ // Note: many net::Error constants don't have an obvious mapping.
+ // These will be handled by the default case, ERROR_UNKNOWN.
+ switch(net_error) {
+ case net::ERR_UNSUPPORTED_AUTH_SCHEME:
+ return CONTENT_VIEW_CLIENT_ERROR_UNSUPPORTED_AUTH_SCHEME;
+
+ case net::ERR_INVALID_AUTH_CREDENTIALS:
+ case net::ERR_MISSING_AUTH_CREDENTIALS:
+ case net::ERR_MISCONFIGURED_AUTH_ENVIRONMENT:
+ return CONTENT_VIEW_CLIENT_ERROR_AUTHENTICATION;
+
+ case net::ERR_TOO_MANY_REDIRECTS:
+ return CONTENT_VIEW_CLIENT_ERROR_REDIRECT_LOOP;
+
+ case net::ERR_UPLOAD_FILE_CHANGED:
+ return CONTENT_VIEW_CLIENT_ERROR_FILE_NOT_FOUND;
+
+ case net::ERR_INVALID_URL:
+ return CONTENT_VIEW_CLIENT_ERROR_BAD_URL;
+
+ case net::ERR_DISALLOWED_URL_SCHEME:
+ case net::ERR_UNKNOWN_URL_SCHEME:
+ return CONTENT_VIEW_CLIENT_ERROR_UNSUPPORTED_SCHEME;
+
+ case net::ERR_IO_PENDING:
+ case net::ERR_NETWORK_IO_SUSPENDED:
+ return CONTENT_VIEW_CLIENT_ERROR_IO;
+
+ case net::ERR_CONNECTION_TIMED_OUT:
+ case net::ERR_TIMED_OUT:
+ return CONTENT_VIEW_CLIENT_ERROR_TIMEOUT;
+
+ case net::ERR_FILE_TOO_BIG:
+ return CONTENT_VIEW_CLIENT_ERROR_FILE;
+
+ case net::ERR_HOST_RESOLVER_QUEUE_TOO_LARGE:
+ case net::ERR_INSUFFICIENT_RESOURCES:
+ case net::ERR_OUT_OF_MEMORY:
+ return CONTENT_VIEW_CLIENT_ERROR_TOO_MANY_REQUESTS;
+
+ case net::ERR_CONNECTION_CLOSED:
+ case net::ERR_CONNECTION_RESET:
+ case net::ERR_CONNECTION_REFUSED:
+ case net::ERR_CONNECTION_ABORTED:
+ case net::ERR_CONNECTION_FAILED:
+ case net::ERR_SOCKET_NOT_CONNECTED:
+ return CONTENT_VIEW_CLIENT_ERROR_CONNECT;
+
+ case net::ERR_INTERNET_DISCONNECTED:
+ case net::ERR_ADDRESS_INVALID:
+ case net::ERR_ADDRESS_UNREACHABLE:
+ case net::ERR_NAME_NOT_RESOLVED:
+ case net::ERR_NAME_RESOLUTION_FAILED:
+ return CONTENT_VIEW_CLIENT_ERROR_HOST_LOOKUP;
+
+ case net::ERR_SSL_PROTOCOL_ERROR:
+ case net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED:
+ case net::ERR_TUNNEL_CONNECTION_FAILED:
+ case net::ERR_NO_SSL_VERSIONS_ENABLED:
+ case net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
+ case net::ERR_SSL_RENEGOTIATION_REQUESTED:
+ case net::ERR_CERT_ERROR_IN_SSL_RENEGOTIATION:
+ case net::ERR_BAD_SSL_CLIENT_AUTH_CERT:
+ case net::ERR_SSL_NO_RENEGOTIATION:
+ case net::ERR_SSL_DECOMPRESSION_FAILURE_ALERT:
+ case net::ERR_SSL_BAD_RECORD_MAC_ALERT:
+ case net::ERR_SSL_UNSAFE_NEGOTIATION:
+ case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
+ case net::ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED:
+ case net::ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY:
+ return CONTENT_VIEW_CLIENT_ERROR_FAILED_SSL_HANDSHAKE;
+
+ case net::ERR_PROXY_AUTH_UNSUPPORTED:
+ case net::ERR_PROXY_AUTH_REQUESTED:
+ case net::ERR_PROXY_CONNECTION_FAILED:
+ case net::ERR_UNEXPECTED_PROXY_AUTH:
+ return CONTENT_VIEW_CLIENT_ERROR_PROXY_AUTHENTICATION;
+
+ /* The certificate errors are handled by onReceivedSslError
+ * and don't need to be reported here.
+ */
+ case net::ERR_CERT_COMMON_NAME_INVALID:
+ case net::ERR_CERT_DATE_INVALID:
+ case net::ERR_CERT_AUTHORITY_INVALID:
+ case net::ERR_CERT_CONTAINS_ERRORS:
+ case net::ERR_CERT_NO_REVOCATION_MECHANISM:
+ case net::ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
+ case net::ERR_CERT_REVOKED:
+ case net::ERR_CERT_INVALID:
+ case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
+ case net::ERR_CERT_NOT_IN_DNS:
+ case net::ERR_CERT_NON_UNIQUE_NAME:
+ return CONTENT_VIEW_CLIENT_ERROR_OK;
+
+ default:
+ VLOG(1) << "ContentViewClient::ToContentViewClientError: Unknown "
+ << "chromium error: "
+ << net_error;
+ return CONTENT_VIEW_CLIENT_ERROR_UNKNOWN;
+ }
+}
+
+JavaScriptDialogCreator* ContentViewClient::GetJavaScriptDialogCreator() {
+ return javascript_dialog_creator_;
+}
+
+void ContentViewClient::RunFileChooser(
+ WebContents* tab, const FileChooserParams& params) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> jparams = ToJavaFileChooserParams(env, params);
+ Java_ContentViewClient_runFileChooser(env, weak_java_client_.get(env).obj(),
+ jparams.obj());
+}
+
+// ----------------------------------------------------------------------------
+// Native JNI methods
+// ----------------------------------------------------------------------------
+
+// Register native methods
+
+bool RegisterContentViewClient(JNIEnv* env) {
+ if (!HasClass(env, kContentViewClientClassPath)) {
+ DLOG(ERROR) << "Unable to find class ContentViewClient!";
+ return false;
+ }
+ return RegisterNativesImpl(env);
+}
+
+} // namespace content
« no previous file with comments | « content/browser/android/content_view_client.h ('k') | content/browser/android/content_view_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698