1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// 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 "android_webview/native/aw_web_contents_delegate.h"
#include "android_webview/browser/find_helper.h"
#include "android_webview/native/aw_contents.h"
#include "android_webview/native/aw_javascript_dialog_creator.h"
#include "base/android/scoped_java_ref.h"
#include "base/lazy_instance.h"
#include "base/message_loop.h"
#include "content/public/browser/android/download_controller_android.h"
#include "content/public/browser/web_contents.h"
#include "jni/AwWebContentsDelegate_jni.h"
#include "net/http/http_request_headers.h"
using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef;
using content::WebContents;
namespace android_webview {
static base::LazyInstance<AwJavaScriptDialogCreator>::Leaky
g_javascript_dialog_creator = LAZY_INSTANCE_INITIALIZER;
AwWebContentsDelegate::AwWebContentsDelegate(
JNIEnv* env,
jobject obj)
: WebContentsDelegateAndroid(env, obj) {
}
AwWebContentsDelegate::~AwWebContentsDelegate() {
}
content::JavaScriptDialogCreator*
AwWebContentsDelegate::GetJavaScriptDialogCreator() {
return g_javascript_dialog_creator.Pointer();
}
void AwWebContentsDelegate::FindReply(WebContents* web_contents,
int request_id,
int number_of_matches,
const gfx::Rect& selection_rect,
int active_match_ordinal,
bool final_update) {
AwContents* aw_contents = AwContents::FromWebContents(web_contents);
if (!aw_contents)
return;
aw_contents->GetFindHelper()->HandleFindReply(request_id,
number_of_matches,
active_match_ordinal,
final_update);
}
bool AwWebContentsDelegate::CanDownload(content::RenderViewHost* source,
int request_id,
const std::string& request_method) {
if (request_method == net::HttpRequestHeaders::kGetMethod) {
content::DownloadControllerAndroid::Get()->CreateGETDownload(
source, request_id);
}
return false;
}
void AwWebContentsDelegate::OnStartDownload(WebContents* source,
content::DownloadItem* download) {
NOTREACHED(); // We always return false in CanDownload.
}
void AwWebContentsDelegate::AddNewContents(content::WebContents* source,
content::WebContents* new_contents,
WindowOpenDisposition disposition,
const gfx::Rect& initial_pos,
bool user_gesture,
bool* was_blocked) {
JNIEnv* env = AttachCurrentThread();
bool is_dialog = disposition == NEW_POPUP;
ScopedJavaLocalRef<jobject> java_delegate = GetJavaDelegate(env);
bool create_popup = false;
if (java_delegate.obj()) {
create_popup = Java_AwWebContentsDelegate_addNewContents(env,
java_delegate.obj(), is_dialog, user_gesture);
}
if (create_popup) {
// The embedder would like to display the popup and we will receive
// a callback from them later with an AwContents to use to display
// it. The source AwContents takes ownership of the new WebContents
// until then, and when the callback is made we will swap the WebContents
// out into the new AwContents.
AwContents::FromWebContents(source)->SetPendingWebContentsForPopup(
make_scoped_ptr(new_contents));
// Hide the WebContents for the pop up now, we will show it again
// when the user calls us back with an AwContents to use to show it.
new_contents->WasHidden();
} else {
// The embedder has forgone their chance to display this popup
// window, so we're done with the WebContents now. We use
// DeleteSoon as WebContentsImpl may call methods on |new_contents|
// after this method returns.
MessageLoop::current()->DeleteSoon(FROM_HERE, new_contents);
}
if (was_blocked) {
*was_blocked = !create_popup;
}
}
void AwWebContentsDelegate::CloseContents(content::WebContents* source) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> java_delegate = GetJavaDelegate(env);
if (java_delegate.obj()) {
Java_AwWebContentsDelegate_closeContents(env, java_delegate.obj());
}
}
void AwWebContentsDelegate::ActivateContents(content::WebContents* contents) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobject> java_delegate = GetJavaDelegate(env);
if (java_delegate.obj()) {
Java_AwWebContentsDelegate_activateContents(env, java_delegate.obj());
}
}
bool RegisterAwWebContentsDelegate(JNIEnv* env) {
return RegisterNativesImpl(env);
}
} // namespace android_webview
|