VisualViewport.cpp [plain text]
#include "config.h"
#include "VisualViewport.h"
#include "ContextDestructionObserver.h"
#include "DOMWindow.h"
#include "Document.h"
#include "Frame.h"
#include "FrameView.h"
#include "Page.h"
namespace WebCore {
VisualViewport::VisualViewport(Frame* frame)
: DOMWindowProperty(frame)
{
}
EventTargetInterface VisualViewport::eventTargetInterface() const
{
return VisualViewportEventTargetInterfaceType;
}
ScriptExecutionContext* VisualViewport::scriptExecutionContext() const
{
if (!m_associatedDOMWindow)
return nullptr;
return static_cast<ContextDestructionObserver*>(m_associatedDOMWindow)->scriptExecutionContext();
}
static FrameView* getFrameViewAndLayoutIfNonNull(Frame* frame)
{
auto* view = frame ? frame->view() : nullptr;
if (view) {
ASSERT(frame->pageZoomFactor());
frame->document()->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks::Synchronously);
}
return view;
}
double VisualViewport::offsetLeft() const
{
if (auto* view = getFrameViewAndLayoutIfNonNull(m_frame))
return (view->visualViewportRect().x() - view->layoutViewportRect().x()) / m_frame->pageZoomFactor();
return 0;
}
double VisualViewport::offsetTop() const
{
if (auto* view = getFrameViewAndLayoutIfNonNull(m_frame))
return (view->visualViewportRect().y() - view->layoutViewportRect().y()) / m_frame->pageZoomFactor();
return 0;
}
double VisualViewport::pageLeft() const
{
if (auto* view = getFrameViewAndLayoutIfNonNull(m_frame))
return view->visualViewportRect().x() / m_frame->pageZoomFactor();
return 0;
}
double VisualViewport::pageTop() const
{
if (auto* view = getFrameViewAndLayoutIfNonNull(m_frame))
return view->visualViewportRect().y() / m_frame->pageZoomFactor();
return 0;
}
double VisualViewport::width() const
{
if (auto* view = getFrameViewAndLayoutIfNonNull(m_frame))
return view->visualViewportRect().width() / m_frame->pageZoomFactor();
return 0;
}
double VisualViewport::height() const
{
if (auto* view = getFrameViewAndLayoutIfNonNull(m_frame))
return view->visualViewportRect().height() / m_frame->pageZoomFactor();
return 0;
}
double VisualViewport::scale() const
{
if (!m_frame || !m_frame->isMainFrame())
return 1;
if (auto* page = m_frame->page()) {
m_frame->document()->updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks::Synchronously);
return page->pageScaleFactor();
}
return 1;
}
}