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

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

Issue 10831060: Refactor the Android port to allow access to the chrome layer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: gyp fixes Created 8 years, 4 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
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
index d4e08fbc7260e000593302051a639d2086ec194b..b7d4a15f32156546e00ef4e348b39bb40311ebd3 100644
--- a/content/browser/android/content_view_client.cc
+++ b/content/browser/android/content_view_client.cc
@@ -8,12 +8,9 @@
#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_core_impl.h"
#include "content/browser/android/download_controller.h"
-#include "content/browser/android/ime_utils.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"
@@ -25,8 +22,6 @@
#include "content/public/common/referrer.h"
#include "jni/ContentViewClient_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;
@@ -40,10 +35,7 @@ using base::android::ScopedJavaLocalRef;
namespace content {
ContentViewClient::ContentViewClient(JNIEnv* env, jobject obj)
- : weak_java_client_(env, obj),
- find_helper_(NULL),
- javascript_dialog_creator_(NULL),
- load_progress_(0) {
+ : weak_java_client_(env, obj) {
}
ContentViewClient::~ContentViewClient() {
@@ -58,42 +50,45 @@ ContentViewClient* ContentViewClient::CreateNativeContentViewClient(
void ContentViewClient::OnInternalPageLoadRequest(
WebContents* source, const GURL& url) {
- last_requested_navigation_url_ = url;
}
void ContentViewClient::OnPageStarted(const GURL& url) {
JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return;
ScopedJavaLocalRef<jstring> jstring_url =
ConvertUTF8ToJavaString(env, url.spec());
- Java_ContentViewClient_onPageStarted(env, weak_java_client_.get(env).obj(),
- jstring_url.obj());
+ Java_ContentViewClient_onPageStarted(env, obj.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<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return;
ScopedJavaLocalRef<jstring> jstring_url =
ConvertUTF8ToJavaString(env, url.spec());
- Java_ContentViewClient_onPageFinished(env, weak_java_client_.get(env).obj(),
- jstring_url.obj());
+ Java_ContentViewClient_onPageFinished(env, obj.obj(), jstring_url.obj());
CheckException(env);
}
void ContentViewClient::OnReceivedError(int error_code,
- const string16& description,
- const GURL& url) {
+ const string16& description,
+ const GURL& url) {
JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return;
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(),
+ env, obj.obj(),
ToContentViewClientError(error_code),
jstring_error_description.obj(), jstring_url.obj());
}
@@ -101,35 +96,33 @@ void ContentViewClient::OnReceivedError(int error_code,
void ContentViewClient::OnDidCommitMainFrame(const GURL& url,
const GURL& base_url) {
JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return;
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(),
+ env, obj.obj(),
jstring_url.obj(), jstring_base_url.obj());
}
void ContentViewClient::OnInterstitialShown() {
JNIEnv* env = AttachCurrentThread();
- Java_ContentViewClient_onInterstitialShown(
- env, weak_java_client_.get(env).obj());
+ ScopedJavaLocalRef<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return;
+ Java_ContentViewClient_onInterstitialShown(env, obj.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;
+ ScopedJavaLocalRef<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return;
+ Java_ContentViewClient_onInterstitialHidden(env, obj.obj());
}
bool ContentViewClient::OnJSModalDialog(JavaScriptMessageType type,
@@ -138,36 +131,36 @@ bool ContentViewClient::OnJSModalDialog(JavaScriptMessageType type,
const string16& message,
const string16& default_value) {
JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = weak_java_client_.get(env);
+ if (obj.is_null())
+ return false;
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(),
+ return Java_ContentViewClient_onJsBeforeUnload(
+ env, obj.obj(),
jurl.obj(),
jmessage.obj());
}
switch (type) {
case JAVASCRIPT_MESSAGE_TYPE_ALERT:
- return Java_ContentViewClient_onJsAlert(env,
- weak_java_client_.get(env).obj(),
+ return Java_ContentViewClient_onJsAlert(env, obj.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());
+ return Java_ContentViewClient_onJsConfirm(env, obj.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(),
+ return Java_ContentViewClient_onJsPrompt(env, obj.obj(),
jurl.obj(),
jmessage.obj(),
jdefault_value.obj());
@@ -179,278 +172,6 @@ bool ContentViewClient::OnJSModalDialog(JavaScriptMessageType type,
}
}
-// ----------------------------------------------------------------------------
-// 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) {
- load_progress_ = progress;
- JNIEnv* env = AttachCurrentThread();
- Java_ContentViewClient_onLoadProgressChanged(
- env,
- weak_java_client_.get(env).obj(),
- progress);
-}
-
-double ContentViewClient::GetLoadProgress() const {
- return load_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) {
- jobject key_event = KeyEventFromNative(event);
- if (key_event) {
- JNIEnv* env = AttachCurrentThread();
- Java_ContentViewClient_handleKeyboardEvent(
- env,
- weak_java_client_.get(env).obj(),
- key_event);
- }
-}
-
-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.
@@ -554,18 +275,6 @@ ContentViewClientError ContentViewClient::ToContentViewClientError(
}
}
-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
// ----------------------------------------------------------------------------

Powered by Google App Engine
This is Rietveld 408576698