summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorjknotten@chromium.org <jknotten@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-14 14:05:14 +0000
committerjknotten@chromium.org <jknotten@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-14 14:05:14 +0000
commit9a34490644388470d021aa043683f2a8dd5876f4 (patch)
tree6f9d4011aa4a692191d8d761b64e383aca01190f /content
parent9d611ca0375cf3594423fa8571a30ed356e568f6 (diff)
downloadchromium_src-9a34490644388470d021aa043683f2a8dd5876f4.zip
chromium_src-9a34490644388470d021aa043683f2a8dd5876f4.tar.gz
chromium_src-9a34490644388470d021aa043683f2a8dd5876f4.tar.bz2
Move WebContentsDelegateAndroid to content/components
1. Move chrome/browser/component/web_contents_delegate_android to content/components/web_contents_delegate_android. 2. Rename package org.chromium.chrome.browser.component. web_contents_delegate_android to org.chromium.content.components. web_contents_delegate_android. 3. Remove shouldOverrideUrlLoading from WebContentsDelegateAndroid interface, which is no longer required. I will follow up with a second change to completely remove chrome/browser/component/web_contents_delegate_android once external dependencies on it have been removed. BUG=157575 Review URL: https://chromiumcodereview.appspot.com/11365199 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167670 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/OWNERS1
-rw-r--r--content/components/web_contents_delegate_android/DEPS4
-rw-r--r--content/components/web_contents_delegate_android/OWNERS1
-rw-r--r--content/components/web_contents_delegate_android/component_jni_registrar.cc23
-rw-r--r--content/components/web_contents_delegate_android/component_jni_registrar.h19
-rw-r--r--content/components/web_contents_delegate_android/java/src/org/chromium/content/components/web_contents_delegate_android/WebContentsDelegateAndroid.java122
-rw-r--r--content/components/web_contents_delegate_android/web_contents_delegate_android.cc317
-rw-r--r--content/components/web_contents_delegate_android/web_contents_delegate_android.h111
-rw-r--r--content/content.gyp1
-rw-r--r--content/content_components_web_contents_delegate_android.gypi62
10 files changed, 661 insertions, 0 deletions
diff --git a/content/OWNERS b/content/OWNERS
index 83b284e..7e62dafb 100644
--- a/content/OWNERS
+++ b/content/OWNERS
@@ -7,6 +7,7 @@ piman@chromium.org
per-file content_components_navigation_interception.gypi=jknotten@chromium.org
per-file content_components_navigation_interception.gypi=joth@chromium.org
per-file content_components_navigation_interception.gypi=mkosiba@chromium.org
+per-file content_components_web_contents_delegate_android.gypi=joth@chromium.org
per-file content_jni.gypi=bulach@chromium.org
per-file content_jni.gypi=yfriedman@chromium.org
per-file content_shell.gypi=jochen@chromium.org
diff --git a/content/components/web_contents_delegate_android/DEPS b/content/components/web_contents_delegate_android/DEPS
new file mode 100644
index 0000000..471d9e0
--- /dev/null
+++ b/content/components/web_contents_delegate_android/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+ "+content/public/android/java",
+ "+content/public/browser"
+]
diff --git a/content/components/web_contents_delegate_android/OWNERS b/content/components/web_contents_delegate_android/OWNERS
new file mode 100644
index 0000000..f9dca5c
--- /dev/null
+++ b/content/components/web_contents_delegate_android/OWNERS
@@ -0,0 +1 @@
+joth@chromium.org
diff --git a/content/components/web_contents_delegate_android/component_jni_registrar.cc b/content/components/web_contents_delegate_android/component_jni_registrar.cc
new file mode 100644
index 0000000..333d7bc
--- /dev/null
+++ b/content/components/web_contents_delegate_android/component_jni_registrar.cc
@@ -0,0 +1,23 @@
+// 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 "content/components/web_contents_delegate_android/component_jni_registrar.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_registrar.h"
+#include "content/components/web_contents_delegate_android/web_contents_delegate_android.h"
+
+namespace content {
+
+static base::android::RegistrationMethod kComponentRegisteredMethods[] = {
+ { "WebContentsDelegateAndroid", RegisterWebContentsDelegateAndroid },
+};
+
+bool RegisterWebContentsDelegateAndroidJni(JNIEnv* env) {
+ return RegisterNativeMethods(env,
+ kComponentRegisteredMethods, arraysize(kComponentRegisteredMethods));
+}
+
+} // namespace content
+
diff --git a/content/components/web_contents_delegate_android/component_jni_registrar.h b/content/components/web_contents_delegate_android/component_jni_registrar.h
new file mode 100644
index 0000000..ee476b3
--- /dev/null
+++ b/content/components/web_contents_delegate_android/component_jni_registrar.h
@@ -0,0 +1,19 @@
+// 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.
+
+#ifndef CHROME_BROWSER_COMPONENT_WEB_CONTENTS_DELEGATE_ANDROID_COMPONENT_JNI_REGISTRAR_H_
+#define CHROME_BROWSER_COMPONENT_WEB_CONTENTS_DELEGATE_ANDROID_COMPONENT_JNI_REGISTRAR_H_
+
+#include <jni.h>
+
+namespace content {
+
+// Register all JNI bindings necessary for the web_contents_delegate_android
+// component.
+bool RegisterWebContentsDelegateAndroidJni(JNIEnv* env);
+
+} // namespace content
+
+#endif // CHROME_BROWSER_COMPONENT_WEB_CONTENTS_DELEGATE_ANDROID_COMPONENT_JNI_REGISTRAR_H_
+
diff --git a/content/components/web_contents_delegate_android/java/src/org/chromium/content/components/web_contents_delegate_android/WebContentsDelegateAndroid.java b/content/components/web_contents_delegate_android/java/src/org/chromium/content/components/web_contents_delegate_android/WebContentsDelegateAndroid.java
new file mode 100644
index 0000000..1fc4687
--- /dev/null
+++ b/content/components/web_contents_delegate_android/java/src/org/chromium/content/components/web_contents_delegate_android/WebContentsDelegateAndroid.java
@@ -0,0 +1,122 @@
+// 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.
+
+package org.chromium.content.components.web_contents_delegate_android;
+
+import android.graphics.Rect;
+import android.view.KeyEvent;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+import org.chromium.content.browser.ContentViewCore;
+
+/**
+ * Java peer of the native class of the same name.
+ */
+@JNINamespace("content")
+public class WebContentsDelegateAndroid {
+
+ // Equivalent of WebCore::WebConsoleMessage::LevelTip.
+ public static final int LOG_LEVEL_TIP = 0;
+ // Equivalent of WebCore::WebConsoleMessage::LevelLog.
+ public static final int LOG_LEVEL_LOG = 1;
+ // Equivalent of WebCore::WebConsoleMessage::LevelWarning.
+ public static final int LOG_LEVEL_WARNING = 2;
+ // Equivalent of WebCore::WebConsoleMessage::LevelError.
+ public static final int LOG_LEVEL_ERROR = 3;
+ // The most recent load progress callback received from WebContents, as a percentage.
+ // Initialize to 100 to indicate that we're not in a loading state.
+ private int mMostRecentProgress = 100;
+
+ public int getMostRecentProgress() {
+ return mMostRecentProgress;
+ }
+
+ @CalledByNative
+ public void openNewTab(String url, boolean incognito) {
+ }
+
+ @CalledByNative
+ public boolean addNewContents(int nativeSourceWebContents, int nativeWebContents,
+ int disposition, Rect initialPosition, boolean userGesture) {
+ return false;
+ }
+
+ @CalledByNative
+ public void closeContents() {
+ }
+
+ @CalledByNative
+ public void onUrlStarredChanged(boolean starred) {
+ }
+
+ @CalledByNative
+ public void onLoadStarted() {
+ }
+
+ @CalledByNative
+ public void onLoadStopped() {
+ }
+
+ @CalledByNative
+ public void onTitleUpdated() {
+ }
+
+ @SuppressWarnings("unused")
+ @CalledByNative
+ private final void onLoadProgressChanged(double progress) {
+ mMostRecentProgress = (int) (100.0 * progress);
+ onLoadProgressChanged(mMostRecentProgress);
+ }
+
+ public void onLoadProgressChanged(int progress) {
+ }
+
+ @CalledByNative
+ public void onUpdateUrl(String url) {
+ }
+
+ @CalledByNative
+ public boolean takeFocus(boolean reverse) {
+ return false;
+ }
+
+ @CalledByNative
+ public void handleKeyboardEvent(KeyEvent event) {
+ // TODO(bulach): we probably want to re-inject the KeyEvent back into
+ // the system. Investigate if this is at all possible.
+ }
+
+ /**
+ * Report a JavaScript console message.
+ *
+ * @param level message level. One of WebContentsDelegateAndroid.LOG_LEVEL*.
+ * @param message the error message.
+ * @param lineNumber the line number int the source file at which the error is reported.
+ * @param sourceId the name of the source file that caused the error.
+ * @return true if the client will handle logging the message.
+ */
+ @CalledByNative
+ public boolean addMessageToConsole(int level, String message, int lineNumber,
+ String sourceId) {
+ return false;
+ }
+
+ /**
+ * Report a form resubmission. The overwriter of this function should eventually call
+ * either of ContentViewCore.ContinuePendingReload or ContentViewCore.CancelPendingReload.
+ */
+ @CalledByNative
+ public void showRepostFormWarningDialog(ContentViewCore contentViewCore) {
+ }
+
+ @CalledByNative
+ public void toggleFullscreenModeForTab(boolean enterFullscreen) {
+ }
+
+ @CalledByNative
+ public boolean isFullscreenForTabOrPending() {
+ return false;
+ }
+}
diff --git a/content/components/web_contents_delegate_android/web_contents_delegate_android.cc b/content/components/web_contents_delegate_android/web_contents_delegate_android.cc
new file mode 100644
index 0000000..9256aa3
--- /dev/null
+++ b/content/components/web_contents_delegate_android/web_contents_delegate_android.cc
@@ -0,0 +1,317 @@
+// 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 "content/components/web_contents_delegate_android/web_contents_delegate_android.h"
+
+#include <android/keycodes.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "content/public/browser/android/content_view_core.h"
+#include "content/public/browser/render_widget_host_view.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/WebContentsDelegateAndroid_jni.h"
+#include "ui/gfx/rect.h"
+#include "webkit/glue/window_open_disposition.h"
+
+using base::android::AttachCurrentThread;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ConvertUTF16ToJavaString;
+using base::android::HasClass;
+using base::android::ScopedJavaLocalRef;
+
+namespace content {
+
+WebContentsDelegateAndroid::WebContentsDelegateAndroid(JNIEnv* env, jobject obj)
+ : weak_java_delegate_(env, obj) {
+}
+
+WebContentsDelegateAndroid::~WebContentsDelegateAndroid() {
+}
+
+ScopedJavaLocalRef<jobject>
+WebContentsDelegateAndroid::GetJavaDelegate(JNIEnv* env) const {
+ return weak_java_delegate_.get(env);
+}
+
+// ----------------------------------------------------------------------------
+// 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* WebContentsDelegateAndroid::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;
+ }
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return WebContentsDelegate::OpenURLFromTab(source, params);
+
+ 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_WebContentsDelegateAndroid_openNewTab(env,
+ obj.obj(),
+ java_url.obj(),
+ disposition == OFF_THE_RECORD);
+ return NULL;
+ }
+
+ source->GetController().LoadURL(url, params.referrer, transition,
+ std::string());
+ return source;
+}
+
+void WebContentsDelegateAndroid::NavigationStateChanged(
+ const WebContents* source, unsigned changed_flags) {
+ if (changed_flags & INVALIDATE_TYPE_TITLE) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_onTitleUpdated(
+ env, obj.obj());
+ }
+}
+
+void WebContentsDelegateAndroid::AddNewContents(
+ WebContents* source,
+ WebContents* new_contents,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture,
+ bool* was_blocked) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ bool handled = false;
+ if (!obj.is_null()) {
+ handled = Java_WebContentsDelegateAndroid_addNewContents(
+ env,
+ obj.obj(),
+ reinterpret_cast<jint>(source),
+ reinterpret_cast<jint>(new_contents),
+ static_cast<jint>(disposition),
+ NULL,
+ user_gesture);
+ }
+ if (!handled)
+ delete new_contents;
+}
+
+void WebContentsDelegateAndroid::ActivateContents(WebContents* contents) {
+ // TODO(dtrainor) When doing the merge I came across this. Should we be
+ // activating this tab here?
+}
+
+void WebContentsDelegateAndroid::DeactivateContents(WebContents* contents) {
+ // Do nothing.
+}
+
+void WebContentsDelegateAndroid::LoadingStateChanged(WebContents* source) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ bool has_stopped = source == NULL || !source->IsLoading();
+
+ if (has_stopped)
+ Java_WebContentsDelegateAndroid_onLoadStopped(env, obj.obj());
+ else
+ Java_WebContentsDelegateAndroid_onLoadStarted(env, obj.obj());
+}
+
+void WebContentsDelegateAndroid::LoadProgressChanged(WebContents* source,
+ double progress) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_onLoadProgressChanged(
+ env,
+ obj.obj(),
+ progress);
+}
+
+void WebContentsDelegateAndroid::CloseContents(WebContents* source) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_closeContents(env, obj.obj());
+}
+
+void WebContentsDelegateAndroid::MoveContents(WebContents* source,
+ const gfx::Rect& pos) {
+ // Do nothing.
+}
+
+bool WebContentsDelegateAndroid::AddMessageToConsole(
+ WebContents* source,
+ int32 level,
+ const string16& message,
+ int32 line_no,
+ const string16& source_id) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return WebContentsDelegate::AddMessageToConsole(source, level, message,
+ line_no, source_id);
+ ScopedJavaLocalRef<jstring> jmessage(ConvertUTF16ToJavaString(env, message));
+ ScopedJavaLocalRef<jstring> jsource_id(
+ ConvertUTF16ToJavaString(env, source_id));
+ int jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_TIP;
+ switch (level) {
+ case logging::LOG_VERBOSE:
+ jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_TIP;
+ break;
+ case logging::LOG_INFO:
+ jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_LOG;
+ break;
+ case logging::LOG_WARNING:
+ jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_WARNING;
+ break;
+ case logging::LOG_ERROR:
+ jlevel = WEB_CONTENTS_DELEGATE_LOG_LEVEL_ERROR;
+ break;
+ default:
+ NOTREACHED();
+ }
+ return Java_WebContentsDelegateAndroid_addMessageToConsole(
+ env,
+ GetJavaDelegate(env).obj(),
+ jlevel,
+ jmessage.obj(),
+ line_no,
+ jsource_id.obj());
+}
+
+// TODO(merge): WARNING! method no longer available on the base class.
+// See http://crbug.com/149477
+void WebContentsDelegateAndroid::URLStarredChanged(WebContents* source,
+ bool starred) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_onUrlStarredChanged(env, obj.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 WebContentsDelegateAndroid::UpdateTargetURL(WebContents* source,
+ int32 page_id,
+ const GURL& url) {
+ if (!url.is_empty())
+ return;
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ ScopedJavaLocalRef<jstring> java_url =
+ ConvertUTF8ToJavaString(env, source->GetURL().spec());
+ Java_WebContentsDelegateAndroid_onUpdateUrl(env,
+ obj.obj(),
+ java_url.obj());
+}
+
+void WebContentsDelegateAndroid::HandleKeyboardEvent(
+ WebContents* source,
+ const NativeWebKeyboardEvent& event) {
+ jobject key_event = event.os_event;
+ if (key_event) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_handleKeyboardEvent(
+ env, obj.obj(), key_event);
+ }
+}
+
+bool WebContentsDelegateAndroid::TakeFocus(WebContents* source, bool reverse) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return WebContentsDelegate::TakeFocus(source, reverse);
+ return Java_WebContentsDelegateAndroid_takeFocus(
+ env, obj.obj(), reverse);
+}
+
+void WebContentsDelegateAndroid::ShowRepostFormWarningDialog(
+ WebContents* source) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ ScopedJavaLocalRef<jobject> content_view_core =
+ ContentViewCore::FromWebContents(source)->GetJavaObject();
+ if (content_view_core.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_showRepostFormWarningDialog(env, obj.obj(),
+ content_view_core.obj());
+}
+
+void WebContentsDelegateAndroid::ToggleFullscreenModeForTab(
+ WebContents* web_contents,
+ bool enter_fullscreen) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return;
+ Java_WebContentsDelegateAndroid_toggleFullscreenModeForTab(
+ env, obj.obj(), enter_fullscreen);
+}
+
+bool WebContentsDelegateAndroid::IsFullscreenForTabOrPending(
+ const WebContents* web_contents) const {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+ if (obj.is_null())
+ return false;
+ return Java_WebContentsDelegateAndroid_isFullscreenForTabOrPending(
+ env, obj.obj());
+}
+
+// ----------------------------------------------------------------------------
+// Native JNI methods
+// ----------------------------------------------------------------------------
+
+// Register native methods
+
+bool RegisterWebContentsDelegateAndroid(JNIEnv* env) {
+ if (!HasClass(env, kWebContentsDelegateAndroidClassPath)) {
+ DLOG(ERROR) << "Unable to find class WebContentsDelegateAndroid!";
+ return false;
+ }
+ return RegisterNativesImpl(env);
+}
+
+} // namespace content
diff --git a/content/components/web_contents_delegate_android/web_contents_delegate_android.h b/content/components/web_contents_delegate_android/web_contents_delegate_android.h
new file mode 100644
index 0000000..967177c
--- /dev/null
+++ b/content/components/web_contents_delegate_android/web_contents_delegate_android.h
@@ -0,0 +1,111 @@
+// 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.
+
+#ifndef CHROME_BROWSER_COMPONENT_WEB_CONTENTS_DELEGATE_ANDROID_WEB_CONTENTS_DELEGATE_ANDROID_H_
+#define CHROME_BROWSER_COMPONENT_WEB_CONTENTS_DELEGATE_ANDROID_WEB_CONTENTS_DELEGATE_ANDROID_H_
+
+#include "base/android/jni_helper.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/compiler_specific.h"
+#include "base/memory/scoped_ptr.h"
+#include "content/public/browser/native_web_keyboard_event.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/common/javascript_message_type.h"
+#include "content/public/common/referrer.h"
+#include "googleurl/src/gurl.h"
+#include "net/base/net_errors.h"
+
+namespace content {
+class JavaScriptDialogCreator;
+class RenderViewHost;
+class WebContents;
+class WebContentsObserver;
+struct NativeWebKeyboardEvent;
+
+enum WebContentsDelegateLogLevel {
+ // Equivalent of WebCore::WebConsoleMessage::LevelTip.
+ WEB_CONTENTS_DELEGATE_LOG_LEVEL_TIP = 0,
+ // Equivalent of WebCore::WebConsoleMessage::LevelLog.
+ WEB_CONTENTS_DELEGATE_LOG_LEVEL_LOG = 1,
+ // Equivalent of WebCore::WebConsoleMessage::LevelWarning.
+ WEB_CONTENTS_DELEGATE_LOG_LEVEL_WARNING = 2,
+ // Equivalent of WebCore::WebConsoleMessage::LevelError.
+ WEB_CONTENTS_DELEGATE_LOG_LEVEL_ERROR = 3,
+};
+
+
+// Native underpinnings of WebContentsDelegateAndroid.java. Provides a default
+// delegate for WebContents to forward calls to the java peer. The embedding
+// application may subclass and override methods on either the C++ or Java side
+// as required.
+class WebContentsDelegateAndroid : public WebContentsDelegate {
+ public:
+ WebContentsDelegateAndroid(JNIEnv* env, jobject obj);
+ virtual ~WebContentsDelegateAndroid();
+
+ // Binds this WebContentsDelegateAndroid to the passed WebContents instance,
+ // such that when that WebContents is destroyed, this
+ // WebContentsDelegateAndroid instance will be destroyed too.
+ void SetOwnerWebContents(WebContents* contents);
+
+ // Overridden from WebContentsDelegate:
+ virtual WebContents* OpenURLFromTab(
+ WebContents* source,
+ const OpenURLParams& params) OVERRIDE;
+
+ virtual void NavigationStateChanged(const WebContents* source,
+ unsigned changed_flags) OVERRIDE;
+ virtual void AddNewContents(WebContents* source,
+ WebContents* new_contents,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture,
+ bool* was_blocked) OVERRIDE;
+ virtual void ActivateContents(WebContents* contents) OVERRIDE;
+ virtual void DeactivateContents(WebContents* contents) OVERRIDE;
+ virtual void LoadingStateChanged(WebContents* source) OVERRIDE;
+ virtual void LoadProgressChanged(WebContents* source,
+ double load_progress) OVERRIDE;
+ virtual void CloseContents(WebContents* source) OVERRIDE;
+ virtual void MoveContents(WebContents* source,
+ const gfx::Rect& pos) OVERRIDE;
+ virtual bool AddMessageToConsole(WebContents* source,
+ int32 level,
+ const string16& message,
+ int32 line_no,
+ const string16& source_id) OVERRIDE;
+ // TODO(merge): WARNING! method no longer available on the base class.
+ // See http://crbug.com/149477
+ virtual void URLStarredChanged(WebContents* source, bool starred);
+ virtual void UpdateTargetURL(WebContents* source,
+ int32 page_id,
+ const GURL& url) OVERRIDE;
+ virtual void HandleKeyboardEvent(
+ WebContents* source,
+ const NativeWebKeyboardEvent& event) OVERRIDE;
+ virtual bool TakeFocus(WebContents* source, bool reverse) OVERRIDE;
+
+ virtual void ShowRepostFormWarningDialog(WebContents* source) OVERRIDE;
+
+ virtual void ToggleFullscreenModeForTab(content::WebContents* web_contents,
+ bool enter_fullscreen) OVERRIDE;
+ virtual bool IsFullscreenForTabOrPending(
+ const content::WebContents* web_contents) const OVERRIDE;
+
+ protected:
+ base::android::ScopedJavaLocalRef<jobject> GetJavaDelegate(JNIEnv* env) const;
+
+ private:
+ // We depend on the java side user of WebContentDelegateAndroid to hold a
+ // strong reference to that object as long as they want to receive callbacks
+ // on it. Using a weak ref here allows it to be correctly GCed.
+ JavaObjectWeakGlobalRef weak_java_delegate_;
+};
+
+bool RegisterWebContentsDelegateAndroid(JNIEnv* env);
+
+} // namespace content
+
+#endif // CHROME_BROWSER_COMPONENT_WEB_CONTENTS_DELEGATE_ANDROID_WEB_CONTENTS_DELEGATE_ANDROID_H_
diff --git a/content/content.gyp b/content/content.gyp
index 9961de2..a0d3877 100644
--- a/content/content.gyp
+++ b/content/content.gyp
@@ -34,6 +34,7 @@
'includes': [
'../build/win_precompile.gypi',
'content_components_navigation_interception.gypi',
+ 'content_components_web_contents_delegate_android.gypi',
'content_shell.gypi',
],
}],
diff --git a/content/content_components_web_contents_delegate_android.gypi b/content/content_components_web_contents_delegate_android.gypi
new file mode 100644
index 0000000..2d5b96e
--- /dev/null
+++ b/content/content_components_web_contents_delegate_android.gypi
@@ -0,0 +1,62 @@
+# 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.
+
+{
+ 'conditions': [
+ ['OS=="android"', {
+ 'targets': [
+ {
+ 'target_name': 'web_contents_delegate_android',
+ 'type': 'static_library',
+ 'dependencies': [
+ '../base/base.gyp:base',
+ '../net/net.gyp:net',
+ '../skia/skia.gyp:skia',
+ '../ui/ui.gyp:ui',
+ '../webkit/support/webkit_support.gyp:glue',
+ 'content_browser',
+ 'content_common',
+ 'web_contents_delegate_android_jni_headers',
+ ],
+ 'include_dirs': [
+ '..',
+ '../skia/config',
+ '<(SHARED_INTERMEDIATE_DIR)/web_contents_delegate_android',
+ ],
+ 'sources': [
+ 'components/web_contents_delegate_android/component_jni_registrar.cc',
+ 'components/web_contents_delegate_android/component_jni_registrar.h',
+ 'components/web_contents_delegate_android/web_contents_delegate_android.cc',
+ 'components/web_contents_delegate_android/web_contents_delegate_android.h',
+ ],
+ },
+ {
+ 'target_name': 'web_contents_delegate_android_java',
+ 'type': 'none',
+ 'dependencies': [
+ '../base/base.gyp:base',
+ 'content_java',
+ ],
+ 'variables': {
+ 'package_name': 'web_contents_delegate_android',
+ 'java_in_dir': 'components/web_contents_delegate_android/java',
+ },
+ 'includes': [ '../build/java.gypi' ],
+ },
+ {
+ 'target_name': 'web_contents_delegate_android_jni_headers',
+ 'type': 'none',
+ 'sources': [
+ 'components/web_contents_delegate_android/java/src/org/chromium/content/components/web_contents_delegate_android/WebContentsDelegateAndroid.java',
+ ],
+ 'variables': {
+ 'jni_gen_dir': 'web_contents_delegate_android',
+ },
+ 'includes': [ '../build/jni_generator.gypi' ],
+ },
+ ],
+ }],
+ ],
+}