15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/navigation_interception/intercept_navigation_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/navigation_interception/intercept_navigation_resource_throttle.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/navigation_interception/navigation_params_android.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/InterceptNavigationDelegate_jni.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing ui::PageTransition;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace navigation_interception {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const void* kInterceptNavigationDelegateUserDataKey =
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    &kInterceptNavigationDelegateUserDataKey;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool CheckIfShouldIgnoreNavigationOnUIThread(WebContents* source,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             const NavigationParams& params) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(source);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterceptNavigationDelegate* intercept_navigation_delegate =
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InterceptNavigationDelegate::Get(source);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!intercept_navigation_delegate)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return intercept_navigation_delegate->ShouldIgnoreNavigation(params);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InterceptNavigationDelegate::Associate(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<InterceptNavigationDelegate> delegate) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetUserData(kInterceptNavigationDelegateUserDataKey,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            delegate.release());
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterceptNavigationDelegate* InterceptNavigationDelegate::Get(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return reinterpret_cast<InterceptNavigationDelegate*>(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents->GetUserData(kInterceptNavigationDelegateUserDataKey));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::ResourceThrottle* InterceptNavigationDelegate::CreateThrottleFor(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::URLRequest* request) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new InterceptNavigationResourceThrottle(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request, base::Bind(&CheckIfShouldIgnoreNavigationOnUIThread));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterceptNavigationDelegate::InterceptNavigationDelegate(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env, jobject jdelegate)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : weak_jdelegate_(env, jdelegate) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterceptNavigationDelegate::~InterceptNavigationDelegate() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool InterceptNavigationDelegate::ShouldIgnoreNavigation(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationParams& navigation_params) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!navigation_params.url().is_valid())
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> jdelegate = weak_jdelegate_.get(env);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (jdelegate.is_null())
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedJavaLocalRef<jobject> jobject_params =
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateJavaNavigationParams(env, navigation_params);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Java_InterceptNavigationDelegate_shouldIgnoreNavigation(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      env,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      jdelegate.obj(),
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      jobject_params.obj());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Register native methods.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterInterceptNavigationDelegate(JNIEnv* env) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace navigation_interception
105