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

Side by Side Diff: android_webview/browser/browser_view_renderer_impl.cc

Issue 12668003: Fix for crash in testWindows test (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: mutual deregistration Created 7 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « android_webview/browser/browser_view_renderer_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "android_webview/browser/browser_view_renderer_impl.h" 5 #include "android_webview/browser/browser_view_renderer_impl.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <sys/system_properties.h> 8 #include <sys/system_properties.h>
9 9
10 #include "android_webview/common/renderer_picture_map.h" 10 #include "android_webview/common/renderer_picture_map.h"
(...skipping 25 matching lines...) Expand all
36 #ifndef GL_TEXTURE_BINDING_EXTERNAL_OES 36 #ifndef GL_TEXTURE_BINDING_EXTERNAL_OES
37 #define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 37 #define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67
38 #endif 38 #endif
39 39
40 using base::android::AttachCurrentThread; 40 using base::android::AttachCurrentThread;
41 using base::android::JavaRef; 41 using base::android::JavaRef;
42 using base::android::ScopedJavaLocalRef; 42 using base::android::ScopedJavaLocalRef;
43 using content::Compositor; 43 using content::Compositor;
44 using content::ContentViewCore; 44 using content::ContentViewCore;
45 45
46 namespace android_webview {
47
46 namespace { 48 namespace {
47 49
48 // Provides software rendering functions from the Android glue layer. 50 // Provides software rendering functions from the Android glue layer.
49 // Allows preventing extra copies of data when rendering. 51 // Allows preventing extra copies of data when rendering.
50 AwDrawSWFunctionTable* g_sw_draw_functions = NULL; 52 AwDrawSWFunctionTable* g_sw_draw_functions = NULL;
51 53
52 // Tells if the Skia library versions in Android and Chromium are compatible. 54 // Tells if the Skia library versions in Android and Chromium are compatible.
53 // If they are then it's possible to pass Skia objects like SkPictures to the 55 // If they are then it's possible to pass Skia objects like SkPictures to the
54 // Android glue layer via the SW rendering functions. 56 // Android glue layer via the SW rendering functions.
55 // If they are not, then additional copies and rasterizations are required 57 // If they are not, then additional copies and rasterizations are required
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 95 }
94 96
95 if (AndroidBitmap_unlockPixels(env, jbitmap.obj()) < 0) { 97 if (AndroidBitmap_unlockPixels(env, jbitmap.obj()) < 0) {
96 LOG(ERROR) << "Error unlocking java bitmap pixels."; 98 LOG(ERROR) << "Error unlocking java bitmap pixels.";
97 return false; 99 return false;
98 } 100 }
99 101
100 return succeeded; 102 return succeeded;
101 } 103 }
102 104
105 const void* kUserDataKey = &kUserDataKey;
106
103 } // namespace 107 } // namespace
104 108
105 namespace android_webview { 109 class BrowserViewRendererImpl::UserData : public content::WebContents::Data {
110 public:
111 UserData(BrowserViewRendererImpl* ptr) : instance_(ptr) {}
112 virtual ~UserData() {
113 instance_->WebContentsGone();
114 }
115
116 static BrowserViewRendererImpl* GetInstance(content::WebContents* contents) {
117 if (!contents)
118 return NULL;
119 UserData* data = reinterpret_cast<UserData*>(
120 contents->GetUserData(kUserDataKey));
121 return data ? data->instance_ : NULL;
122 }
123
124 private:
125 BrowserViewRendererImpl* instance_;
126 };
106 127
107 // static 128 // static
108 BrowserViewRendererImpl* BrowserViewRendererImpl::Create( 129 BrowserViewRendererImpl* BrowserViewRendererImpl::Create(
109 BrowserViewRenderer::Client* client, 130 BrowserViewRenderer::Client* client,
110 JavaHelper* java_helper) { 131 JavaHelper* java_helper) {
111 return new BrowserViewRendererImpl(client, java_helper); 132 return new BrowserViewRendererImpl(client, java_helper);
112 } 133 }
113 134
135 // static
136 BrowserViewRendererImpl* BrowserViewRendererImpl::FromWebContents(
137 content::WebContents* contents) {
138 return UserData::GetInstance(contents);
139 }
140
114 BrowserViewRendererImpl::BrowserViewRendererImpl( 141 BrowserViewRendererImpl::BrowserViewRendererImpl(
115 BrowserViewRenderer::Client* client, 142 BrowserViewRenderer::Client* client,
116 JavaHelper* java_helper) 143 JavaHelper* java_helper)
117 : client_(client), 144 : client_(client),
118 java_helper_(java_helper), 145 java_helper_(java_helper),
119 view_renderer_host_(new ViewRendererHost(NULL, this)), 146 view_renderer_host_(new ViewRendererHost(NULL, this)),
120 ALLOW_THIS_IN_INITIALIZER_LIST(compositor_(Compositor::Create(this))), 147 ALLOW_THIS_IN_INITIALIZER_LIST(compositor_(Compositor::Create(this))),
121 view_clip_layer_(cc::Layer::create()), 148 view_clip_layer_(cc::Layer::create()),
122 transform_layer_(cc::Layer::create()), 149 transform_layer_(cc::Layer::create()),
123 scissor_clip_layer_(cc::Layer::create()), 150 scissor_clip_layer_(cc::Layer::create()),
(...skipping 27 matching lines...) Expand all
151 void BrowserViewRendererImpl::SetAwDrawSWFunctionTable( 178 void BrowserViewRendererImpl::SetAwDrawSWFunctionTable(
152 AwDrawSWFunctionTable* table) { 179 AwDrawSWFunctionTable* table) {
153 g_sw_draw_functions = table; 180 g_sw_draw_functions = table;
154 g_is_skia_version_compatible = 181 g_is_skia_version_compatible =
155 g_sw_draw_functions->is_skia_version_compatible(&SkGraphics::GetVersion); 182 g_sw_draw_functions->is_skia_version_compatible(&SkGraphics::GetVersion);
156 LOG_IF(WARNING, !g_is_skia_version_compatible) 183 LOG_IF(WARNING, !g_is_skia_version_compatible)
157 << "Skia versions are not compatible, rendering performance will suffer."; 184 << "Skia versions are not compatible, rendering performance will suffer.";
158 } 185 }
159 186
160 void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) { 187 void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) {
188 // First remove association from the prior ContentViewCore / WebContents.
161 if (web_contents_) { 189 if (web_contents_) {
162 ContentViewCore* previous_content_view_core = 190 ContentViewCore* previous_content_view_core =
163 ContentViewCore::FromWebContents(web_contents_); 191 ContentViewCore::FromWebContents(web_contents_);
164 if (previous_content_view_core) { 192 if (previous_content_view_core) {
165 previous_content_view_core->RemoveFrameInfoCallback( 193 previous_content_view_core->RemoveFrameInfoCallback(
166 update_frame_info_callback_); 194 update_frame_info_callback_);
167 } 195 }
196 web_contents_->SetUserData(kUserDataKey, NULL);
197 DCHECK(!web_contents_); // WebContentsGone should have been called.
168 } 198 }
169 199
170 web_contents_ = content_view_core ?
171 content_view_core->GetWebContents() : NULL;
172 view_renderer_host_->Observe(web_contents_);
173
174 if (!content_view_core) 200 if (!content_view_core)
175 return; 201 return;
176 202
203 web_contents_ = content_view_core->GetWebContents();
204 web_contents_->SetUserData(kUserDataKey, new UserData(this));
205 view_renderer_host_->Observe(web_contents_);
206
177 content_view_core->AddFrameInfoCallback(update_frame_info_callback_); 207 content_view_core->AddFrameInfoCallback(update_frame_info_callback_);
178 dpi_scale_ = content_view_core->GetDpiScale(); 208 dpi_scale_ = content_view_core->GetDpiScale();
179 209
180 view_clip_layer_->removeAllChildren(); 210 view_clip_layer_->removeAllChildren();
181 view_clip_layer_->addChild(content_view_core->GetLayer()); 211 view_clip_layer_->addChild(content_view_core->GetLayer());
182 Invalidate(); 212 Invalidate();
183 } 213 }
184 214
215 void BrowserViewRendererImpl::WebContentsGone() {
216 web_contents_ = NULL;
Leandro Graciá Gil 2013/03/11 12:07:54 Should we un-observe in view_renderer_host_?
joth 2013/03/11 16:18:31 No, not really. view_renderer_host_ is a WebConten
217 }
218
185 void BrowserViewRendererImpl::DrawGL(AwDrawGLInfo* draw_info) { 219 void BrowserViewRendererImpl::DrawGL(AwDrawGLInfo* draw_info) {
186 TRACE_EVENT0("android_webview", "BrowserViewRendererImpl::DrawGL"); 220 TRACE_EVENT0("android_webview", "BrowserViewRendererImpl::DrawGL");
187 221
188 if (view_size_.IsEmpty() || !scissor_clip_layer_ || 222 if (view_size_.IsEmpty() || !scissor_clip_layer_ ||
189 draw_info->mode == AwDrawGLInfo::kModeProcess) 223 draw_info->mode == AwDrawGLInfo::kModeProcess)
190 return; 224 return;
191 225
192 DCHECK_EQ(draw_info->mode, AwDrawGLInfo::kModeDraw); 226 DCHECK_EQ(draw_info->mode, AwDrawGLInfo::kModeDraw);
193 227
194 SetCompositorVisibility(view_visible_); 228 SetCompositorVisibility(view_visible_);
(...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 661
628 void BrowserViewRendererImpl::OnFrameInfoUpdated( 662 void BrowserViewRendererImpl::OnFrameInfoUpdated(
629 const gfx::SizeF& content_size, 663 const gfx::SizeF& content_size,
630 const gfx::Vector2dF& scroll_offset, 664 const gfx::Vector2dF& scroll_offset,
631 float page_scale_factor) { 665 float page_scale_factor) {
632 page_scale_ = page_scale_factor; 666 page_scale_ = page_scale_factor;
633 content_size_css_ = content_size; 667 content_size_css_ = content_size;
634 } 668 }
635 669
636 } // namespace android_webview 670 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/browser_view_renderer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698