// Copyright (c) 2012 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 "components/navigation_interception/intercept_navigation_delegate.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/callback.h" #include "components/navigation_interception/intercept_navigation_resource_throttle.h" #include "components/navigation_interception/navigation_params_android.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "jni/InterceptNavigationDelegate_jni.h" #include "net/url_request/url_request.h" #include "url/gurl.h" using base::android::ConvertUTF8ToJavaString; using base::android::ScopedJavaLocalRef; using content::BrowserThread; using content::PageTransition; using content::RenderViewHost; using content::WebContents; namespace navigation_interception { namespace { const void* kInterceptNavigationDelegateUserDataKey = &kInterceptNavigationDelegateUserDataKey; bool CheckIfShouldIgnoreNavigationOnUIThread(RenderViewHost* source, const NavigationParams& params) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(source); WebContents* web_contents = WebContents::FromRenderViewHost(source); if (!web_contents) return false; InterceptNavigationDelegate* intercept_navigation_delegate = InterceptNavigationDelegate::Get(web_contents); if (!intercept_navigation_delegate) return false; return intercept_navigation_delegate->ShouldIgnoreNavigation(params); } } // namespace // static void InterceptNavigationDelegate::Associate( WebContents* web_contents, scoped_ptr delegate) { web_contents->SetUserData(kInterceptNavigationDelegateUserDataKey, delegate.release()); } // static InterceptNavigationDelegate* InterceptNavigationDelegate::Get( WebContents* web_contents) { return reinterpret_cast( web_contents->GetUserData(kInterceptNavigationDelegateUserDataKey)); } // static content::ResourceThrottle* InterceptNavigationDelegate::CreateThrottleFor( net::URLRequest* request) { return new InterceptNavigationResourceThrottle( request, base::Bind(&CheckIfShouldIgnoreNavigationOnUIThread)); } InterceptNavigationDelegate::InterceptNavigationDelegate( JNIEnv* env, jobject jdelegate) : weak_jdelegate_(env, jdelegate) { } InterceptNavigationDelegate::~InterceptNavigationDelegate() { } bool InterceptNavigationDelegate::ShouldIgnoreNavigation( const NavigationParams& navigation_params) { if (!navigation_params.url().is_valid()) return false; JNIEnv* env = base::android::AttachCurrentThread(); ScopedJavaLocalRef jdelegate = weak_jdelegate_.get(env); if (jdelegate.is_null()) return false; ScopedJavaLocalRef jobject_params = CreateJavaNavigationParams(env, navigation_params); return Java_InterceptNavigationDelegate_shouldIgnoreNavigation( env, jdelegate.obj(), jobject_params.obj()); } // Register native methods. bool RegisterInterceptNavigationDelegate(JNIEnv* env) { return RegisterNativesImpl(env); } } // namespace navigation_interception