summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/WebProcess/WebPage/WebPage.cpp')
-rw-r--r--Source/WebKit2/WebProcess/WebPage/WebPage.cpp158
1 files changed, 134 insertions, 24 deletions
diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.cpp b/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
index 61e82b5d9..ea4712724 100644
--- a/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
+++ b/Source/WebKit2/WebProcess/WebPage/WebPage.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
* Copyright (C) 2012 Intel Corporation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,6 +33,7 @@
#include "DrawingArea.h"
#include "InjectedBundle.h"
#include "InjectedBundleBackForwardList.h"
+#include "InjectedBundleUserMessageCoders.h"
#include "LayerTreeHost.h"
#include "MessageID.h"
#include "NetscapePlugin.h"
@@ -104,7 +105,9 @@
#include <WebCore/RenderLayer.h>
#include <WebCore/RenderTreeAsText.h>
#include <WebCore/RenderView.h>
+#include <WebCore/ResourceBuffer.h>
#include <WebCore/ResourceRequest.h>
+#include <WebCore/ResourceResponse.h>
#include <WebCore/RunLoop.h>
#include <WebCore/SchemeRegistry.h>
#include <WebCore/ScriptValue.h>
@@ -148,7 +151,10 @@
#endif
#if PLATFORM(MAC)
-#include "BuiltInPDFView.h"
+#include "SimplePDFPlugin.h"
+#if ENABLE(PDFKIT_PLUGIN)
+#include "PDFPlugin.h"
+#endif
#endif
#if PLATFORM(QT)
@@ -217,6 +223,7 @@ WebPage::WebPage(uint64_t pageID, const WebPageCreationParameters& parameters)
, m_artificialPluginInitializationDelayEnabled(false)
, m_scrollingPerformanceLoggingEnabled(false)
#if PLATFORM(MAC)
+ , m_pdfPluginEnabled(false)
, m_windowIsVisible(false)
, m_isSmartInsertDeleteEnabled(parameters.isSmartInsertDeleteEnabled)
, m_layerHostingMode(parameters.layerHostingMode)
@@ -245,6 +252,8 @@ WebPage::WebPage(uint64_t pageID, const WebPageCreationParameters& parameters)
, m_isRunningModal(false)
, m_cachedMainFrameIsPinnedToLeftSide(false)
, m_cachedMainFrameIsPinnedToRightSide(false)
+ , m_cachedMainFrameIsPinnedToTopSide(false)
+ , m_cachedMainFrameIsPinnedToBottomSide(false)
, m_canShortCircuitHorizontalWheelEvents(false)
, m_numWheelEventHandlers(0)
, m_cachedPageCount(0)
@@ -464,8 +473,13 @@ PassRefPtr<Plugin> WebPage::createPlugin(WebFrame* frame, HTMLPlugInElement* plu
if (pluginPath.isNull()) {
#if PLATFORM(MAC)
if (parameters.mimeType == "application/pdf"
- || (parameters.mimeType.isEmpty() && parameters.url.path().lower().endsWith(".pdf")))
- return BuiltInPDFView::create(frame);
+ || (parameters.mimeType.isEmpty() && parameters.url.path().lower().endsWith(".pdf"))) {
+#if ENABLE(PDFKIT_PLUGIN)
+ if (pdfPluginEnabled())
+ return PDFPlugin::create(frame);
+#endif
+ return SimplePDFPlugin::create(frame);
+ }
#else
UNUSED_PARAM(frame);
#endif
@@ -616,11 +630,27 @@ PassRefPtr<ImmutableArray> WebPage::trackedRepaintRects()
return ImmutableArray::adopt(vector);
}
+static PluginView* pluginViewForFrame(Frame* frame)
+{
+ if (!frame->document()->isPluginDocument())
+ return 0;
+
+ PluginDocument* pluginDocument = static_cast<PluginDocument*>(frame->document());
+ PluginView* pluginView = static_cast<PluginView*>(pluginDocument->pluginWidget());
+ return pluginView;
+}
+
void WebPage::executeEditingCommand(const String& commandName, const String& argument)
{
Frame* frame = m_page->focusController()->focusedOrMainFrame();
if (!frame)
return;
+
+ if (PluginView* pluginView = pluginViewForFrame(frame)) {
+ pluginView->handleEditingCommand(commandName, argument);
+ return;
+ }
+
frame->editor()->command(commandName).execute(argument);
}
@@ -629,6 +659,9 @@ bool WebPage::isEditingCommandEnabled(const String& commandName)
Frame* frame = m_page->focusController()->focusedOrMainFrame();
if (!frame)
return false;
+
+ if (PluginView* pluginView = pluginViewForFrame(frame))
+ return pluginView->isEditingCommandEnabled(commandName);
Editor::Command command = frame->editor()->command(commandName);
return command.isSupported() && command.isEnabled();
@@ -1069,6 +1102,12 @@ void WebPage::windowScreenDidChange(uint64_t displayID)
void WebPage::scalePage(double scale, const IntPoint& origin)
{
+ PluginView* pluginView = pluginViewForFrame(m_page->mainFrame());
+ if (pluginView && pluginView->handlesPageScaleFactor()) {
+ pluginView->setPageScaleFactor(scale, origin);
+ return;
+ }
+
m_page->setPageScaleFactor(scale, origin);
for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
@@ -1079,6 +1118,10 @@ void WebPage::scalePage(double scale, const IntPoint& origin)
double WebPage::pageScaleFactor() const
{
+ PluginView* pluginView = pluginViewForFrame(m_page->mainFrame());
+ if (pluginView && pluginView->handlesPageScaleFactor())
+ return pluginView->pageScaleFactor();
+
return m_page->pageScaleFactor();
}
@@ -1172,6 +1215,19 @@ void WebPage::setGapBetweenPages(double gap)
m_page->setPagination(pagination);
}
+void WebPage::postInjectedBundleMessage(const String& messageName, CoreIPC::ArgumentDecoder* argumentDecoder)
+{
+ InjectedBundle* injectedBundle = WebProcess::shared().injectedBundle();
+ if (!injectedBundle)
+ return;
+
+ RefPtr<APIObject> messageBody;
+ if (!argumentDecoder->decode(InjectedBundleUserMessageDecoder(messageBody)))
+ return;
+
+ injectedBundle->didReceiveMessageToPage(this, messageName, messageBody.get());
+}
+
void WebPage::installPageOverlay(PassRefPtr<PageOverlay> pageOverlay)
{
bool shouldFadeIn = true;
@@ -1364,21 +1420,11 @@ static bool handleMouseEvent(const WebMouseEvent& mouseEvent, WebPage* page, boo
if (isContextClick(platformMouseEvent))
handled = handleContextMenuEvent(platformMouseEvent, page);
#endif
-#if PLATFORM(GTK)
- bool gtkMouseButtonPressHandled = page->handleMousePressedEvent(platformMouseEvent);
- handled = handled || gtkMouseButtonPressHandled;
-#endif
-
- return handled;
- }
- case PlatformEvent::MouseReleased: {
- bool handled = frame->eventHandler()->handleMouseReleaseEvent(platformMouseEvent);
-#if PLATFORM(QT)
- if (!handled)
- handled = page->handleMouseReleaseEvent(platformMouseEvent);
-#endif
return handled;
}
+ case PlatformEvent::MouseReleased:
+ return frame->eventHandler()->handleMouseReleaseEvent(platformMouseEvent);
+
case PlatformEvent::MouseMoved:
if (onlyUpdateScrollbars)
return frame->eventHandler()->passMouseMovedEventToScrollbars(platformMouseEvent);
@@ -1520,9 +1566,13 @@ void WebPage::validateCommand(const String& commandName, uint64_t callbackID)
int32_t state = 0;
Frame* frame = m_page->focusController()->focusedOrMainFrame();
if (frame) {
- Editor::Command command = frame->editor()->command(commandName);
- state = command.state();
- isEnabled = command.isSupported() && command.isEnabled();
+ if (PluginView* pluginView = pluginViewForFrame(frame))
+ isEnabled = pluginView->isEditingCommandEnabled(commandName);
+ else {
+ Editor::Command command = frame->editor()->command(commandName);
+ state = command.state();
+ isEnabled = command.isSupported() && command.isEnabled();
+ }
}
send(Messages::WebPageProxy::ValidateCommandCallback(commandName, isEnabled, state, callbackID));
@@ -1790,6 +1840,22 @@ void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, ui
frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID);
}
+void WebPage::didStartPageTransition()
+{
+ m_drawingArea->setLayerTreeStateIsFrozen(true);
+}
+
+void WebPage::didCompletePageTransition()
+{
+#if PLATFORM(QT)
+ if (m_mainFrame->coreFrame()->view()->delegatesScrolling())
+ // Wait until the UI process sent us the visible rect it wants rendered.
+ send(Messages::WebPageProxy::PageTransitionViewportReady());
+ else
+#endif
+ m_drawingArea->setLayerTreeStateIsFrozen(false);
+}
+
void WebPage::show()
{
send(Messages::WebPageProxy::ShowPage());
@@ -1916,7 +1982,7 @@ void WebPage::getMainResourceDataOfFrame(uint64_t frameID, uint64_t callbackID)
{
CoreIPC::DataReference dataReference;
- RefPtr<SharedBuffer> buffer;
+ RefPtr<ResourceBuffer> buffer;
if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
if (DocumentLoader* loader = frame->coreFrame()->loader()->documentLoader()) {
if ((buffer = loader->mainResourceData()))
@@ -2025,6 +2091,10 @@ void WebPage::updatePreferences(const WebPreferencesStore& store)
m_scrollingPerformanceLoggingEnabled = store.getBoolValueForKey(WebPreferencesKey::scrollingPerformanceLoggingEnabledKey());
+#if PLATFORM(MAC)
+ m_pdfPluginEnabled = store.getBoolValueForKey(WebPreferencesKey::pdfPluginEnabledKey());
+#endif
+
// FIXME: This should be generated from macro expansion for all preferences,
// but we currently don't match the naming of WebCore exactly so we are
// handrolling the boolean and integer preferences until that is fixed.
@@ -2139,11 +2209,14 @@ void WebPage::updatePreferences(const WebPreferencesStore& store)
settings->setShouldRespectImageOrientation(store.getBoolValueForKey(WebPreferencesKey::shouldRespectImageOrientationKey()));
settings->setStorageBlockingPolicy(static_cast<SecurityOrigin::StorageBlockingPolicy>(store.getUInt32ValueForKey(WebPreferencesKey::storageBlockingPolicyKey())));
+ settings->setCookieEnabled(store.getBoolValueForKey(WebPreferencesKey::cookieEnabledKey()));
settings->setDiagnosticLoggingEnabled(store.getBoolValueForKey(WebPreferencesKey::diagnosticLoggingEnabledKey()));
settings->setScrollingPerformanceLoggingEnabled(m_scrollingPerformanceLoggingEnabled);
+ settings->setPlugInSnapshottingEnabled(store.getBoolValueForKey(WebPreferencesKey::plugInSnapshottingEnabledKey()));
+
platformPreferencesDidChange(store);
if (m_drawingArea)
@@ -2610,12 +2683,16 @@ void WebPage::didChangeScrollOffsetForMainFrame()
bool isPinnedToLeftSide = (scrollPosition.x() <= minimumScrollPosition.x());
bool isPinnedToRightSide = (scrollPosition.x() >= maximumScrollPosition.x());
+ bool isPinnedToTopSide = (scrollPosition.y() <= minimumScrollPosition.y());
+ bool isPinnedToBottomSide = (scrollPosition.y() >= maximumScrollPosition.y());
- if (isPinnedToLeftSide != m_cachedMainFrameIsPinnedToLeftSide || isPinnedToRightSide != m_cachedMainFrameIsPinnedToRightSide) {
- send(Messages::WebPageProxy::DidChangeScrollOffsetPinningForMainFrame(isPinnedToLeftSide, isPinnedToRightSide));
+ if (isPinnedToLeftSide != m_cachedMainFrameIsPinnedToLeftSide || isPinnedToRightSide != m_cachedMainFrameIsPinnedToRightSide || isPinnedToTopSide != m_cachedMainFrameIsPinnedToTopSide || isPinnedToBottomSide != m_cachedMainFrameIsPinnedToBottomSide) {
+ send(Messages::WebPageProxy::DidChangeScrollOffsetPinningForMainFrame(isPinnedToLeftSide, isPinnedToRightSide, isPinnedToTopSide, isPinnedToBottomSide));
m_cachedMainFrameIsPinnedToLeftSide = isPinnedToLeftSide;
m_cachedMainFrameIsPinnedToRightSide = isPinnedToRightSide;
+ m_cachedMainFrameIsPinnedToTopSide = isPinnedToTopSide;
+ m_cachedMainFrameIsPinnedToBottomSide = isPinnedToBottomSide;
}
}
@@ -3178,6 +3255,13 @@ bool WebPage::canHandleRequest(const WebCore::ResourceRequest& request)
return platformCanHandleRequest(request);
}
+#if USE(TILED_BACKING_STORE)
+void WebPage::commitPageTransitionViewport()
+{
+ m_drawingArea->setLayerTreeStateIsFrozen(false);
+}
+#endif
+
#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
void WebPage::handleAlternativeTextUIResult(const String& result)
{
@@ -3307,7 +3391,7 @@ FrameView* WebPage::mainFrameView() const
return 0;
}
-#if ENABLE(PAGE_VISIBILITY_API)
+#if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING)
void WebPage::setVisibilityState(int visibilityState, bool isInitialState)
{
if (!m_page)
@@ -3315,6 +3399,7 @@ void WebPage::setVisibilityState(int visibilityState, bool isInitialState)
WebCore::PageVisibilityState state = static_cast<WebCore::PageVisibilityState>(visibilityState);
+#if ENABLE(PAGE_VISIBILITY_API)
if (m_visibilityState == state)
return;
@@ -3334,6 +3419,11 @@ void WebPage::setVisibilityState(int visibilityState, bool isInitialState)
if (view)
view->hide();
}
+#endif
+
+#if ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) && !ENABLE(PAGE_VISIBILITY_API)
+ m_page->setVisibilityState(state, isInitialState);
+#endif
}
#endif
@@ -3348,4 +3438,24 @@ void WebPage::setScrollingPerformanceLoggingEnabled(bool enabled)
frameView->setScrollingPerformanceLoggingEnabled(enabled);
}
+static bool canPluginHandleResponse(const ResourceResponse& response)
+{
+ String pluginPath;
+ bool blocked;
+
+ if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::GetPluginPath(response.mimeType(), response.url().string()), Messages::WebProcessProxy::GetPluginPath::Reply(pluginPath, blocked), 0))
+ return false;
+
+ return !blocked && !pluginPath.isEmpty();
+}
+
+bool WebPage::shouldUseCustomRepresentationForResponse(const ResourceResponse& response) const
+{
+ if (!m_mimeTypesWithCustomRepresentations.contains(response.mimeType()))
+ return false;
+
+ // If a plug-in exists that claims to support this response, it should take precedence over the custom representation.
+ return !canPluginHandleResponse(response);
+}
+
} // namespace WebKit