#include "content/public/browser/navigation_details.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
WebContentsZoomController::WebContentsZoomController(
content::WebContents* web_contents)
- : content::WebContentsObserver(web_contents) {
+ : old_process_id_(-1),
+ old_view_id_(-1),
+ embedder_zoom_controller_(nullptr),
+ content::WebContentsObserver(web_contents) {
default_zoom_factor_ = content::kEpsilon;
- temporary_zoom_level_ = content::kEpsilon;
host_zoom_map_ = content::HostZoomMap::GetForWebContents(web_contents);
zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback(base::Bind(
&WebContentsZoomController::OnZoomLevelChanged, base::Unretained(this)));
}
-WebContentsZoomController::~WebContentsZoomController() {}
+WebContentsZoomController::~WebContentsZoomController() {
+ embedder_zoom_controller_ = nullptr;
+}
void WebContentsZoomController::AddObserver(
WebContentsZoomController::Observer* observer) {
observers_.RemoveObserver(observer);
}
+void WebContentsZoomController::SetEmbedderZoomController(
+ WebContentsZoomController* controller) {
+ embedder_zoom_controller_ = controller;
+}
+
void WebContentsZoomController::SetZoomLevel(double level) {
if (!web_contents()->GetRenderViewHost()->IsRenderViewLive() ||
content::ZoomValuesEqual(GetZoomLevel(), level))
return;
- if (!content::ZoomValuesEqual(GetTemporaryZoomLevel(), content::kEpsilon)) {
- temporary_zoom_level_ = content::kEpsilon;
+ int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
+ int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
+ if (host_zoom_map_->UsesTemporaryZoomLevel(render_process_id,
+ render_view_id)) {
+ host_zoom_map_->ClearTemporaryZoomLevel(render_process_id, render_view_id);
}
auto new_zoom_factor = content::ZoomLevelToZoomFactor(level);
return default_zoom_factor_;
}
-bool WebContentsZoomController::UsesTemporaryZoomLevel() {
- return !content::ZoomValuesEqual(temporary_zoom_level_, content::kEpsilon);
-}
-
-double WebContentsZoomController::GetTemporaryZoomLevel() {
- return temporary_zoom_level_;
-}
-
void WebContentsZoomController::SetTemporaryZoomLevel(double level) {
- int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
- int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
- host_zoom_map_->SetTemporaryZoomLevel(render_process_id, render_view_id,
- level);
- temporary_zoom_level_ = level;
+ old_process_id_ = web_contents()->GetRenderProcessHost()->GetID();
+ old_view_id_ = web_contents()->GetRenderViewHost()->GetRoutingID();
+ host_zoom_map_->SetTemporaryZoomLevel(old_process_id_, old_view_id_, level);
// Notify observers of zoom level changes.
FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_,
OnZoomLevelChanged(web_contents(), level, true));
}
-void WebContentsZoomController::DidStartNavigation(
- content::NavigationHandle* navigation_handle) {
- if (!navigation_handle->IsInMainFrame() || navigation_handle->IsSamePage())
- return;
+bool WebContentsZoomController::UsesTemporaryZoomLevel() {
int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
- host_zoom_map_->ClearTemporaryZoomLevel(render_process_id, render_view_id);
+ return host_zoom_map_->UsesTemporaryZoomLevel(render_process_id,
+ render_view_id);
}
void WebContentsZoomController::DidFinishNavigation(
if (content::ZoomValuesEqual(GetDefaultZoomFactor(), content::kEpsilon))
return;
- if (!content::ZoomValuesEqual(GetTemporaryZoomLevel(), content::kEpsilon)) {
- FOR_EACH_OBSERVER(
- WebContentsZoomController::Observer, observers_,
- OnZoomLevelChanged(web_contents(), GetTemporaryZoomLevel(), true));
- temporary_zoom_level_ = content::kEpsilon;
+ if (host_zoom_map_->UsesTemporaryZoomLevel(old_process_id_, old_view_id_)) {
+ host_zoom_map_->ClearTemporaryZoomLevel(old_process_id_, old_view_id_);
+ }
+
+ if (embedder_zoom_controller_ &&
+ embedder_zoom_controller_->UsesTemporaryZoomLevel()) {
+ double level = embedder_zoom_controller_->GetZoomLevel();
+ SetTemporaryZoomLevel(level);
return;
}
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
+ void SetEmbedderZoomController(WebContentsZoomController* controller);
+
// Methods for managing zoom levels.
void SetZoomLevel(double level);
double GetZoomLevel();
double GetDefaultZoomFactor();
void SetTemporaryZoomLevel(double level);
bool UsesTemporaryZoomLevel();
- double GetTemporaryZoomLevel();
protected:
// content::WebContentsObserver:
- void DidStartNavigation(content::NavigationHandle* handle) override;
void DidFinishNavigation(content::NavigationHandle* handle) override;
void WebContentsDestroyed() override;
void RenderFrameHostChanged(content::RenderFrameHost* old_host,
double default_zoom_factor_;
double temporary_zoom_level_;
+ int old_process_id_;
+ int old_view_id_;
+
+ WebContentsZoomController* embedder_zoom_controller_;
+
// Map between zoom factor and hosts in this webContent.
std::map<std::string, double> host_zoom_factor_;