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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 264773002: Start moving WebUserMediaClient on the chromium side to be per frame instead of view. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 6 years, 7 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 | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #include "content/renderer/child_frame_compositing_helper.h" 49 #include "content/renderer/child_frame_compositing_helper.h"
50 #include "content/renderer/context_menu_params_builder.h" 50 #include "content/renderer/context_menu_params_builder.h"
51 #include "content/renderer/devtools/devtools_agent.h" 51 #include "content/renderer/devtools/devtools_agent.h"
52 #include "content/renderer/dom_automation_controller.h" 52 #include "content/renderer/dom_automation_controller.h"
53 #include "content/renderer/history_controller.h" 53 #include "content/renderer/history_controller.h"
54 #include "content/renderer/history_serialization.h" 54 #include "content/renderer/history_serialization.h"
55 #include "content/renderer/image_loading_helper.h" 55 #include "content/renderer/image_loading_helper.h"
56 #include "content/renderer/ime_event_guard.h" 56 #include "content/renderer/ime_event_guard.h"
57 #include "content/renderer/internal_document_state_data.h" 57 #include "content/renderer/internal_document_state_data.h"
58 #include "content/renderer/java/java_bridge_dispatcher.h" 58 #include "content/renderer/java/java_bridge_dispatcher.h"
59 #include "content/renderer/media/audio_renderer_mixer_manager.h"
60 #include "content/renderer/media/media_stream_dispatcher.h"
61 #include "content/renderer/media/media_stream_impl.h"
62 #include "content/renderer/media/render_media_log.h"
59 #include "content/renderer/media/webcontentdecryptionmodule_impl.h" 63 #include "content/renderer/media/webcontentdecryptionmodule_impl.h"
64 #include "content/renderer/media/webmediaplayer_impl.h"
65 #include "content/renderer/media/webmediaplayer_ms.h"
66 #include "content/renderer/media/webmediaplayer_params.h"
60 #include "content/renderer/notification_provider.h" 67 #include "content/renderer/notification_provider.h"
61 #include "content/renderer/npapi/plugin_channel_host.h" 68 #include "content/renderer/npapi/plugin_channel_host.h"
62 #include "content/renderer/render_process.h" 69 #include "content/renderer/render_process.h"
63 #include "content/renderer/render_thread_impl.h" 70 #include "content/renderer/render_thread_impl.h"
64 #include "content/renderer/render_view_impl.h" 71 #include "content/renderer/render_view_impl.h"
65 #include "content/renderer/render_widget_fullscreen_pepper.h" 72 #include "content/renderer/render_widget_fullscreen_pepper.h"
66 #include "content/renderer/renderer_webapplicationcachehost_impl.h" 73 #include "content/renderer/renderer_webapplicationcachehost_impl.h"
67 #include "content/renderer/renderer_webcolorchooser_impl.h" 74 #include "content/renderer/renderer_webcolorchooser_impl.h"
68 #include "content/renderer/shared_worker_repository.h" 75 #include "content/renderer/shared_worker_repository.h"
69 #include "content/renderer/v8_value_converter_impl.h" 76 #include "content/renderer/v8_value_converter_impl.h"
70 #include "content/renderer/websharedworker_proxy.h" 77 #include "content/renderer/websharedworker_proxy.h"
78 #include "media/base/audio_renderer_mixer_input.h"
71 #include "net/base/data_url.h" 79 #include "net/base/data_url.h"
72 #include "net/base/net_errors.h" 80 #include "net/base/net_errors.h"
73 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" 81 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
74 #include "net/http/http_util.h" 82 #include "net/http/http_util.h"
75 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h" 83 #include "third_party/WebKit/public/platform/WebStorageQuotaCallbacks.h"
76 #include "third_party/WebKit/public/platform/WebString.h" 84 #include "third_party/WebKit/public/platform/WebString.h"
77 #include "third_party/WebKit/public/platform/WebURL.h" 85 #include "third_party/WebKit/public/platform/WebURL.h"
78 #include "third_party/WebKit/public/platform/WebURLError.h" 86 #include "third_party/WebKit/public/platform/WebURLError.h"
79 #include "third_party/WebKit/public/platform/WebURLResponse.h" 87 #include "third_party/WebKit/public/platform/WebURLResponse.h"
80 #include "third_party/WebKit/public/platform/WebVector.h" 88 #include "third_party/WebKit/public/platform/WebVector.h"
(...skipping 18 matching lines...) Expand all
99 #include "content/renderer/pepper/pepper_browser_connection.h" 107 #include "content/renderer/pepper/pepper_browser_connection.h"
100 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" 108 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
101 #include "content/renderer/pepper/pepper_webplugin_impl.h" 109 #include "content/renderer/pepper/pepper_webplugin_impl.h"
102 #include "content/renderer/pepper/plugin_module.h" 110 #include "content/renderer/pepper/plugin_module.h"
103 #endif 111 #endif
104 112
105 #if defined(ENABLE_WEBRTC) 113 #if defined(ENABLE_WEBRTC)
106 #include "content/renderer/media/rtc_peer_connection_handler.h" 114 #include "content/renderer/media/rtc_peer_connection_handler.h"
107 #endif 115 #endif
108 116
117 #if defined(OS_ANDROID)
118 #include <cpu-features.h>
119
120 #include "content/common/gpu/client/context_provider_command_buffer.h"
121 #include "content/renderer/android/synchronous_compositor_factory.h"
122 #include "content/renderer/media/android/stream_texture_factory_impl.h"
123 #include "content/renderer/media/android/webmediaplayer_android.h"
124 #endif
125
109 using blink::WebContextMenuData; 126 using blink::WebContextMenuData;
110 using blink::WebData; 127 using blink::WebData;
111 using blink::WebDataSource; 128 using blink::WebDataSource;
112 using blink::WebDocument; 129 using blink::WebDocument;
113 using blink::WebElement; 130 using blink::WebElement;
114 using blink::WebFrame; 131 using blink::WebFrame;
115 using blink::WebHistoryItem; 132 using blink::WebHistoryItem;
116 using blink::WebHTTPBody; 133 using blink::WebHTTPBody;
117 using blink::WebLocalFrame; 134 using blink::WebLocalFrame;
135 using blink::WebMediaPlayer;
136 using blink::WebMediaPlayerClient;
118 using blink::WebNavigationPolicy; 137 using blink::WebNavigationPolicy;
119 using blink::WebNavigationType; 138 using blink::WebNavigationType;
120 using blink::WebNode; 139 using blink::WebNode;
121 using blink::WebPluginParams; 140 using blink::WebPluginParams;
122 using blink::WebRange; 141 using blink::WebRange;
123 using blink::WebReferrerPolicy; 142 using blink::WebReferrerPolicy;
124 using blink::WebScriptSource; 143 using blink::WebScriptSource;
125 using blink::WebSearchableFormData; 144 using blink::WebSearchableFormData;
126 using blink::WebSecurityOrigin; 145 using blink::WebSecurityOrigin;
127 using blink::WebSecurityPolicy; 146 using blink::WebSecurityPolicy;
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) 353 RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id)
335 : frame_(NULL), 354 : frame_(NULL),
336 render_view_(render_view->AsWeakPtr()), 355 render_view_(render_view->AsWeakPtr()),
337 routing_id_(routing_id), 356 routing_id_(routing_id),
338 is_swapped_out_(false), 357 is_swapped_out_(false),
339 is_detaching_(false), 358 is_detaching_(false),
340 cookie_jar_(this), 359 cookie_jar_(this),
341 selection_text_offset_(0), 360 selection_text_offset_(0),
342 selection_range_(gfx::Range::InvalidRange()), 361 selection_range_(gfx::Range::InvalidRange()),
343 handling_select_range_(false), 362 handling_select_range_(false),
344 notification_provider_(NULL) { 363 notification_provider_(NULL),
364 media_stream_client_(NULL),
365 web_user_media_client_(NULL),
366 weak_factory_(this) {
345 RenderThread::Get()->AddRoute(routing_id_, this); 367 RenderThread::Get()->AddRoute(routing_id_, this);
346 368
347 #if defined(OS_ANDROID) 369 #if defined(OS_ANDROID)
348 new JavaBridgeDispatcher(this); 370 new JavaBridgeDispatcher(this);
349 #endif 371 #endif
350 372
351 #if defined(ENABLE_NOTIFICATIONS) 373 #if defined(ENABLE_NOTIFICATIONS)
352 notification_provider_ = new NotificationProvider(this); 374 notification_provider_ = new NotificationProvider(this);
353 #endif 375 #endif
354 } 376 }
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 // Mimics the order of events sent by WebKit. 582 // Mimics the order of events sent by WebKit.
561 // See WebCore::Editor::setComposition() for the corresponding code. 583 // See WebCore::Editor::setComposition() for the corresponding code.
562 render_view_->focused_pepper_plugin()->HandleCompositionEnd(last_text); 584 render_view_->focused_pepper_plugin()->HandleCompositionEnd(last_text);
563 render_view_->focused_pepper_plugin()->HandleTextInput(last_text); 585 render_view_->focused_pepper_plugin()->HandleTextInput(last_text);
564 } 586 }
565 pepper_composition_text_.clear(); 587 pepper_composition_text_.clear();
566 } 588 }
567 589
568 #endif // ENABLE_PLUGINS 590 #endif // ENABLE_PLUGINS
569 591
592 void RenderFrameImpl::SetMediaStreamClientForTesting(
593 MediaStreamClient* media_stream_client) {
594 DCHECK(!media_stream_client_);
595 DCHECK(!web_user_media_client_);
596 media_stream_client_ = media_stream_client;
597 }
598
570 bool RenderFrameImpl::Send(IPC::Message* message) { 599 bool RenderFrameImpl::Send(IPC::Message* message) {
571 if (is_detaching_ || 600 if (is_detaching_ ||
572 ((is_swapped_out_ || render_view_->is_swapped_out()) && 601 ((is_swapped_out_ || render_view_->is_swapped_out()) &&
573 !SwappedOutMessages::CanSendWhileSwappedOut(message))) { 602 !SwappedOutMessages::CanSendWhileSwappedOut(message))) {
574 delete message; 603 delete message;
575 return false; 604 return false;
576 } 605 }
577 606
578 return RenderThread::Get()->Send(message); 607 return RenderThread::Get()->Send(message);
579 } 608 }
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after
1279 return CreatePlugin(frame, info, params_to_use); 1308 return CreatePlugin(frame, info, params_to_use);
1280 #else 1309 #else
1281 return NULL; 1310 return NULL;
1282 #endif // defined(ENABLE_PLUGINS) 1311 #endif // defined(ENABLE_PLUGINS)
1283 } 1312 }
1284 1313
1285 blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer( 1314 blink::WebMediaPlayer* RenderFrameImpl::createMediaPlayer(
1286 blink::WebLocalFrame* frame, 1315 blink::WebLocalFrame* frame,
1287 const blink::WebURL& url, 1316 const blink::WebURL& url,
1288 blink::WebMediaPlayerClient* client) { 1317 blink::WebMediaPlayerClient* client) {
1289 DCHECK(!frame_ || frame_ == frame); 1318 WebMediaPlayer* player = CreateWebMediaPlayerForMediaStream(url, client);
1290 // TODO(nasko): Moving the implementation here involves moving a few media 1319 if (player)
1291 // related client objects here or referencing them in the RenderView. Needs 1320 return player;
1292 // more work to understand where the proper place for those objects is. 1321
1293 return render_view_->CreateMediaPlayer(this, frame, url, client); 1322 #if defined(OS_ANDROID)
1323 return CreateAndroidWebMediaPlayer(url, client);
1324 #else
1325 WebMediaPlayerParams params(
1326 base::Bind(&ContentRendererClient::DeferMediaLoad,
1327 base::Unretained(GetContentClient()->renderer()),
1328 static_cast<RenderFrame*>(this)),
1329 RenderThreadImpl::current()->GetAudioRendererMixerManager()->CreateInput(
1330 render_view_->routing_id_, routing_id_));
1331 return new WebMediaPlayerImpl(frame, client, weak_factory_.GetWeakPtr(),
1332 params);
1333 #endif // defined(OS_ANDROID)
1294 } 1334 }
1295 1335
1296 blink::WebContentDecryptionModule* 1336 blink::WebContentDecryptionModule*
1297 RenderFrameImpl::createContentDecryptionModule( 1337 RenderFrameImpl::createContentDecryptionModule(
1298 blink::WebLocalFrame* frame, 1338 blink::WebLocalFrame* frame,
1299 const blink::WebSecurityOrigin& security_origin, 1339 const blink::WebSecurityOrigin& security_origin,
1300 const blink::WebString& key_system) { 1340 const blink::WebString& key_system) {
1301 DCHECK(!frame_ || frame_ == frame); 1341 DCHECK(!frame_ || frame_ == frame);
1302 return WebContentDecryptionModuleImpl::Create( 1342 return WebContentDecryptionModuleImpl::Create(
1303 frame, security_origin, key_system); 1343 frame, security_origin, key_system);
(...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after
2619 void RenderFrameImpl::willStartUsingPeerConnectionHandler( 2659 void RenderFrameImpl::willStartUsingPeerConnectionHandler(
2620 blink::WebLocalFrame* frame, 2660 blink::WebLocalFrame* frame,
2621 blink::WebRTCPeerConnectionHandler* handler) { 2661 blink::WebRTCPeerConnectionHandler* handler) {
2622 DCHECK(!frame_ || frame_ == frame); 2662 DCHECK(!frame_ || frame_ == frame);
2623 #if defined(ENABLE_WEBRTC) 2663 #if defined(ENABLE_WEBRTC)
2624 static_cast<RTCPeerConnectionHandler*>(handler)->associateWithFrame(frame); 2664 static_cast<RTCPeerConnectionHandler*>(handler)->associateWithFrame(frame);
2625 #endif 2665 #endif
2626 } 2666 }
2627 2667
2628 blink::WebUserMediaClient* RenderFrameImpl::userMediaClient() { 2668 blink::WebUserMediaClient* RenderFrameImpl::userMediaClient() {
2629 return render_view_->userMediaClient(); 2669 // This can happen in tests, in which case it's OK to return NULL.
2670 if (!InitializeMediaStreamClient())
2671 return NULL;
2672
2673 return web_user_media_client_;
2630 } 2674 }
2631 2675
2632 blink::WebMIDIClient* RenderFrameImpl::webMIDIClient() { 2676 blink::WebMIDIClient* RenderFrameImpl::webMIDIClient() {
2633 return render_view_->webMIDIClient(); 2677 return render_view_->webMIDIClient();
2634 } 2678 }
2635 2679
2636 bool RenderFrameImpl::willCheckAndDispatchMessageEvent( 2680 bool RenderFrameImpl::willCheckAndDispatchMessageEvent(
2637 blink::WebLocalFrame* sourceFrame, 2681 blink::WebLocalFrame* sourceFrame,
2638 blink::WebFrame* targetFrame, 2682 blink::WebFrame* targetFrame,
2639 blink::WebSecurityOrigin targetOrigin, 2683 blink::WebSecurityOrigin targetOrigin,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2704 void RenderFrameImpl::forwardInputEvent(const blink::WebInputEvent* event) { 2748 void RenderFrameImpl::forwardInputEvent(const blink::WebInputEvent* event) {
2705 Send(new FrameHostMsg_ForwardInputEvent(routing_id_, event)); 2749 Send(new FrameHostMsg_ForwardInputEvent(routing_id_, event));
2706 } 2750 }
2707 2751
2708 void RenderFrameImpl::initializeChildFrame(const blink::WebRect& frame_rect, 2752 void RenderFrameImpl::initializeChildFrame(const blink::WebRect& frame_rect,
2709 float scale_factor) { 2753 float scale_factor) {
2710 Send(new FrameHostMsg_InitializeChildFrame( 2754 Send(new FrameHostMsg_InitializeChildFrame(
2711 routing_id_, frame_rect, scale_factor)); 2755 routing_id_, frame_rect, scale_factor));
2712 } 2756 }
2713 2757
2758 void RenderFrameImpl::DidPlay(blink::WebMediaPlayer* player) {
2759 Send(new FrameHostMsg_MediaPlayingNotification(
2760 routing_id_, reinterpret_cast<int64>(player), player->hasVideo(),
2761 player->hasAudio()));
2762 }
2763
2764 void RenderFrameImpl::DidPause(blink::WebMediaPlayer* player) {
2765 Send(new FrameHostMsg_MediaPausedNotification(
2766 routing_id_, reinterpret_cast<int64>(player)));
2767 }
2768
2769 void RenderFrameImpl::PlayerGone(blink::WebMediaPlayer* player) {
2770 DidPause(player);
2771 }
2772
2714 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { 2773 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) {
2715 observers_.AddObserver(observer); 2774 observers_.AddObserver(observer);
2716 } 2775 }
2717 2776
2718 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { 2777 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) {
2719 observer->RenderFrameGone(); 2778 observer->RenderFrameGone();
2720 observers_.RemoveObserver(observer); 2779 observers_.RemoveObserver(observer);
2721 } 2780 }
2722 2781
2723 void RenderFrameImpl::OnStop() { 2782 void RenderFrameImpl::OnStop() {
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
3236 selection_text_ = text; 3295 selection_text_ = text;
3237 selection_text_offset_ = offset; 3296 selection_text_offset_ = offset;
3238 selection_range_ = range; 3297 selection_range_ = range;
3239 // This IPC is dispatched by RenderWidetHost, so use its routing ID. 3298 // This IPC is dispatched by RenderWidetHost, so use its routing ID.
3240 Send(new ViewHostMsg_SelectionChanged( 3299 Send(new ViewHostMsg_SelectionChanged(
3241 GetRenderWidget()->routing_id(), text, offset, range)); 3300 GetRenderWidget()->routing_id(), text, offset, range));
3242 } 3301 }
3243 GetRenderWidget()->UpdateSelectionBounds(); 3302 GetRenderWidget()->UpdateSelectionBounds();
3244 } 3303 }
3245 3304
3305 bool RenderFrameImpl::InitializeMediaStreamClient() {
3306 if (media_stream_client_)
3307 return true;
3308
3309 if (!RenderThreadImpl::current()) // Will be NULL during unit tests.
3310 return false;
3311
3312 #if defined(OS_ANDROID)
3313 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableWebRTC))
3314 return false;
3315 #endif
3316
3317 #if defined(ENABLE_WEBRTC)
3318 if (!render_view_->media_stream_dispatcher_) {
3319 render_view_->media_stream_dispatcher_ =
3320 new MediaStreamDispatcher(render_view_.get());
3321 }
3322
3323 MediaStreamImpl* media_stream_impl = new MediaStreamImpl(
3324 render_view_.get(),
3325 render_view_->media_stream_dispatcher_,
3326 RenderThreadImpl::current()->GetMediaStreamDependencyFactory());
3327 media_stream_client_ = media_stream_impl;
3328 web_user_media_client_ = media_stream_impl;
3329 return true;
3330 #else
3331 return false;
3332 #endif
3333 }
3334
3335 WebMediaPlayer* RenderFrameImpl::CreateWebMediaPlayerForMediaStream(
3336 const blink::WebURL& url,
3337 WebMediaPlayerClient* client) {
3338 #if defined(ENABLE_WEBRTC)
3339 if (!InitializeMediaStreamClient()) {
3340 LOG(ERROR) << "Failed to initialize MediaStreamClient";
3341 return NULL;
3342 }
3343 if (media_stream_client_->IsMediaStream(url)) {
3344 #if defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL)
3345 bool found_neon =
3346 (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
3347 UMA_HISTOGRAM_BOOLEAN("Platform.WebRtcNEONFound", found_neon);
3348 #endif // defined(OS_ANDROID) && defined(ARCH_CPU_ARMEL)
3349 return new WebMediaPlayerMS(frame_, client, weak_factory_.GetWeakPtr(),
3350 media_stream_client_, new RenderMediaLog());
3351 }
3352 #endif // defined(ENABLE_WEBRTC)
3353 return NULL;
3354 }
3355
3356 #if defined(OS_ANDROID)
3357
3358 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer(
3359 const blink::WebURL& url,
3360 WebMediaPlayerClient* client) {
3361 GpuChannelHost* gpu_channel_host =
3362 RenderThreadImpl::current()->EstablishGpuChannelSync(
3363 CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE);
3364 if (!gpu_channel_host) {
3365 LOG(ERROR) << "Failed to establish GPU channel for media player";
3366 return NULL;
3367 }
3368
3369 scoped_refptr<StreamTextureFactory> stream_texture_factory;
3370 if (GetRenderWidget()->UsingSynchronousRendererCompositor()) {
3371 SynchronousCompositorFactory* factory =
3372 SynchronousCompositorFactory::GetInstance();
3373 stream_texture_factory = factory->CreateStreamTextureFactory(
3374 render_view_->routing_id_);
3375 } else {
3376 scoped_refptr<webkit::gpu::ContextProviderWebContext> context_provider =
3377 RenderThreadImpl::current()->SharedMainThreadContextProvider();
3378
3379 if (!context_provider.get()) {
3380 LOG(ERROR) << "Failed to get context3d for media player";
3381 return NULL;
3382 }
3383
3384 stream_texture_factory = StreamTextureFactoryImpl::Create(
3385 context_provider, gpu_channel_host, render_view_->routing_id_);
3386 }
3387
3388 return new WebMediaPlayerAndroid(
3389 frame_,
3390 client,
3391 weak_factory_.GetWeakPtr(),
3392 render_view_->media_player_manager_,
3393 stream_texture_factory,
3394 RenderThreadImpl::current()->GetMediaThreadMessageLoopProxy(),
3395 new RenderMediaLog());
3396 }
3397
3398 #endif
3399
3246 } // namespace content 3400 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_view_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698