Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(474)

Side by Side Diff: content/browser/web_contents/web_contents_android.cc

Issue 1073983005: Take a snapshot of the AXTree (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@assist-3
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/web_contents/web_contents_android.h" 5 #include "content/browser/web_contents/web_contents_android.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h"
8 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
9 #include "base/command_line.h" 10 #include "base/command_line.h"
10 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
11 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "content/browser/accessibility/browser_accessibility_android.h"
14 #include "content/browser/accessibility/browser_accessibility_manager.h"
12 #include "content/browser/android/interstitial_page_delegate_android.h" 15 #include "content/browser/android/interstitial_page_delegate_android.h"
13 #include "content/browser/frame_host/interstitial_page_impl.h" 16 #include "content/browser/frame_host/interstitial_page_impl.h"
14 #include "content/browser/media/android/browser_media_player_manager.h" 17 #include "content/browser/media/android/browser_media_player_manager.h"
15 #include "content/browser/media/media_web_contents_observer.h" 18 #include "content/browser/media/media_web_contents_observer.h"
16 #include "content/browser/renderer_host/render_view_host_impl.h" 19 #include "content/browser/renderer_host/render_view_host_impl.h"
17 #include "content/browser/web_contents/web_contents_impl.h" 20 #include "content/browser/web_contents/web_contents_impl.h"
18 #include "content/common/devtools_messages.h" 21 #include "content/common/devtools_messages.h"
19 #include "content/common/frame_messages.h" 22 #include "content/common/frame_messages.h"
20 #include "content/common/input_messages.h" 23 #include "content/common/input_messages.h"
21 #include "content/common/view_messages.h" 24 #include "content/common/view_messages.h"
22 #include "content/public/browser/browser_context.h" 25 #include "content/public/browser/browser_context.h"
23 #include "content/public/browser/browser_thread.h" 26 #include "content/public/browser/browser_thread.h"
24 #include "content/public/browser/web_contents.h" 27 #include "content/public/browser/web_contents.h"
25 #include "content/public/common/content_switches.h" 28 #include "content/public/common/content_switches.h"
26 #include "jni/WebContentsImpl_jni.h" 29 #include "jni/WebContentsImpl_jni.h"
27 #include "net/android/network_library.h" 30 #include "net/android/network_library.h"
31 #include "ui/accessibility/ax_node_data.h"
28 32
29 using base::android::AttachCurrentThread; 33 using base::android::AttachCurrentThread;
30 using base::android::ConvertJavaStringToUTF8; 34 using base::android::ConvertJavaStringToUTF8;
31 using base::android::ConvertJavaStringToUTF16; 35 using base::android::ConvertJavaStringToUTF16;
32 using base::android::ConvertUTF8ToJavaString; 36 using base::android::ConvertUTF8ToJavaString;
37 using base::android::ConvertUTF16ToJavaString;
33 using base::android::ScopedJavaGlobalRef; 38 using base::android::ScopedJavaGlobalRef;
39 using base::android::ToJavaIntArray;
34 40
35 namespace { 41 namespace {
36 42
37 void JavaScriptResultCallback(const ScopedJavaGlobalRef<jobject>& callback, 43 void JavaScriptResultCallback(const ScopedJavaGlobalRef<jobject>& callback,
38 const base::Value* result) { 44 const base::Value* result) {
39 JNIEnv* env = base::android::AttachCurrentThread(); 45 JNIEnv* env = base::android::AttachCurrentThread();
40 std::string json; 46 std::string json;
41 base::JSONWriter::Write(result, &json); 47 base::JSONWriter::Write(result, &json);
42 ScopedJavaLocalRef<jstring> j_json = ConvertUTF8ToJavaString(env, json); 48 ScopedJavaLocalRef<jstring> j_json = ConvertUTF8ToJavaString(env, json);
43 content::Java_WebContentsImpl_onEvaluateJavaScriptResult( 49 content::Java_WebContentsImpl_onEvaluateJavaScriptResult(
dmazzoni 2015/04/10 19:20:00 Is there a reason not to use "namespace content" i
sgurun-gerrit only 2015/04/10 23:24:50 Done.
44 env, j_json.obj(), callback.obj()); 50 env, j_json.obj(), callback.obj());
45 } 51 }
46 52
53 ScopedJavaLocalRef<jobject> WalkAXTreeDepthFirst(JNIEnv* env,
54 content::BrowserAccessibilityAndroid* node) {
55
56 ScopedJavaLocalRef<jstring> j_text =
57 ConvertUTF16ToJavaString(env,node->GetText());
58 ScopedJavaLocalRef<jstring> j_class =
59 ConvertUTF8ToJavaString(env,node->GetClassName());
60 const gfx::Rect& location = node->GetLocation();
61 ScopedJavaLocalRef<jobject> j_node =
62 content::Java_WebContentsImpl_createAXNode(env,
63 node->GetId(), location.x(), location.y(), node->GetScrollX(),
64 node->GetScrollY(), location.width(), location.height(),
65 j_text.obj(), j_class.obj());
66
67 for(uint32 i = 0; i < node->PlatformChildCount(); i++) {
68 content::BrowserAccessibilityAndroid* child =
69 static_cast<content::BrowserAccessibilityAndroid*>(
70 node->PlatformGetChild(i));
71 content::Java_WebContentsImpl_addAXNodeAsChild(env,
72 j_node.obj(), WalkAXTreeDepthFirst(env, child).obj());
73 }
74 return j_node;
75 }
76
77
78 void AXTreeSnapshotCallback(const ScopedJavaGlobalRef<jobject>& callback,
79 const ui::AXTreeUpdate& result) {
80 JNIEnv* env = base::android::AttachCurrentThread();
81 scoped_ptr<content::BrowserAccessibilityManager> manager(
82 content::BrowserAccessibilityManager::Create(result, nullptr));
83 content::BrowserAccessibilityAndroid* root =
84 static_cast<content::BrowserAccessibilityAndroid*>(manager->GetRoot());
85 // TODO(sgurun) check if root can be null here.
dmazzoni 2015/04/10 19:20:00 You should probably first check if result.nodes is
sgurun-gerrit only 2015/04/10 23:24:50 Thanks, for webview we probably don't worry too mu
boliu 2015/04/10 23:47:17 Drive by meta-comment: Single-process-ness of web
86 ScopedJavaLocalRef<jobject> j_root = WalkAXTreeDepthFirst(env, root);
87 content::Java_WebContentsImpl_onAXTreeSnapshot(
88 env, j_root.obj(), callback.obj());
89 }
90
47 void ReleaseAllMediaPlayers(content::WebContents* web_contents, 91 void ReleaseAllMediaPlayers(content::WebContents* web_contents,
48 content::RenderFrameHost* render_frame_host) { 92 content::RenderFrameHost* render_frame_host) {
49 content::BrowserMediaPlayerManager* manager = 93 content::BrowserMediaPlayerManager* manager =
50 static_cast<content::WebContentsImpl*>(web_contents)-> 94 static_cast<content::WebContentsImpl*>(web_contents)->
51 media_web_contents_observer()->GetMediaPlayerManager( 95 media_web_contents_observer()->GetMediaPlayerManager(
52 render_frame_host); 96 render_frame_host);
53 if (manager) 97 if (manager)
54 manager->ReleaseAllMediaPlayers(); 98 manager->ReleaseAllMediaPlayers();
55 } 99 }
56 100
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 JNIEnv* env, 543 JNIEnv* env,
500 jobject jobj) { 544 jobject jobj) {
501 return static_cast<content::WebContentsImpl*>(web_contents_)-> 545 return static_cast<content::WebContentsImpl*>(web_contents_)->
502 HasAccessedInitialDocument(); 546 HasAccessedInitialDocument();
503 } 547 }
504 548
505 jint WebContentsAndroid::GetThemeColor(JNIEnv* env, jobject obj) { 549 jint WebContentsAndroid::GetThemeColor(JNIEnv* env, jobject obj) {
506 return web_contents_->GetThemeColor(); 550 return web_contents_->GetThemeColor();
507 } 551 }
508 552
553 void WebContentsAndroid::RequestAXTreeSnapshot(JNIEnv* env,
554 jobject obj,
555 jobject callback) {
556 // Secure the Java callback in a scoped object and give ownership of it to the
557 // base::Callback.
558 ScopedJavaGlobalRef<jobject> j_callback;
559 j_callback.Reset(env, callback);
560 content::WebContentsImpl::AXTreeSnapshotCallback snapshot_callback =
561 base::Bind(&AXTreeSnapshotCallback, j_callback);
562
563 static_cast<WebContentsImpl*>(web_contents_)->RequestAXTreeSnapshot(
564 snapshot_callback);
565 }
566
509 } // namespace content 567 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698