Commit b04bed18 authored by Darin Fisher's avatar Darin Fisher Committed by Commit Bot

Plumb LocalFrame through ChromeClient::WindowToViewportScalar (part 1).

This CL introduces a new version of WindowToViewportScalar that takes a
LocalFrame parameter, marks the existing version as deprecated, and adds
one caller to the new version. The new caller is DataTimeChooserImpl,
and that change is what fixes bug 1006919.

What was happening before is that in the context of an out-of-process
subframe, WindowToViewportScalar was not finding a LocalFrame for the
top frame. It would then bail out early, not calling the appropriate
WebWidgetClient method. Hence, the error reported in the bug.

A follow-up CL will migrate the rest of the callers over to the version
of this method that takes a LocalFrame parameter and remove the other.

Bug: 1006919
Change-Id: I04bd2fa80abed139b90a42b81668bcc3aba8f967
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1831447Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Darin Fisher <darin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701558}
parent 7e1eee1d
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "third_party/blink/public/strings/grit/blink_strings.h" #include "third_party/blink/public/strings/grit/blink_strings.h"
#include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/element.h"
#include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h"
#include "third_party/blink/renderer/core/html/forms/chooser_resource_loader.h" #include "third_party/blink/renderer/core/html/forms/chooser_resource_loader.h"
#include "third_party/blink/renderer/core/html/forms/date_time_chooser_client.h" #include "third_party/blink/renderer/core/html/forms/date_time_chooser_client.h"
...@@ -49,25 +50,25 @@ ...@@ -49,25 +50,25 @@
namespace blink { namespace blink {
DateTimeChooserImpl::DateTimeChooserImpl( DateTimeChooserImpl::DateTimeChooserImpl(
ChromeClient* chrome_client, LocalFrame* frame,
DateTimeChooserClient* client, DateTimeChooserClient* client,
const DateTimeChooserParameters& parameters) const DateTimeChooserParameters& parameters)
: chrome_client_(chrome_client), : frame_(frame),
client_(client), client_(client),
popup_(nullptr), popup_(nullptr),
parameters_(&parameters), parameters_(&parameters),
locale_(Locale::Create(parameters.locale)) { locale_(Locale::Create(parameters.locale)) {
DCHECK(RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled()); DCHECK(RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled());
DCHECK(chrome_client_); DCHECK(frame_);
DCHECK(client_); DCHECK(client_);
popup_ = chrome_client_->OpenPagePopup(this); popup_ = frame_->View()->GetChromeClient()->OpenPagePopup(this);
parameters_ = nullptr; parameters_ = nullptr;
} }
DateTimeChooserImpl::~DateTimeChooserImpl() = default; DateTimeChooserImpl::~DateTimeChooserImpl() = default;
void DateTimeChooserImpl::Trace(Visitor* visitor) { void DateTimeChooserImpl::Trace(Visitor* visitor) {
visitor->Trace(chrome_client_); visitor->Trace(frame_);
visitor->Trace(client_); visitor->Trace(client_);
DateTimeChooser::Trace(visitor); DateTimeChooser::Trace(visitor);
} }
...@@ -75,7 +76,7 @@ void DateTimeChooserImpl::Trace(Visitor* visitor) { ...@@ -75,7 +76,7 @@ void DateTimeChooserImpl::Trace(Visitor* visitor) {
void DateTimeChooserImpl::EndChooser() { void DateTimeChooserImpl::EndChooser() {
if (!popup_) if (!popup_)
return; return;
chrome_client_->ClosePagePopup(popup_); frame_->View()->GetChromeClient()->ClosePagePopup(popup_);
} }
AXObject* DateTimeChooserImpl::RootAXObject() { AXObject* DateTimeChooserImpl::RootAXObject() {
...@@ -138,7 +139,8 @@ void DateTimeChooserImpl::WriteDocument(SharedBuffer* data) { ...@@ -138,7 +139,8 @@ void DateTimeChooserImpl::WriteDocument(SharedBuffer* data) {
"window.dialogArguments = {\n", "window.dialogArguments = {\n",
data); data);
AddProperty("anchorRectInScreen", parameters_->anchor_rect_in_screen, data); AddProperty("anchorRectInScreen", parameters_->anchor_rect_in_screen, data);
float scale_factor = chrome_client_->WindowToViewportScalar(1.0f); float scale_factor =
frame_->View()->GetChromeClient()->WindowToViewportScalar(frame_, 1.0f);
AddProperty("zoomFactor", ZoomFactor() / scale_factor, data); AddProperty("zoomFactor", ZoomFactor() / scale_factor, data);
AddProperty("min", AddProperty("min",
ValueToDateTimeString(parameters_->minimum, parameters_->type), ValueToDateTimeString(parameters_->minimum, parameters_->type),
......
...@@ -38,14 +38,14 @@ ...@@ -38,14 +38,14 @@
namespace blink { namespace blink {
class ChromeClient;
class DateTimeChooserClient; class DateTimeChooserClient;
class LocalFrame;
class PagePopup; class PagePopup;
class CORE_EXPORT DateTimeChooserImpl final : public DateTimeChooser, class CORE_EXPORT DateTimeChooserImpl final : public DateTimeChooser,
public PagePopupClient { public PagePopupClient {
public: public:
DateTimeChooserImpl(ChromeClient*, DateTimeChooserImpl(LocalFrame*,
DateTimeChooserClient*, DateTimeChooserClient*,
const DateTimeChooserParameters&); const DateTimeChooserParameters&);
~DateTimeChooserImpl() override; ~DateTimeChooserImpl() override;
...@@ -67,7 +67,7 @@ class CORE_EXPORT DateTimeChooserImpl final : public DateTimeChooser, ...@@ -67,7 +67,7 @@ class CORE_EXPORT DateTimeChooserImpl final : public DateTimeChooser,
Element& OwnerElement() override; Element& OwnerElement() override;
void DidClosePopup() override; void DidClosePopup() override;
Member<ChromeClient> chrome_client_; Member<LocalFrame> frame_;
Member<DateTimeChooserClient> client_; Member<DateTimeChooserClient> client_;
PagePopup* popup_; PagePopup* popup_;
// This pointer is valid only in the constructor. // This pointer is valid only in the constructor.
......
...@@ -177,6 +177,9 @@ class CORE_EXPORT EmptyChromeClient : public ChromeClient { ...@@ -177,6 +177,9 @@ class CORE_EXPORT EmptyChromeClient : public ChromeClient {
return r; return r;
} }
float WindowToViewportScalar(const float s) const override { return s; } float WindowToViewportScalar(const float s) const override { return s; }
float WindowToViewportScalar(LocalFrame*, const float s) const override {
return s;
}
WebScreenInfo GetScreenInfo() const override { return WebScreenInfo(); } WebScreenInfo GetScreenInfo() const override { return WebScreenInfo(); }
void ContentsSizeChanged(LocalFrame*, const IntSize&) const override {} void ContentsSizeChanged(LocalFrame*, const IntSize&) const override {}
......
...@@ -111,8 +111,10 @@ class CORE_EXPORT ChromeClient : public GarbageCollected<ChromeClient> { ...@@ -111,8 +111,10 @@ class CORE_EXPORT ChromeClient : public GarbageCollected<ChromeClient> {
virtual ~ChromeClient() = default; virtual ~ChromeClient() = default;
// Converts the scalar value from the window coordinates to the viewport // Converts the scalar value from the window coordinates to the viewport
// scale. // scale. TODO(darin): Convert all callers over to the LocalFrame version.
virtual float WindowToViewportScalar(const float) const = 0; virtual float WindowToViewportScalar(const float) const = 0;
virtual float WindowToViewportScalar(LocalFrame*,
const float value) const = 0;
virtual bool IsPopup() { return false; } virtual bool IsPopup() { return false; }
......
...@@ -473,9 +473,17 @@ IntRect ChromeClientImpl::ViewportToScreen( ...@@ -473,9 +473,17 @@ IntRect ChromeClientImpl::ViewportToScreen(
} }
float ChromeClientImpl::WindowToViewportScalar(const float scalar_value) const { float ChromeClientImpl::WindowToViewportScalar(const float scalar_value) const {
// TODO(darin): Change caller to pass LocalFrame. Note, FrameWidgetImpl() can // TODO(darin): Change callers to pass a LocalFrame.
// be null during Scrollbar() construction. return WindowToViewportScalar(web_view_->MainFrameImpl()
WebLocalFrameImpl* local_frame = web_view_->MainFrameImpl(); ? web_view_->MainFrameImpl()->GetFrame()
: nullptr,
scalar_value);
}
float ChromeClientImpl::WindowToViewportScalar(LocalFrame* frame,
const float scalar_value) const {
// Note, FrameWidgetImpl() can be null during Scrollbar() construction.
WebLocalFrameImpl* local_frame = WebLocalFrameImpl::FromFrame(frame);
if (!local_frame || !local_frame->FrameWidgetImpl()) if (!local_frame || !local_frame->FrameWidgetImpl())
return scalar_value; return scalar_value;
...@@ -633,7 +641,7 @@ DateTimeChooser* ChromeClientImpl::OpenDateTimeChooser( ...@@ -633,7 +641,7 @@ DateTimeChooser* ChromeClientImpl::OpenDateTimeChooser(
NotifyPopupOpeningObservers(); NotifyPopupOpeningObservers();
if (RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled()) { if (RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled()) {
return MakeGarbageCollected<DateTimeChooserImpl>(this, picker_client, return MakeGarbageCollected<DateTimeChooserImpl>(frame, picker_client,
parameters); parameters);
} }
......
...@@ -125,6 +125,7 @@ class CORE_EXPORT ChromeClientImpl final : public ChromeClient { ...@@ -125,6 +125,7 @@ class CORE_EXPORT ChromeClientImpl final : public ChromeClient {
IntRect ViewportToScreen(const IntRect&, IntRect ViewportToScreen(const IntRect&,
const LocalFrameView*) const override; const LocalFrameView*) const override;
float WindowToViewportScalar(const float) const override; float WindowToViewportScalar(const float) const override;
float WindowToViewportScalar(LocalFrame*, const float) const override;
WebScreenInfo GetScreenInfo() const override; WebScreenInfo GetScreenInfo() const override;
void OverrideVisibleRectForMainFrame(LocalFrame& frame, void OverrideVisibleRectForMainFrame(LocalFrame& frame,
IntRect* paint_rect) const override; IntRect* paint_rect) const override;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment