- add sources.
[platform/framework/web/crosswalk.git] / src / content / browser / android / web_contents_observer_android.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/android/web_contents_observer_android.h"
6
7 #include <string>
8
9 #include <jni.h>
10
11 #include "base/android/jni_android.h"
12 #include "base/android/jni_string.h"
13 #include "base/android/scoped_java_ref.h"
14 #include "content/browser/android/content_view_core_impl.h"
15 #include "content/browser/renderer_host/render_widget_host_impl.h"
16 #include "content/browser/web_contents/web_contents_impl.h"
17 #include "content/public/browser/navigation_details.h"
18 #include "content/public/browser/navigation_entry.h"
19 #include "jni/WebContentsObserverAndroid_jni.h"
20
21 using base::android::AttachCurrentThread;
22 using base::android::ScopedJavaLocalRef;
23 using base::android::ConvertUTF8ToJavaString;
24 using base::android::ConvertUTF16ToJavaString;
25
26 namespace content {
27
28 WebContentsObserverAndroid::WebContentsObserverAndroid(
29     JNIEnv* env,
30     jobject obj,
31     WebContents* web_contents)
32     : WebContentsObserver(web_contents),
33       weak_java_observer_(env, obj){
34 }
35
36 WebContentsObserverAndroid::~WebContentsObserverAndroid() {
37 }
38
39 jint Init(JNIEnv* env, jobject obj, jint native_content_view_core) {
40   ContentViewCore* content_view_core =
41       reinterpret_cast<ContentViewCore*>(native_content_view_core);
42   WebContentsObserverAndroid* native_observer = new WebContentsObserverAndroid(
43       env, obj, content_view_core->GetWebContents());
44   return reinterpret_cast<jint>(native_observer);
45 }
46
47 void WebContentsObserverAndroid::Destroy(JNIEnv* env, jobject obj) {
48   delete this;
49 }
50
51 void WebContentsObserverAndroid::WebContentsDestroyed(
52     WebContents* web_contents) {
53   JNIEnv* env = AttachCurrentThread();
54   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
55   if (obj.is_null()) {
56     delete this;
57   } else {
58     // The java side will destroy |this|
59     Java_WebContentsObserverAndroid_detachFromWebContents(env, obj.obj());
60   }
61 }
62
63 void WebContentsObserverAndroid::DidStartLoading(
64     RenderViewHost* render_view_host) {
65   JNIEnv* env = AttachCurrentThread();
66   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
67   if (obj.is_null())
68     return;
69   ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
70       env, web_contents()->GetVisibleURL().spec()));
71   Java_WebContentsObserverAndroid_didStartLoading(
72       env, obj.obj(), jstring_url.obj());
73 }
74
75 void WebContentsObserverAndroid::DidStopLoading(
76     RenderViewHost* render_view_host) {
77   JNIEnv* env = AttachCurrentThread();
78   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
79   if (obj.is_null())
80     return;
81
82   std::string url_string;
83   NavigationEntry* entry =
84     web_contents()->GetController().GetLastCommittedEntry();
85   // Not that GetBaseURLForDataURL is only used by the Android WebView
86   if (entry && !entry->GetBaseURLForDataURL().is_empty()) {
87     url_string = entry->GetBaseURLForDataURL().possibly_invalid_spec();
88   } else {
89     url_string = web_contents()->GetLastCommittedURL().spec();
90   }
91
92   ScopedJavaLocalRef<jstring> jstring_url(
93       ConvertUTF8ToJavaString(env, url_string));
94   Java_WebContentsObserverAndroid_didStopLoading(
95       env, obj.obj(), jstring_url.obj());
96 }
97
98 void WebContentsObserverAndroid::DidFailProvisionalLoad(
99     int64 frame_id,
100     const string16& frame_unique_name,
101     bool is_main_frame,
102     const GURL& validated_url,
103     int error_code,
104     const string16& error_description,
105     RenderViewHost* render_view_host) {
106   DidFailLoadInternal(
107         true, is_main_frame, error_code, error_description, validated_url);
108 }
109
110 void WebContentsObserverAndroid::DidFailLoad(
111     int64 frame_id,
112     const GURL& validated_url,
113     bool is_main_frame,
114     int error_code,
115     const string16& error_description,
116     RenderViewHost* render_view_host) {
117   DidFailLoadInternal(
118         false, is_main_frame, error_code, error_description, validated_url);
119 }
120
121 void WebContentsObserverAndroid::DidNavigateMainFrame(
122     const LoadCommittedDetails& details,
123     const FrameNavigateParams& params) {
124   JNIEnv* env = AttachCurrentThread();
125   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
126   if (obj.is_null())
127     return;
128   ScopedJavaLocalRef<jstring> jstring_url(
129       ConvertUTF8ToJavaString(env, params.url.spec()));
130   ScopedJavaLocalRef<jstring> jstring_base_url(
131       ConvertUTF8ToJavaString(env, params.base_url.spec()));
132   Java_WebContentsObserverAndroid_didNavigateMainFrame(
133       env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
134       details.is_navigation_to_different_page());
135 }
136
137 void WebContentsObserverAndroid::DidNavigateAnyFrame(
138     const LoadCommittedDetails& details,
139     const FrameNavigateParams& params) {
140   JNIEnv* env = AttachCurrentThread();
141   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
142   if (obj.is_null())
143     return;
144   ScopedJavaLocalRef<jstring> jstring_url(
145       ConvertUTF8ToJavaString(env, params.url.spec()));
146   ScopedJavaLocalRef<jstring> jstring_base_url(
147       ConvertUTF8ToJavaString(env, params.base_url.spec()));
148   jboolean jboolean_is_reload =
149       PageTransitionCoreTypeIs(params.transition, PAGE_TRANSITION_RELOAD);
150
151   Java_WebContentsObserverAndroid_didNavigateAnyFrame(
152       env, obj.obj(), jstring_url.obj(), jstring_base_url.obj(),
153       jboolean_is_reload);
154 }
155
156 void WebContentsObserverAndroid::DidStartProvisionalLoadForFrame(
157       int64 frame_id,
158       int64 parent_frame_id,
159       bool is_main_frame,
160       const GURL& validated_url,
161       bool is_error_page,
162       bool is_iframe_srcdoc,
163       RenderViewHost* render_view_host) {
164   JNIEnv* env = AttachCurrentThread();
165   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
166   if (obj.is_null())
167     return;
168   ScopedJavaLocalRef<jstring> jstring_url(
169       ConvertUTF8ToJavaString(env, validated_url.spec()));
170   Java_WebContentsObserverAndroid_didStartProvisionalLoadForFrame(
171       env, obj.obj(), frame_id, parent_frame_id, is_main_frame,
172       jstring_url.obj(), is_error_page, is_iframe_srcdoc);
173 }
174
175 void WebContentsObserverAndroid::DidCommitProvisionalLoadForFrame(
176       int64 frame_id,
177       const string16& frame_unique_name,
178       bool is_main_frame,
179       const GURL& url,
180       PageTransition transition_type,
181       RenderViewHost* render_view_host) {
182   JNIEnv* env = AttachCurrentThread();
183   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
184   if (obj.is_null())
185     return;
186   ScopedJavaLocalRef<jstring> jstring_url(
187       ConvertUTF8ToJavaString(env, url.spec()));
188   Java_WebContentsObserverAndroid_didCommitProvisionalLoadForFrame(
189       env, obj.obj(), frame_id, is_main_frame, jstring_url.obj(),
190       transition_type);
191 }
192
193 void WebContentsObserverAndroid::DidFinishLoad(
194     int64 frame_id,
195     const GURL& validated_url,
196     bool is_main_frame,
197     RenderViewHost* render_view_host) {
198   JNIEnv* env = AttachCurrentThread();
199   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
200   if (obj.is_null())
201     return;
202   ScopedJavaLocalRef<jstring> jstring_url(
203       ConvertUTF8ToJavaString(env, validated_url.spec()));
204   Java_WebContentsObserverAndroid_didFinishLoad(
205       env, obj.obj(), frame_id, jstring_url.obj(), is_main_frame);
206 }
207
208 void WebContentsObserverAndroid::NavigationEntryCommitted(
209     const LoadCommittedDetails& load_details) {
210   JNIEnv* env = AttachCurrentThread();
211   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
212   if (obj.is_null())
213     return;
214   Java_WebContentsObserverAndroid_navigationEntryCommitted(env, obj.obj());
215 }
216
217 void WebContentsObserverAndroid::DidChangeVisibleSSLState() {
218   JNIEnv* env = AttachCurrentThread();
219   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
220   if (obj.is_null())
221     return;
222   Java_WebContentsObserverAndroid_didChangeVisibleSSLState(env, obj.obj());
223 }
224
225 void WebContentsObserverAndroid::DidAttachInterstitialPage() {
226   JNIEnv* env = AttachCurrentThread();
227   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
228   if (obj.is_null())
229     return;
230   Java_WebContentsObserverAndroid_didAttachInterstitialPage(env, obj.obj());
231 }
232
233 void WebContentsObserverAndroid::DidDetachInterstitialPage() {
234   JNIEnv* env = AttachCurrentThread();
235   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
236   if (obj.is_null())
237     return;
238   Java_WebContentsObserverAndroid_didDetachInterstitialPage(env, obj.obj());
239 }
240
241 void WebContentsObserverAndroid::DidFailLoadInternal(
242     bool is_provisional_load,
243     bool is_main_frame,
244     int error_code,
245     const string16& description,
246     const GURL& url) {
247   JNIEnv* env = AttachCurrentThread();
248   ScopedJavaLocalRef<jobject> obj(weak_java_observer_.get(env));
249   if (obj.is_null())
250     return;
251   ScopedJavaLocalRef<jstring> jstring_error_description(
252       ConvertUTF16ToJavaString(env, description));
253   ScopedJavaLocalRef<jstring> jstring_url(
254       ConvertUTF8ToJavaString(env, url.spec()));
255
256   Java_WebContentsObserverAndroid_didFailLoad(
257       env, obj.obj(),
258       is_provisional_load,
259       is_main_frame,
260       error_code,
261       jstring_error_description.obj(), jstring_url.obj());
262 }
263
264 bool RegisterWebContentsObserverAndroid(JNIEnv* env) {
265   return RegisterNativesImpl(env);
266 }
267 }  // namespace content