| 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 | 
| // ---------------------------------------------------------------------------- | 
|  |