From acda0ef3c7584b332255eb0f232ed0b147fe784d Mon Sep 17 00:00:00 2001
From: "wjmaclean@chromium.org"
 <wjmaclean@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>
Date: Thu, 5 Jun 2014 23:13:30 +0000
Subject: Fix issue with Virtual vs. real URLs.

In r273854 a regression was introduced in which
HostZoomMapImpl::SetZoomLevelForWebContents() used a virtual url for
setting page zoom, when the real url is required. This CL fixes that
by calling GetLastCommittedEntry() on the WebContents navigation
controller, instead of calling it directly on the WebContents; the
latter returns a virtual url.

BUG=379622

Review URL: https://codereview.chromium.org/301243018

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275268 0039d316-1c4b-4281-b951-d872f2087c98
---
 content/browser/host_zoom_map_impl.cc | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

(limited to 'content/browser/host_zoom_map_impl.cc')

diff --git a/content/browser/host_zoom_map_impl.cc b/content/browser/host_zoom_map_impl.cc
index a14b163..a0a68da 100644
--- a/content/browser/host_zoom_map_impl.cc
+++ b/content/browser/host_zoom_map_impl.cc
@@ -221,13 +221,16 @@ double HostZoomMapImpl::GetZoomLevelForWebContents(
   if (UsesTemporaryZoomLevel(render_process_id, routing_id))
     return GetTemporaryZoomLevel(render_process_id, routing_id);
 
-  // Since zoom map is updated using the url as stored in the navigation
-  // controller, we use that URL to get the zoom level.
+  // Get the url from the navigation controller directly, as calling
+  // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that
+  // is different than is stored in the map.
   GURL url;
   NavigationEntry* entry =
       web_contents_impl.GetController().GetLastCommittedEntry();
+  // It is possible for a WebContent's zoom level to be queried before
+  // a navigation has occurred.
   if (entry)
-    url =  entry->GetURL();
+    url = entry->GetURL();
   return GetZoomLevelForHostAndScheme(url.scheme(),
                                       net::GetHostOrSpecFromURL(url));
 }
@@ -238,12 +241,18 @@ void HostZoomMapImpl::SetZoomLevelForWebContents(
   int render_process_id = web_contents_impl.GetRenderProcessHost()->GetID();
   int render_view_id = web_contents_impl.GetRenderViewHost()->GetRoutingID();
   if (UsesTemporaryZoomLevel(render_process_id, render_view_id)) {
-
     SetTemporaryZoomLevel(render_process_id, render_view_id, level);
   } else {
-    SetZoomLevelForHost(
-        net::GetHostOrSpecFromURL(web_contents_impl.GetLastCommittedURL()),
-        level);
+    // Get the url from the navigation controller directly, as calling
+    // WebContentsImpl::GetLastCommittedURL() may give us a virtual url that
+    // is different than what the render view is using. If the two don't match,
+    // the attempt to set the zoom will fail.
+    GURL url;
+    NavigationEntry* entry =
+        web_contents_impl.GetController().GetLastCommittedEntry();
+    DCHECK(entry);
+    url = entry->GetURL();
+    SetZoomLevelForHost(net::GetHostOrSpecFromURL(url), level);
   }
 }
 
-- 
cgit v1.1