| Index: content/browser/renderer_host/render_view_host_impl.cc
|
| diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
|
| index b03d28fa685cafacbc1f1d2addf55f140067a5e5..b4280c58b671daa0c4f2781dd7f6e7ba3b9bca43 100644
|
| --- a/content/browser/renderer_host/render_view_host_impl.cc
|
| +++ b/content/browser/renderer_host/render_view_host_impl.cc
|
| @@ -200,7 +200,8 @@ RenderViewHostImpl::RenderViewHostImpl(
|
| render_view_termination_status_(base::TERMINATION_STATUS_STILL_RUNNING),
|
| virtual_keyboard_requested_(false),
|
| weak_factory_(this),
|
| - is_focused_element_editable_(false) {
|
| + is_focused_element_editable_(false),
|
| + updating_web_preferences_(false) {
|
| DCHECK(instance_.get());
|
| CHECK(delegate_); // http://crbug.com/82827
|
|
|
| @@ -292,7 +293,7 @@ bool RenderViewHostImpl::CreateRenderView(
|
| ViewMsg_New_Params params;
|
| params.renderer_preferences =
|
| delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext());
|
| - params.web_preferences = delegate_->GetWebkitPrefs();
|
| + params.web_preferences = GetWebkitPreferences();
|
| params.view_id = GetRoutingID();
|
| params.main_frame_routing_id = main_frame_routing_id_;
|
| params.surface_id = surface_id();
|
| @@ -332,7 +333,7 @@ void RenderViewHostImpl::SyncRendererPrefs() {
|
| GetProcess()->GetBrowserContext())));
|
| }
|
|
|
| -WebPreferences RenderViewHostImpl::GetWebkitPrefs(const GURL& url) {
|
| +WebPreferences RenderViewHostImpl::ComputeWebkitPrefs(const GURL& url) {
|
| TRACE_EVENT0("browser", "RenderViewHostImpl::GetWebkitPrefs");
|
| WebPreferences prefs;
|
|
|
| @@ -1423,7 +1424,10 @@ void RenderViewHostImpl::ExitFullscreen() {
|
| }
|
|
|
| WebPreferences RenderViewHostImpl::GetWebkitPreferences() {
|
| - return delegate_->GetWebkitPrefs();
|
| + if (!web_preferences_.get()) {
|
| + OnWebkitPreferencesChanged();
|
| + }
|
| + return *web_preferences_;
|
| }
|
|
|
| void RenderViewHostImpl::DisownOpener() {
|
| @@ -1434,9 +1438,21 @@ void RenderViewHostImpl::DisownOpener() {
|
| }
|
|
|
| void RenderViewHostImpl::UpdateWebkitPreferences(const WebPreferences& prefs) {
|
| + web_preferences_.reset(new WebPreferences(prefs));
|
| Send(new ViewMsg_UpdateWebPreferences(GetRoutingID(), prefs));
|
| }
|
|
|
| +void RenderViewHostImpl::OnWebkitPreferencesChanged() {
|
| + // This is defensive code to avoid infinite loops due to code run inside
|
| + // UpdateWebkitPreferences() accidentally updating more preferences and thus
|
| + // calling back into this code. See crbug.com/398751 for one past example.
|
| + if (updating_web_preferences_)
|
| + return;
|
| + updating_web_preferences_ = true;
|
| + UpdateWebkitPreferences(delegate_->ComputeWebkitPrefs());
|
| + updating_web_preferences_ = false;
|
| +}
|
| +
|
| void RenderViewHostImpl::GetAudioOutputControllers(
|
| const GetAudioOutputControllersCallback& callback) const {
|
| AudioRendererHost* audio_host =
|
|
|