• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
3   *
4   * Redistribution and use in source and binary forms, with or without
5   * modification, are permitted provided that the following conditions
6   * are met:
7   * 1. Redistributions of source code must retain the above copyright
8   *    notice, this list of conditions and the following disclaimer.
9   * 2. Redistributions in binary form must reproduce the above copyright
10   *    notice, this list of conditions and the following disclaimer in the
11   *    documentation and/or other materials provided with the distribution.
12   *
13   * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16   * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23   * THE POSSIBILITY OF SUCH DAMAGE.
24   */
25  
26  #include "config.h"
27  #include "WebPage.h"
28  
29  #include "Arguments.h"
30  #include "DataReference.h"
31  #include "DecoderAdapter.h"
32  #include "DrawingArea.h"
33  #include "InjectedBundle.h"
34  #include "InjectedBundleBackForwardList.h"
35  #include "LayerTreeHost.h"
36  #include "MessageID.h"
37  #include "NetscapePlugin.h"
38  #include "PageOverlay.h"
39  #include "PluginProxy.h"
40  #include "PluginView.h"
41  #include "PrintInfo.h"
42  #include "RunLoop.h"
43  #include "SessionState.h"
44  #include "ShareableBitmap.h"
45  #include "WebBackForwardList.h"
46  #include "WebBackForwardListItem.h"
47  #include "WebBackForwardListProxy.h"
48  #include "WebChromeClient.h"
49  #include "WebContextMenu.h"
50  #include "WebContextMenuClient.h"
51  #include "WebContextMessages.h"
52  #include "WebCoreArgumentCoders.h"
53  #include "WebDragClient.h"
54  #include "WebEditorClient.h"
55  #include "WebEvent.h"
56  #include "WebEventConversion.h"
57  #include "WebFrame.h"
58  #include "WebFullScreenManager.h"
59  #include "WebGeolocationClient.h"
60  #include "WebImage.h"
61  #include "WebInspector.h"
62  #include "WebInspectorClient.h"
63  #include "WebOpenPanelResultListener.h"
64  #include "WebPageCreationParameters.h"
65  #include "WebPageGroupProxy.h"
66  #include "WebPageProxyMessages.h"
67  #include "WebPopupMenu.h"
68  #include "WebPreferencesStore.h"
69  #include "WebProcess.h"
70  #include "WebProcessProxyMessages.h"
71  #include <JavaScriptCore/APICast.h>
72  #include <WebCore/AbstractDatabase.h>
73  #include <WebCore/ArchiveResource.h>
74  #include <WebCore/Chrome.h>
75  #include <WebCore/ContextMenuController.h>
76  #include <WebCore/DocumentFragment.h>
77  #include <WebCore/DocumentLoader.h>
78  #include <WebCore/DocumentMarkerController.h>
79  #include <WebCore/DragController.h>
80  #include <WebCore/DragData.h>
81  #include <WebCore/EditingBehavior.h>
82  #include <WebCore/EventHandler.h>
83  #include <WebCore/FocusController.h>
84  #include <WebCore/FormState.h>
85  #include <WebCore/Frame.h>
86  #include <WebCore/FrameLoadRequest.h>
87  #include <WebCore/FrameLoaderTypes.h>
88  #include <WebCore/FrameView.h>
89  #include <WebCore/HTMLFormElement.h>
90  #include <WebCore/HistoryItem.h>
91  #include <WebCore/KeyboardEvent.h>
92  #include <WebCore/MouseEvent.h>
93  #include <WebCore/Page.h>
94  #include <WebCore/PlatformKeyboardEvent.h>
95  #include <WebCore/PrintContext.h>
96  #include <WebCore/RenderLayer.h>
97  #include <WebCore/RenderTreeAsText.h>
98  #include <WebCore/RenderView.h>
99  #include <WebCore/ReplaceSelectionCommand.h>
100  #include <WebCore/ResourceRequest.h>
101  #include <WebCore/SchemeRegistry.h>
102  #include <WebCore/SerializedScriptValue.h>
103  #include <WebCore/Settings.h>
104  #include <WebCore/SharedBuffer.h>
105  #include <WebCore/SubstituteData.h>
106  #include <WebCore/TextIterator.h>
107  #include <WebCore/markup.h>
108  #include <runtime/JSLock.h>
109  #include <runtime/JSValue.h>
110  
111  #include <WebCore/Range.h>
112  #include <WebCore/VisiblePosition.h>
113  
114  #if PLATFORM(MAC) || PLATFORM(WIN)
115  #include <WebCore/LegacyWebArchive.h>
116  #endif
117  
118  #if ENABLE(PLUGIN_PROCESS)
119  #if PLATFORM(MAC)
120  #include "MachPort.h"
121  #endif
122  #endif
123  
124  #if PLATFORM(QT)
125  #include "HitTestResult.h"
126  #endif
127  
128  #ifndef NDEBUG
129  #include <wtf/RefCountedLeakCounter.h>
130  #endif
131  
132  using namespace JSC;
133  using namespace WebCore;
134  
135  namespace WebKit {
136  
137  #ifndef NDEBUG
138  static WTF::RefCountedLeakCounter webPageCounter("WebPage");
139  #endif
140  
create(uint64_t pageID,const WebPageCreationParameters & parameters)141  PassRefPtr<WebPage> WebPage::create(uint64_t pageID, const WebPageCreationParameters& parameters)
142  {
143      RefPtr<WebPage> page = adoptRef(new WebPage(pageID, parameters));
144  
145      if (page->pageGroup()->isVisibleToInjectedBundle() && WebProcess::shared().injectedBundle())
146          WebProcess::shared().injectedBundle()->didCreatePage(page.get());
147  
148      return page.release();
149  }
150  
WebPage(uint64_t pageID,const WebPageCreationParameters & parameters)151  WebPage::WebPage(uint64_t pageID, const WebPageCreationParameters& parameters)
152      : m_viewSize(parameters.viewSize)
153      , m_drawsBackground(true)
154      , m_drawsTransparentBackground(false)
155      , m_isInRedo(false)
156      , m_isClosed(false)
157      , m_tabToLinks(false)
158  #if PLATFORM(MAC)
159      , m_windowIsVisible(false)
160      , m_isSmartInsertDeleteEnabled(parameters.isSmartInsertDeleteEnabled)
161      , m_keyboardEventBeingInterpreted(0)
162  #elif PLATFORM(WIN)
163      , m_nativeWindow(parameters.nativeWindow)
164  #endif
165      , m_findController(this)
166      , m_geolocationPermissionRequestManager(this)
167      , m_pageID(pageID)
168      , m_canRunBeforeUnloadConfirmPanel(parameters.canRunBeforeUnloadConfirmPanel)
169      , m_canRunModal(parameters.canRunModal)
170      , m_isRunningModal(false)
171      , m_userSpaceScaleFactor(parameters.userSpaceScaleFactor)
172      , m_cachedMainFrameIsPinnedToLeftSide(false)
173      , m_cachedMainFrameIsPinnedToRightSide(false)
174      , m_isShowingContextMenu(false)
175  #if PLATFORM(WIN)
176      , m_gestureReachedScrollingLimit(false)
177  #endif
178  {
179      ASSERT(m_pageID);
180  
181      Page::PageClients pageClients;
182      pageClients.chromeClient = new WebChromeClient(this);
183      pageClients.contextMenuClient = new WebContextMenuClient(this);
184      pageClients.editorClient = new WebEditorClient(this);
185      pageClients.dragClient = new WebDragClient(this);
186      pageClients.backForwardClient = WebBackForwardListProxy::create(this);
187  #if ENABLE(CLIENT_BASED_GEOLOCATION)
188      pageClients.geolocationClient = new WebGeolocationClient(this);
189  #endif
190  #if ENABLE(INSPECTOR)
191      pageClients.inspectorClient = new WebInspectorClient(this);
192  #endif
193      m_page = adoptPtr(new Page(pageClients));
194  
195      // Qt does not yet call setIsInWindow. Until it does, just leave
196      // this line out so plug-ins and video will work. Eventually all platforms
197      // should call setIsInWindow and this comment and #if should be removed,
198      // leaving behind the setCanStartMedia call.
199  #if !PLATFORM(QT)
200      m_page->setCanStartMedia(false);
201  #endif
202  
203      updatePreferences(parameters.store);
204  
205      m_pageGroup = WebProcess::shared().webPageGroup(parameters.pageGroupData);
206      m_page->setGroupName(m_pageGroup->identifier());
207  
208      platformInitialize();
209      Settings::setDefaultMinDOMTimerInterval(0.004);
210  
211      m_drawingArea = DrawingArea::create(this, parameters);
212      m_mainFrame = WebFrame::createMainFrame(this);
213  
214      setDrawsBackground(parameters.drawsBackground);
215      setDrawsTransparentBackground(parameters.drawsTransparentBackground);
216  
217      setMemoryCacheMessagesEnabled(parameters.areMemoryCacheClientCallsEnabled);
218  
219      setActive(parameters.isActive);
220      setFocused(parameters.isFocused);
221      setIsInWindow(parameters.isInWindow);
222  
223      m_userAgent = parameters.userAgent;
224  
225      WebBackForwardListProxy::setHighestItemIDFromUIProcess(parameters.highestUsedBackForwardItemID);
226  
227      if (!parameters.sessionState.isEmpty())
228          restoreSession(parameters.sessionState);
229  
230  #ifndef NDEBUG
231      webPageCounter.increment();
232  #endif
233  }
234  
~WebPage()235  WebPage::~WebPage()
236  {
237      if (m_backForwardList)
238          m_backForwardList->detach();
239  
240      ASSERT(!m_page);
241  
242      m_sandboxExtensionTracker.invalidate();
243  
244  #if PLATFORM(MAC)
245      ASSERT(m_pluginViews.isEmpty());
246  #endif
247  
248  #ifndef NDEBUG
249      webPageCounter.decrement();
250  #endif
251  }
252  
dummy(bool &)253  void WebPage::dummy(bool&)
254  {
255  }
256  
connection() const257  CoreIPC::Connection* WebPage::connection() const
258  {
259      return WebProcess::shared().connection();
260  }
261  
initializeInjectedBundleContextMenuClient(WKBundlePageContextMenuClient * client)262  void WebPage::initializeInjectedBundleContextMenuClient(WKBundlePageContextMenuClient* client)
263  {
264      m_contextMenuClient.initialize(client);
265  }
266  
initializeInjectedBundleEditorClient(WKBundlePageEditorClient * client)267  void WebPage::initializeInjectedBundleEditorClient(WKBundlePageEditorClient* client)
268  {
269      m_editorClient.initialize(client);
270  }
271  
initializeInjectedBundleFormClient(WKBundlePageFormClient * client)272  void WebPage::initializeInjectedBundleFormClient(WKBundlePageFormClient* client)
273  {
274      m_formClient.initialize(client);
275  }
276  
initializeInjectedBundleLoaderClient(WKBundlePageLoaderClient * client)277  void WebPage::initializeInjectedBundleLoaderClient(WKBundlePageLoaderClient* client)
278  {
279      m_loaderClient.initialize(client);
280  }
281  
initializeInjectedBundlePolicyClient(WKBundlePagePolicyClient * client)282  void WebPage::initializeInjectedBundlePolicyClient(WKBundlePagePolicyClient* client)
283  {
284      m_policyClient.initialize(client);
285  }
286  
initializeInjectedBundleResourceLoadClient(WKBundlePageResourceLoadClient * client)287  void WebPage::initializeInjectedBundleResourceLoadClient(WKBundlePageResourceLoadClient* client)
288  {
289      m_resourceLoadClient.initialize(client);
290  }
291  
initializeInjectedBundleUIClient(WKBundlePageUIClient * client)292  void WebPage::initializeInjectedBundleUIClient(WKBundlePageUIClient* client)
293  {
294      m_uiClient.initialize(client);
295  }
296  
297  #if ENABLE(FULLSCREEN_API)
initializeInjectedBundleFullScreenClient(WKBundlePageFullScreenClient * client)298  void WebPage::initializeInjectedBundleFullScreenClient(WKBundlePageFullScreenClient* client)
299  {
300      m_fullScreenClient.initialize(client);
301  }
302  #endif
303  
createPlugin(const Plugin::Parameters & parameters)304  PassRefPtr<Plugin> WebPage::createPlugin(const Plugin::Parameters& parameters)
305  {
306      String pluginPath;
307  
308      if (!WebProcess::shared().connection()->sendSync(
309              Messages::WebContext::GetPluginPath(parameters.mimeType, parameters.url.string()),
310              Messages::WebContext::GetPluginPath::Reply(pluginPath), 0)) {
311          return 0;
312      }
313  
314      if (pluginPath.isNull())
315          return 0;
316  
317  #if ENABLE(PLUGIN_PROCESS)
318      return PluginProxy::create(pluginPath);
319  #else
320      return NetscapePlugin::create(NetscapePluginModule::getOrCreate(pluginPath));
321  #endif
322  }
323  
editorState() const324  EditorState WebPage::editorState() const
325  {
326      Frame* frame = m_page->focusController()->focusedOrMainFrame();
327      ASSERT(frame);
328  
329      EditorState result;
330      result.selectionIsNone = frame->selection()->isNone();
331      result.selectionIsRange = frame->selection()->isRange();
332      result.isContentEditable = frame->selection()->isContentEditable();
333      result.isContentRichlyEditable = frame->selection()->isContentRichlyEditable();
334      result.isInPasswordField = frame->selection()->isInPasswordField();
335      result.hasComposition = frame->editor()->hasComposition();
336  
337      return result;
338  }
339  
renderTreeExternalRepresentation() const340  String WebPage::renderTreeExternalRepresentation() const
341  {
342      return externalRepresentation(m_mainFrame->coreFrame(), RenderAsTextBehaviorNormal);
343  }
344  
executeEditingCommand(const String & commandName,const String & argument)345  void WebPage::executeEditingCommand(const String& commandName, const String& argument)
346  {
347      Frame* frame = m_page->focusController()->focusedOrMainFrame();
348      if (!frame)
349          return;
350      frame->editor()->command(commandName).execute(argument);
351  }
352  
isEditingCommandEnabled(const String & commandName)353  bool WebPage::isEditingCommandEnabled(const String& commandName)
354  {
355      Frame* frame = m_page->focusController()->focusedOrMainFrame();
356      if (!frame)
357          return false;
358  
359      Editor::Command command = frame->editor()->command(commandName);
360      return command.isSupported() && command.isEnabled();
361  }
362  
clearMainFrameName()363  void WebPage::clearMainFrameName()
364  {
365      mainFrame()->coreFrame()->tree()->clearName();
366  }
367  
368  #if USE(ACCELERATED_COMPOSITING)
enterAcceleratedCompositingMode(GraphicsLayer * layer)369  void WebPage::enterAcceleratedCompositingMode(GraphicsLayer* layer)
370  {
371      m_drawingArea->setRootCompositingLayer(layer);
372  }
373  
exitAcceleratedCompositingMode()374  void WebPage::exitAcceleratedCompositingMode()
375  {
376      m_drawingArea->setRootCompositingLayer(0);
377  }
378  #endif
379  
close()380  void WebPage::close()
381  {
382      if (m_isClosed)
383          return;
384  
385      m_isClosed = true;
386  
387      if (pageGroup()->isVisibleToInjectedBundle() && WebProcess::shared().injectedBundle())
388          WebProcess::shared().injectedBundle()->willDestroyPage(this);
389  
390  #if ENABLE(INSPECTOR)
391      m_inspector = 0;
392  #endif
393  #if ENABLE(FULLSCREEN_API)
394      m_fullScreenManager = 0;
395  #endif
396  
397      if (m_activePopupMenu) {
398          m_activePopupMenu->disconnectFromPage();
399          m_activePopupMenu = 0;
400      }
401  
402      if (m_activeOpenPanelResultListener) {
403          m_activeOpenPanelResultListener->disconnectFromPage();
404          m_activeOpenPanelResultListener = 0;
405      }
406  
407      m_sandboxExtensionTracker.invalidate();
408  
409      m_printContext = nullptr;
410  
411      m_mainFrame->coreFrame()->loader()->detachFromParent();
412      m_page.clear();
413  
414      m_drawingArea.clear();
415  
416      bool isRunningModal = m_isRunningModal;
417      m_isRunningModal = false;
418  
419      // The WebPage can be destroyed by this call.
420      WebProcess::shared().removeWebPage(m_pageID);
421  
422      if (isRunningModal)
423          WebProcess::shared().runLoop()->stop();
424  }
425  
tryClose()426  void WebPage::tryClose()
427  {
428      if (!m_mainFrame->coreFrame()->loader()->shouldClose())
429          return;
430  
431      sendClose();
432  }
433  
sendClose()434  void WebPage::sendClose()
435  {
436      send(Messages::WebPageProxy::ClosePage());
437  }
438  
loadURL(const String & url,const SandboxExtension::Handle & sandboxExtensionHandle)439  void WebPage::loadURL(const String& url, const SandboxExtension::Handle& sandboxExtensionHandle)
440  {
441      loadURLRequest(ResourceRequest(KURL(KURL(), url)), sandboxExtensionHandle);
442  }
443  
loadURLRequest(const ResourceRequest & request,const SandboxExtension::Handle & sandboxExtensionHandle)444  void WebPage::loadURLRequest(const ResourceRequest& request, const SandboxExtension::Handle& sandboxExtensionHandle)
445  {
446      m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), sandboxExtensionHandle);
447      m_mainFrame->coreFrame()->loader()->load(request, false);
448  }
449  
loadData(PassRefPtr<SharedBuffer> sharedBuffer,const String & MIMEType,const String & encodingName,const KURL & baseURL,const KURL & unreachableURL)450  void WebPage::loadData(PassRefPtr<SharedBuffer> sharedBuffer, const String& MIMEType, const String& encodingName, const KURL& baseURL, const KURL& unreachableURL)
451  {
452      ResourceRequest request(baseURL);
453      SubstituteData substituteData(sharedBuffer, MIMEType, encodingName, unreachableURL);
454      m_mainFrame->coreFrame()->loader()->load(request, substituteData, false);
455  }
456  
loadHTMLString(const String & htmlString,const String & baseURLString)457  void WebPage::loadHTMLString(const String& htmlString, const String& baseURLString)
458  {
459      RefPtr<SharedBuffer> sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(htmlString.characters()), htmlString.length() * sizeof(UChar));
460      KURL baseURL = baseURLString.isEmpty() ? blankURL() : KURL(KURL(), baseURLString);
461      loadData(sharedBuffer, "text/html", "utf-16", baseURL, KURL());
462  }
463  
loadAlternateHTMLString(const String & htmlString,const String & baseURLString,const String & unreachableURLString)464  void WebPage::loadAlternateHTMLString(const String& htmlString, const String& baseURLString, const String& unreachableURLString)
465  {
466      RefPtr<SharedBuffer> sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(htmlString.characters()), htmlString.length() * sizeof(UChar));
467      KURL baseURL = baseURLString.isEmpty() ? blankURL() : KURL(KURL(), baseURLString);
468      KURL unreachableURL = unreachableURLString.isEmpty() ? KURL() : KURL(KURL(), unreachableURLString);
469      loadData(sharedBuffer, "text/html", "utf-16", baseURL, unreachableURL);
470  }
471  
loadPlainTextString(const String & string)472  void WebPage::loadPlainTextString(const String& string)
473  {
474      RefPtr<SharedBuffer> sharedBuffer = SharedBuffer::create(reinterpret_cast<const char*>(string.characters()), string.length() * sizeof(UChar));
475      loadData(sharedBuffer, "text/plain", "utf-16", blankURL(), KURL());
476  }
477  
linkClicked(const String & url,const WebMouseEvent & event)478  void WebPage::linkClicked(const String& url, const WebMouseEvent& event)
479  {
480      Frame* frame = m_page->mainFrame();
481      if (!frame)
482          return;
483  
484      RefPtr<Event> coreEvent;
485      if (event.type() != WebEvent::NoType)
486          coreEvent = MouseEvent::create(eventNames().clickEvent, frame->document()->defaultView(), platform(event), 0, 0);
487  
488      frame->loader()->loadFrameRequest(FrameLoadRequest(frame->document()->securityOrigin(), ResourceRequest(url)),
489          false, false, coreEvent.get(), 0, SendReferrer);
490  }
491  
stopLoadingFrame(uint64_t frameID)492  void WebPage::stopLoadingFrame(uint64_t frameID)
493  {
494      WebFrame* frame = WebProcess::shared().webFrame(frameID);
495      if (!frame)
496          return;
497  
498      frame->coreFrame()->loader()->stopForUserCancel();
499  }
500  
stopLoading()501  void WebPage::stopLoading()
502  {
503      m_mainFrame->coreFrame()->loader()->stopForUserCancel();
504  }
505  
setDefersLoading(bool defersLoading)506  void WebPage::setDefersLoading(bool defersLoading)
507  {
508      m_page->setDefersLoading(defersLoading);
509  }
510  
reload(bool reloadFromOrigin)511  void WebPage::reload(bool reloadFromOrigin)
512  {
513      m_mainFrame->coreFrame()->loader()->reload(reloadFromOrigin);
514  }
515  
goForward(uint64_t backForwardItemID,const SandboxExtension::Handle & sandboxExtensionHandle)516  void WebPage::goForward(uint64_t backForwardItemID, const SandboxExtension::Handle& sandboxExtensionHandle)
517  {
518      HistoryItem* item = WebBackForwardListProxy::itemForID(backForwardItemID);
519      ASSERT(item);
520      if (!item)
521          return;
522  
523      m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), sandboxExtensionHandle);
524      m_page->goToItem(item, FrameLoadTypeForward);
525  }
526  
goBack(uint64_t backForwardItemID,const SandboxExtension::Handle & sandboxExtensionHandle)527  void WebPage::goBack(uint64_t backForwardItemID, const SandboxExtension::Handle& sandboxExtensionHandle)
528  {
529      HistoryItem* item = WebBackForwardListProxy::itemForID(backForwardItemID);
530      ASSERT(item);
531      if (!item)
532          return;
533  
534      m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), sandboxExtensionHandle);
535      m_page->goToItem(item, FrameLoadTypeBack);
536  }
537  
goToBackForwardItem(uint64_t backForwardItemID,const SandboxExtension::Handle & sandboxExtensionHandle)538  void WebPage::goToBackForwardItem(uint64_t backForwardItemID, const SandboxExtension::Handle& sandboxExtensionHandle)
539  {
540      HistoryItem* item = WebBackForwardListProxy::itemForID(backForwardItemID);
541      ASSERT(item);
542      if (!item)
543          return;
544  
545      m_sandboxExtensionTracker.beginLoad(m_mainFrame.get(), sandboxExtensionHandle);
546      m_page->goToItem(item, FrameLoadTypeIndexedBackForward);
547  }
548  
layoutIfNeeded()549  void WebPage::layoutIfNeeded()
550  {
551      if (m_mainFrame->coreFrame()->view())
552          m_mainFrame->coreFrame()->view()->updateLayoutAndStyleIfNeededRecursive();
553  }
554  
setSize(const WebCore::IntSize & viewSize)555  void WebPage::setSize(const WebCore::IntSize& viewSize)
556  {
557  #if ENABLE(TILED_BACKING_STORE)
558      // If we are resizing to content ignore external attempts.
559      if (!m_resizesToContentsLayoutSize.isEmpty())
560          return;
561  #endif
562  
563      if (m_viewSize == viewSize)
564          return;
565  
566      Frame* frame = m_page->mainFrame();
567  
568      frame->view()->resize(viewSize);
569      frame->view()->setNeedsLayout();
570      m_drawingArea->setNeedsDisplay(IntRect(IntPoint(0, 0), viewSize));
571  
572      m_viewSize = viewSize;
573  }
574  
575  #if ENABLE(TILED_BACKING_STORE)
setActualVisibleContentRect(const IntRect & rect)576  void WebPage::setActualVisibleContentRect(const IntRect& rect)
577  {
578      Frame* frame = m_page->mainFrame();
579  
580      frame->view()->setActualVisibleContentRect(rect);
581  }
582  
setResizesToContentsUsingLayoutSize(const IntSize & targetLayoutSize)583  void WebPage::setResizesToContentsUsingLayoutSize(const IntSize& targetLayoutSize)
584  {
585      if (m_resizesToContentsLayoutSize == targetLayoutSize)
586          return;
587  
588      m_resizesToContentsLayoutSize = targetLayoutSize;
589  
590      Frame* frame = m_page->mainFrame();
591      if (m_resizesToContentsLayoutSize.isEmpty()) {
592          frame->view()->setDelegatesScrolling(false);
593          frame->view()->setUseFixedLayout(false);
594          frame->view()->setPaintsEntireContents(false);
595      } else {
596          frame->view()->setDelegatesScrolling(true);
597          frame->view()->setUseFixedLayout(true);
598          frame->view()->setPaintsEntireContents(true);
599          frame->view()->setFixedLayoutSize(m_resizesToContentsLayoutSize);
600      }
601      frame->view()->forceLayout();
602  }
603  
resizeToContentsIfNeeded()604  void WebPage::resizeToContentsIfNeeded()
605  {
606      if (m_resizesToContentsLayoutSize.isEmpty())
607          return;
608  
609      Frame* frame = m_page->mainFrame();
610  
611      IntSize contentSize = frame->view()->contentsSize();
612      if (contentSize == m_viewSize)
613          return;
614  
615      m_viewSize = contentSize;
616      frame->view()->resize(m_viewSize);
617      frame->view()->setNeedsLayout();
618  }
619  #endif
620  
scrollMainFrameIfNotAtMaxScrollPosition(const IntSize & scrollOffset)621  void WebPage::scrollMainFrameIfNotAtMaxScrollPosition(const IntSize& scrollOffset)
622  {
623      Frame* frame = m_page->mainFrame();
624  
625      IntPoint scrollPosition = frame->view()->scrollPosition();
626      IntPoint maximumScrollPosition = frame->view()->maximumScrollPosition();
627  
628      // If the current scroll position in a direction is the max scroll position
629      // we don't want to scroll at all.
630      IntSize newScrollOffset;
631      if (scrollPosition.x() < maximumScrollPosition.x())
632          newScrollOffset.setWidth(scrollOffset.width());
633      if (scrollPosition.y() < maximumScrollPosition.y())
634          newScrollOffset.setHeight(scrollOffset.height());
635  
636      if (newScrollOffset.isZero())
637          return;
638  
639      frame->view()->setScrollPosition(frame->view()->scrollPosition() + newScrollOffset);
640  }
641  
drawRect(GraphicsContext & graphicsContext,const IntRect & rect)642  void WebPage::drawRect(GraphicsContext& graphicsContext, const IntRect& rect)
643  {
644      graphicsContext.save();
645      graphicsContext.clip(rect);
646      m_mainFrame->coreFrame()->view()->paint(&graphicsContext, rect);
647      graphicsContext.restore();
648  }
649  
drawPageOverlay(GraphicsContext & graphicsContext,const IntRect & rect)650  void WebPage::drawPageOverlay(GraphicsContext& graphicsContext, const IntRect& rect)
651  {
652      ASSERT(m_pageOverlay);
653  
654      graphicsContext.save();
655      graphicsContext.clip(rect);
656      m_pageOverlay->drawRect(graphicsContext, rect);
657      graphicsContext.restore();
658  }
659  
textZoomFactor() const660  double WebPage::textZoomFactor() const
661  {
662      Frame* frame = m_mainFrame->coreFrame();
663      if (!frame)
664          return 1;
665      return frame->textZoomFactor();
666  }
667  
setTextZoomFactor(double zoomFactor)668  void WebPage::setTextZoomFactor(double zoomFactor)
669  {
670      Frame* frame = m_mainFrame->coreFrame();
671      if (!frame)
672          return;
673      frame->setTextZoomFactor(static_cast<float>(zoomFactor));
674  }
675  
pageZoomFactor() const676  double WebPage::pageZoomFactor() const
677  {
678      Frame* frame = m_mainFrame->coreFrame();
679      if (!frame)
680          return 1;
681      return frame->pageZoomFactor();
682  }
683  
setPageZoomFactor(double zoomFactor)684  void WebPage::setPageZoomFactor(double zoomFactor)
685  {
686      Frame* frame = m_mainFrame->coreFrame();
687      if (!frame)
688          return;
689      frame->setPageZoomFactor(static_cast<float>(zoomFactor));
690  }
691  
setPageAndTextZoomFactors(double pageZoomFactor,double textZoomFactor)692  void WebPage::setPageAndTextZoomFactors(double pageZoomFactor, double textZoomFactor)
693  {
694      Frame* frame = m_mainFrame->coreFrame();
695      if (!frame)
696          return;
697      return frame->setPageAndTextZoomFactors(static_cast<float>(pageZoomFactor), static_cast<float>(textZoomFactor));
698  }
699  
scaleWebView(double scale,const IntPoint & origin)700  void WebPage::scaleWebView(double scale, const IntPoint& origin)
701  {
702      Frame* frame = m_mainFrame->coreFrame();
703      if (!frame)
704          return;
705      frame->scalePage(scale, origin);
706  
707      send(Messages::WebPageProxy::ViewScaleFactorDidChange(scale));
708  }
709  
viewScaleFactor() const710  double WebPage::viewScaleFactor() const
711  {
712      Frame* frame = m_mainFrame->coreFrame();
713      if (!frame)
714          return 1;
715      return frame->pageScaleFactor();
716  }
717  
setUseFixedLayout(bool fixed)718  void WebPage::setUseFixedLayout(bool fixed)
719  {
720      Frame* frame = m_mainFrame->coreFrame();
721      if (!frame)
722          return;
723  
724      FrameView* view = frame->view();
725      if (!view)
726          return;
727  
728      view->setUseFixedLayout(fixed);
729      if (!fixed)
730          view->setFixedLayoutSize(IntSize());
731  }
732  
setFixedLayoutSize(const IntSize & size)733  void WebPage::setFixedLayoutSize(const IntSize& size)
734  {
735      Frame* frame = m_mainFrame->coreFrame();
736      if (!frame)
737          return;
738  
739      FrameView* view = frame->view();
740      if (!view)
741          return;
742  
743      view->setFixedLayoutSize(size);
744      view->forceLayout();
745  }
746  
installPageOverlay(PassRefPtr<PageOverlay> pageOverlay)747  void WebPage::installPageOverlay(PassRefPtr<PageOverlay> pageOverlay)
748  {
749      bool shouldFadeIn = true;
750  
751      if (m_pageOverlay) {
752          m_pageOverlay->setPage(0);
753  
754          if (pageOverlay) {
755              // We're installing a page overlay when a page overlay is already active.
756              // In this case we don't want to fade in the new overlay.
757              shouldFadeIn = false;
758          }
759      }
760  
761      m_pageOverlay = pageOverlay;
762      m_pageOverlay->setPage(this);
763  
764      if (shouldFadeIn)
765          m_pageOverlay->startFadeInAnimation();
766  
767      m_drawingArea->didInstallPageOverlay();
768      m_pageOverlay->setNeedsDisplay();
769  }
770  
uninstallPageOverlay(PageOverlay * pageOverlay,bool fadeOut)771  void WebPage::uninstallPageOverlay(PageOverlay* pageOverlay, bool fadeOut)
772  {
773      if (pageOverlay != m_pageOverlay)
774          return;
775  
776      if (fadeOut) {
777          m_pageOverlay->startFadeOutAnimation();
778          return;
779      }
780  
781      m_pageOverlay->setPage(0);
782      m_pageOverlay = nullptr;
783  
784      m_drawingArea->didUninstallPageOverlay();
785  }
786  
snapshotInViewCoordinates(const IntRect & rect,ImageOptions options)787  PassRefPtr<WebImage> WebPage::snapshotInViewCoordinates(const IntRect& rect, ImageOptions options)
788  {
789      FrameView* frameView = m_mainFrame->coreFrame()->view();
790      if (!frameView)
791          return 0;
792  
793      frameView->updateLayoutAndStyleIfNeededRecursive();
794  
795      PaintBehavior oldBehavior = frameView->paintBehavior();
796      frameView->setPaintBehavior(oldBehavior | PaintBehaviorFlattenCompositingLayers);
797  
798      RefPtr<WebImage> snapshot = WebImage::create(rect.size(), options);
799      OwnPtr<WebCore::GraphicsContext> graphicsContext = snapshot->bitmap()->createGraphicsContext();
800  
801      graphicsContext->save();
802      graphicsContext->translate(-rect.x(), -rect.y());
803      frameView->paint(graphicsContext.get(), rect);
804      graphicsContext->restore();
805  
806      frameView->setPaintBehavior(oldBehavior);
807  
808      return snapshot.release();
809  }
810  
scaledSnapshotInDocumentCoordinates(const IntRect & rect,double scaleFactor,ImageOptions options)811  PassRefPtr<WebImage> WebPage::scaledSnapshotInDocumentCoordinates(const IntRect& rect, double scaleFactor, ImageOptions options)
812  {
813      FrameView* frameView = m_mainFrame->coreFrame()->view();
814      if (!frameView)
815          return 0;
816  
817      frameView->updateLayoutAndStyleIfNeededRecursive();
818  
819      PaintBehavior oldBehavior = frameView->paintBehavior();
820      frameView->setPaintBehavior(oldBehavior | PaintBehaviorFlattenCompositingLayers);
821  
822      bool scale = scaleFactor != 1;
823      IntSize size = rect.size();
824      if (scale)
825          size = IntSize(ceil(rect.width() * scaleFactor), ceil(rect.height() * scaleFactor));
826  
827      RefPtr<WebImage> snapshot = WebImage::create(size, options);
828      OwnPtr<WebCore::GraphicsContext> graphicsContext = snapshot->bitmap()->createGraphicsContext();
829      graphicsContext->save();
830  
831      if (scale)
832          graphicsContext->scale(FloatSize(scaleFactor, scaleFactor));
833  
834      graphicsContext->translate(-rect.x(), -rect.y());
835      frameView->paintContents(graphicsContext.get(), rect);
836      graphicsContext->restore();
837  
838      frameView->setPaintBehavior(oldBehavior);
839  
840      return snapshot.release();
841  }
842  
snapshotInDocumentCoordinates(const IntRect & rect,ImageOptions options)843  PassRefPtr<WebImage> WebPage::snapshotInDocumentCoordinates(const IntRect& rect, ImageOptions options)
844  {
845      return scaledSnapshotInDocumentCoordinates(rect, 1, options);
846  }
847  
pageDidScroll()848  void WebPage::pageDidScroll()
849  {
850      // Hide the find indicator.
851      m_findController.hideFindIndicator();
852  
853      m_uiClient.pageDidScroll(this);
854  
855      send(Messages::WebPageProxy::PageDidScroll());
856  }
857  
858  #if ENABLE(TILED_BACKING_STORE)
pageDidRequestScroll(const IntPoint & point)859  void WebPage::pageDidRequestScroll(const IntPoint& point)
860  {
861      send(Messages::WebPageProxy::PageDidRequestScroll(point));
862  }
863  #endif
864  
contextMenu()865  WebContextMenu* WebPage::contextMenu()
866  {
867      if (!m_contextMenu)
868          m_contextMenu = WebContextMenu::create(this);
869      return m_contextMenu.get();
870  }
871  
872  // Events
873  
874  static const WebEvent* g_currentEvent = 0;
875  
876  // FIXME: WebPage::currentEvent is used by the plug-in code to avoid having to convert from DOM events back to
877  // WebEvents. When we get the event handling sorted out, this should go away and the Widgets should get the correct
878  // platform events passed to the event handler code.
currentEvent()879  const WebEvent* WebPage::currentEvent()
880  {
881      return g_currentEvent;
882  }
883  
884  class CurrentEvent {
885  public:
CurrentEvent(const WebEvent & event)886      explicit CurrentEvent(const WebEvent& event)
887          : m_previousCurrentEvent(g_currentEvent)
888      {
889          g_currentEvent = &event;
890      }
891  
~CurrentEvent()892      ~CurrentEvent()
893      {
894          g_currentEvent = m_previousCurrentEvent;
895      }
896  
897  private:
898      const WebEvent* m_previousCurrentEvent;
899  };
900  
isContextClick(const PlatformMouseEvent & event)901  static bool isContextClick(const PlatformMouseEvent& event)
902  {
903      if (event.button() == WebCore::RightButton)
904          return true;
905  
906  #if PLATFORM(MAC)
907      // FIXME: this really should be about OSX-style UI, not about the Mac port
908      if (event.button() == WebCore::LeftButton && event.ctrlKey())
909          return true;
910  #endif
911  
912      return false;
913  }
914  
handleMouseEvent(const WebMouseEvent & mouseEvent,Page * page)915  static bool handleMouseEvent(const WebMouseEvent& mouseEvent, Page* page)
916  {
917      Frame* frame = page->mainFrame();
918      if (!frame->view())
919          return false;
920  
921      PlatformMouseEvent platformMouseEvent = platform(mouseEvent);
922  
923      switch (platformMouseEvent.eventType()) {
924          case WebCore::MouseEventPressed:
925          {
926              if (isContextClick(platformMouseEvent))
927                  page->contextMenuController()->clearContextMenu();
928  
929              bool handled = frame->eventHandler()->handleMousePressEvent(platformMouseEvent);
930  
931              if (isContextClick(platformMouseEvent)) {
932                  handled = frame->eventHandler()->sendContextMenuEvent(platformMouseEvent);
933                  if (handled)
934                      page->chrome()->showContextMenu();
935              }
936  
937              return handled;
938          }
939          case WebCore::MouseEventReleased:
940              return frame->eventHandler()->handleMouseReleaseEvent(platformMouseEvent);
941          case WebCore::MouseEventMoved:
942              return frame->eventHandler()->mouseMoved(platformMouseEvent);
943  
944          default:
945              ASSERT_NOT_REACHED();
946              return false;
947      }
948  }
949  
mouseEvent(const WebMouseEvent & mouseEvent)950  void WebPage::mouseEvent(const WebMouseEvent& mouseEvent)
951  {
952      // Don't try to handle any pending mouse events if a context menu is showing.
953      if (m_isShowingContextMenu) {
954          send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(mouseEvent.type()), false));
955          return;
956      }
957  
958      bool handled = false;
959  
960      if (m_pageOverlay) {
961          // Let the page overlay handle the event.
962          handled = m_pageOverlay->mouseEvent(mouseEvent);
963      }
964  
965      if (!handled) {
966          CurrentEvent currentEvent(mouseEvent);
967  
968          handled = handleMouseEvent(mouseEvent, m_page.get());
969      }
970  
971      send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(mouseEvent.type()), handled));
972  }
973  
handleWheelEvent(const WebWheelEvent & wheelEvent,Page * page)974  static bool handleWheelEvent(const WebWheelEvent& wheelEvent, Page* page)
975  {
976      Frame* frame = page->mainFrame();
977      if (!frame->view())
978          return false;
979  
980      PlatformWheelEvent platformWheelEvent = platform(wheelEvent);
981      return frame->eventHandler()->handleWheelEvent(platformWheelEvent);
982  }
983  
wheelEvent(const WebWheelEvent & wheelEvent)984  void WebPage::wheelEvent(const WebWheelEvent& wheelEvent)
985  {
986      CurrentEvent currentEvent(wheelEvent);
987  
988      bool handled = handleWheelEvent(wheelEvent, m_page.get());
989      send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(wheelEvent.type()), handled));
990  }
991  
handleKeyEvent(const WebKeyboardEvent & keyboardEvent,Page * page)992  static bool handleKeyEvent(const WebKeyboardEvent& keyboardEvent, Page* page)
993  {
994      if (!page->mainFrame()->view())
995          return false;
996  
997      if (keyboardEvent.type() == WebEvent::Char && keyboardEvent.isSystemKey())
998          return page->focusController()->focusedOrMainFrame()->eventHandler()->handleAccessKey(platform(keyboardEvent));
999      return page->focusController()->focusedOrMainFrame()->eventHandler()->keyEvent(platform(keyboardEvent));
1000  }
1001  
keyEvent(const WebKeyboardEvent & keyboardEvent)1002  void WebPage::keyEvent(const WebKeyboardEvent& keyboardEvent)
1003  {
1004      CurrentEvent currentEvent(keyboardEvent);
1005  
1006      bool handled = handleKeyEvent(keyboardEvent, m_page.get());
1007      // FIXME: Platform default behaviors should be performed during normal DOM event dispatch (in most cases, in default keydown event handler).
1008      if (!handled)
1009          handled = performDefaultBehaviorForKeyEvent(keyboardEvent);
1010  
1011      send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(keyboardEvent.type()), handled));
1012  }
1013  
1014  #if ENABLE(GESTURE_EVENTS)
handleGestureEvent(const WebGestureEvent & gestureEvent,Page * page)1015  static bool handleGestureEvent(const WebGestureEvent& gestureEvent, Page* page)
1016  {
1017      Frame* frame = page->mainFrame();
1018      if (!frame->view())
1019          return false;
1020  
1021      PlatformGestureEvent platformGestureEvent = platform(gestureEvent);
1022      return frame->eventHandler()->handleGestureEvent(platformGestureEvent);
1023  }
1024  
gestureEvent(const WebGestureEvent & gestureEvent)1025  void WebPage::gestureEvent(const WebGestureEvent& gestureEvent)
1026  {
1027      CurrentEvent currentEvent(gestureEvent);
1028  
1029      bool handled = handleGestureEvent(gestureEvent, m_page.get());
1030      send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(gestureEvent.type()), handled));
1031  }
1032  #endif
1033  
validateCommand(const String & commandName,uint64_t callbackID)1034  void WebPage::validateCommand(const String& commandName, uint64_t callbackID)
1035  {
1036      bool isEnabled = false;
1037      int32_t state = 0;
1038      Frame* frame = m_page->focusController()->focusedOrMainFrame();
1039      if (frame) {
1040          Editor::Command command = frame->editor()->command(commandName);
1041          state = command.state();
1042          isEnabled = command.isSupported() && command.isEnabled();
1043      }
1044  
1045      send(Messages::WebPageProxy::ValidateCommandCallback(commandName, isEnabled, state, callbackID));
1046  }
1047  
executeEditCommand(const String & commandName)1048  void WebPage::executeEditCommand(const String& commandName)
1049  {
1050      executeEditingCommand(commandName, String());
1051  }
1052  
restoreSession(const SessionState & sessionState)1053  uint64_t WebPage::restoreSession(const SessionState& sessionState)
1054  {
1055      const BackForwardListItemVector& list = sessionState.list();
1056      size_t size = list.size();
1057      uint64_t currentItemID = 0;
1058      for (size_t i = 0; i < size; ++i) {
1059          WebBackForwardListItem* webItem = list[i].get();
1060          DecoderAdapter decoder(webItem->backForwardData().data(), webItem->backForwardData().size());
1061  
1062          RefPtr<HistoryItem> item = HistoryItem::decodeBackForwardTree(webItem->url(), webItem->title(), webItem->originalURL(), decoder);
1063          if (!item) {
1064              LOG_ERROR("Failed to decode a HistoryItem from session state data.");
1065              return 0;
1066          }
1067  
1068          if (i == sessionState.currentIndex())
1069              currentItemID = webItem->itemID();
1070  
1071          WebBackForwardListProxy::addItemFromUIProcess(list[i]->itemID(), item.release());
1072      }
1073      ASSERT(currentItemID);
1074      return currentItemID;
1075  }
1076  
restoreSessionAndNavigateToCurrentItem(const SessionState & sessionState,const SandboxExtension::Handle & sandboxExtensionHandle)1077  void WebPage::restoreSessionAndNavigateToCurrentItem(const SessionState& sessionState, const SandboxExtension::Handle& sandboxExtensionHandle)
1078  {
1079      if (uint64_t currentItemID = restoreSession(sessionState))
1080          goToBackForwardItem(currentItemID, sandboxExtensionHandle);
1081  }
1082  
1083  #if ENABLE(TOUCH_EVENTS)
handleTouchEvent(const WebTouchEvent & touchEvent,Page * page)1084  static bool handleTouchEvent(const WebTouchEvent& touchEvent, Page* page)
1085  {
1086      Frame* frame = page->mainFrame();
1087      if (!frame->view())
1088          return false;
1089  
1090      return frame->eventHandler()->handleTouchEvent(platform(touchEvent));
1091  }
1092  
touchEvent(const WebTouchEvent & touchEvent)1093  void WebPage::touchEvent(const WebTouchEvent& touchEvent)
1094  {
1095      CurrentEvent currentEvent(touchEvent);
1096  
1097      bool handled = handleTouchEvent(touchEvent, m_page.get());
1098  
1099      send(Messages::WebPageProxy::DidReceiveEvent(static_cast<uint32_t>(touchEvent.type()), handled));
1100  }
1101  #endif
1102  
scroll(Page * page,ScrollDirection direction,ScrollGranularity granularity)1103  void WebPage::scroll(Page* page, ScrollDirection direction, ScrollGranularity granularity)
1104  {
1105      page->focusController()->focusedOrMainFrame()->eventHandler()->scrollRecursively(direction, granularity);
1106  }
1107  
logicalScroll(Page * page,ScrollLogicalDirection direction,ScrollGranularity granularity)1108  void WebPage::logicalScroll(Page* page, ScrollLogicalDirection direction, ScrollGranularity granularity)
1109  {
1110      page->focusController()->focusedOrMainFrame()->eventHandler()->logicalScrollRecursively(direction, granularity);
1111  }
1112  
scrollBy(uint32_t scrollDirection,uint32_t scrollGranularity)1113  void WebPage::scrollBy(uint32_t scrollDirection, uint32_t scrollGranularity)
1114  {
1115      scroll(m_page.get(), static_cast<ScrollDirection>(scrollDirection), static_cast<ScrollGranularity>(scrollGranularity));
1116  }
1117  
setActive(bool isActive)1118  void WebPage::setActive(bool isActive)
1119  {
1120      m_page->focusController()->setActive(isActive);
1121  
1122  #if PLATFORM(MAC)
1123      // Tell all our plug-in views that the window focus changed.
1124      for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
1125          (*it)->setWindowIsFocused(isActive);
1126  #endif
1127  }
1128  
setDrawsBackground(bool drawsBackground)1129  void WebPage::setDrawsBackground(bool drawsBackground)
1130  {
1131      if (m_drawsBackground == drawsBackground)
1132          return;
1133  
1134      m_drawsBackground = drawsBackground;
1135  
1136      for (Frame* coreFrame = m_mainFrame->coreFrame(); coreFrame; coreFrame = coreFrame->tree()->traverseNext()) {
1137          if (FrameView* view = coreFrame->view())
1138              view->setTransparent(!drawsBackground);
1139      }
1140  
1141      m_drawingArea->pageBackgroundTransparencyChanged();
1142      m_drawingArea->setNeedsDisplay(IntRect(IntPoint(0, 0), m_viewSize));
1143  }
1144  
setDrawsTransparentBackground(bool drawsTransparentBackground)1145  void WebPage::setDrawsTransparentBackground(bool drawsTransparentBackground)
1146  {
1147      if (m_drawsTransparentBackground == drawsTransparentBackground)
1148          return;
1149  
1150      m_drawsTransparentBackground = drawsTransparentBackground;
1151  
1152      Color backgroundColor = drawsTransparentBackground ? Color::transparent : Color::white;
1153      for (Frame* coreFrame = m_mainFrame->coreFrame(); coreFrame; coreFrame = coreFrame->tree()->traverseNext()) {
1154          if (FrameView* view = coreFrame->view())
1155              view->setBaseBackgroundColor(backgroundColor);
1156      }
1157  
1158      m_drawingArea->pageBackgroundTransparencyChanged();
1159      m_drawingArea->setNeedsDisplay(IntRect(IntPoint(0, 0), m_viewSize));
1160  }
1161  
viewWillStartLiveResize()1162  void WebPage::viewWillStartLiveResize()
1163  {
1164      if (!m_page)
1165          return;
1166  
1167      // FIXME: This should propagate to all ScrollableAreas.
1168      if (Frame* frame = m_page->focusController()->focusedOrMainFrame()) {
1169          if (FrameView* view = frame->view())
1170              view->willStartLiveResize();
1171      }
1172  }
1173  
viewWillEndLiveResize()1174  void WebPage::viewWillEndLiveResize()
1175  {
1176      if (!m_page)
1177          return;
1178  
1179      // FIXME: This should propagate to all ScrollableAreas.
1180      if (Frame* frame = m_page->focusController()->focusedOrMainFrame()) {
1181          if (FrameView* view = frame->view())
1182              view->willEndLiveResize();
1183      }
1184  }
1185  
setFocused(bool isFocused)1186  void WebPage::setFocused(bool isFocused)
1187  {
1188      if (!isFocused && m_page->focusController()->focusedOrMainFrame()->editor()->behavior().shouldClearSelectionWhenLosingWebPageFocus())
1189          m_page->focusController()->focusedOrMainFrame()->selection()->clear();
1190  
1191      m_page->focusController()->setFocused(isFocused);
1192  }
1193  
setInitialFocus(bool forward)1194  void WebPage::setInitialFocus(bool forward)
1195  {
1196      if (!m_page || !m_page->focusController())
1197          return;
1198  
1199      Frame* frame = m_page->focusController()->focusedOrMainFrame();
1200      frame->document()->setFocusedNode(0);
1201      m_page->focusController()->setInitialFocus(forward ? FocusDirectionForward : FocusDirectionBackward, 0);
1202  }
1203  
setWindowResizerSize(const IntSize & windowResizerSize)1204  void WebPage::setWindowResizerSize(const IntSize& windowResizerSize)
1205  {
1206      if (m_windowResizerSize == windowResizerSize)
1207          return;
1208  
1209      m_windowResizerSize = windowResizerSize;
1210  
1211      for (Frame* coreFrame = m_mainFrame->coreFrame(); coreFrame; coreFrame = coreFrame->tree()->traverseNext()) {
1212          FrameView* view = coreFrame->view();
1213          if (view)
1214              view->windowResizerRectChanged();
1215      }
1216  }
1217  
setIsInWindow(bool isInWindow)1218  void WebPage::setIsInWindow(bool isInWindow)
1219  {
1220      if (!isInWindow) {
1221          m_page->setCanStartMedia(false);
1222          m_page->willMoveOffscreen();
1223      } else {
1224          m_page->setCanStartMedia(true);
1225          m_page->didMoveOnscreen();
1226      }
1227  }
1228  
didReceivePolicyDecision(uint64_t frameID,uint64_t listenerID,uint32_t policyAction,uint64_t downloadID)1229  void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t downloadID)
1230  {
1231      WebFrame* frame = WebProcess::shared().webFrame(frameID);
1232      if (!frame)
1233          return;
1234      frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), downloadID);
1235  }
1236  
show()1237  void WebPage::show()
1238  {
1239      send(Messages::WebPageProxy::ShowPage());
1240  }
1241  
setUserAgent(const String & userAgent)1242  void WebPage::setUserAgent(const String& userAgent)
1243  {
1244      m_userAgent = userAgent;
1245  }
1246  
windowToScreen(const IntRect & rect)1247  IntRect WebPage::windowToScreen(const IntRect& rect)
1248  {
1249      IntRect screenRect;
1250      sendSync(Messages::WebPageProxy::WindowToScreen(rect), Messages::WebPageProxy::WindowToScreen::Reply(screenRect));
1251      return screenRect;
1252  }
1253  
windowResizerRect() const1254  IntRect WebPage::windowResizerRect() const
1255  {
1256      if (m_windowResizerSize.isEmpty())
1257          return IntRect();
1258  
1259      IntSize frameViewSize;
1260      if (Frame* coreFrame = m_mainFrame->coreFrame()) {
1261          if (FrameView* view = coreFrame->view())
1262              frameViewSize = view->size();
1263      }
1264  
1265      return IntRect(frameViewSize.width() - m_windowResizerSize.width(), frameViewSize.height() - m_windowResizerSize.height(),
1266                     m_windowResizerSize.width(), m_windowResizerSize.height());
1267  }
1268  
keyboardUIMode()1269  KeyboardUIMode WebPage::keyboardUIMode()
1270  {
1271      bool fullKeyboardAccessEnabled = WebProcess::shared().fullKeyboardAccessEnabled();
1272      return static_cast<KeyboardUIMode>((fullKeyboardAccessEnabled ? KeyboardAccessFull : KeyboardAccessDefault) | (m_tabToLinks ? KeyboardAccessTabsToLinks : 0));
1273  }
1274  
runJavaScriptInMainFrame(const String & script,uint64_t callbackID)1275  void WebPage::runJavaScriptInMainFrame(const String& script, uint64_t callbackID)
1276  {
1277      // NOTE: We need to be careful when running scripts that the objects we depend on don't
1278      // disappear during script execution.
1279  
1280      // Retain the SerializedScriptValue at this level so it (and the internal data) lives
1281      // long enough for the DataReference to be encoded by the sent message.
1282      RefPtr<SerializedScriptValue> serializedResultValue;
1283      CoreIPC::DataReference dataReference;
1284  
1285      JSLock lock(SilenceAssertionsOnly);
1286      if (JSValue resultValue = m_mainFrame->coreFrame()->script()->executeScript(script, true).jsValue()) {
1287          if ((serializedResultValue = SerializedScriptValue::create(m_mainFrame->jsContext(),
1288              toRef(m_mainFrame->coreFrame()->script()->globalObject(mainThreadNormalWorld())->globalExec(), resultValue), 0)))
1289              dataReference = CoreIPC::DataReference(serializedResultValue->data().data(), serializedResultValue->data().size());
1290      }
1291  
1292      send(Messages::WebPageProxy::ScriptValueCallback(dataReference, callbackID));
1293  }
1294  
getContentsAsString(uint64_t callbackID)1295  void WebPage::getContentsAsString(uint64_t callbackID)
1296  {
1297      String resultString = m_mainFrame->contentsAsString();
1298      send(Messages::WebPageProxy::StringCallback(resultString, callbackID));
1299  }
1300  
getRenderTreeExternalRepresentation(uint64_t callbackID)1301  void WebPage::getRenderTreeExternalRepresentation(uint64_t callbackID)
1302  {
1303      String resultString = renderTreeExternalRepresentation();
1304      send(Messages::WebPageProxy::StringCallback(resultString, callbackID));
1305  }
1306  
getSelectionOrContentsAsString(uint64_t callbackID)1307  void WebPage::getSelectionOrContentsAsString(uint64_t callbackID)
1308  {
1309      String resultString = m_mainFrame->selectionAsString();
1310      if (resultString.isEmpty())
1311          resultString = m_mainFrame->contentsAsString();
1312      send(Messages::WebPageProxy::StringCallback(resultString, callbackID));
1313  }
1314  
getSourceForFrame(uint64_t frameID,uint64_t callbackID)1315  void WebPage::getSourceForFrame(uint64_t frameID, uint64_t callbackID)
1316  {
1317      String resultString;
1318      if (WebFrame* frame = WebProcess::shared().webFrame(frameID))
1319         resultString = frame->source();
1320  
1321      send(Messages::WebPageProxy::StringCallback(resultString, callbackID));
1322  }
1323  
getMainResourceDataOfFrame(uint64_t frameID,uint64_t callbackID)1324  void WebPage::getMainResourceDataOfFrame(uint64_t frameID, uint64_t callbackID)
1325  {
1326      CoreIPC::DataReference dataReference;
1327  
1328      RefPtr<SharedBuffer> buffer;
1329      if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
1330          if (DocumentLoader* loader = frame->coreFrame()->loader()->documentLoader()) {
1331              if ((buffer = loader->mainResourceData()))
1332                  dataReference = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
1333          }
1334      }
1335  
1336      send(Messages::WebPageProxy::DataCallback(dataReference, callbackID));
1337  }
1338  
getResourceDataFromFrame(uint64_t frameID,const String & resourceURL,uint64_t callbackID)1339  void WebPage::getResourceDataFromFrame(uint64_t frameID, const String& resourceURL, uint64_t callbackID)
1340  {
1341      CoreIPC::DataReference dataReference;
1342  
1343      RefPtr<SharedBuffer> buffer;
1344      if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
1345          if (DocumentLoader* loader = frame->coreFrame()->loader()->documentLoader()) {
1346              if (RefPtr<ArchiveResource> subresource = loader->subresource(KURL(KURL(), resourceURL))) {
1347                  if ((buffer = subresource->data()))
1348                      dataReference = CoreIPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
1349              }
1350          }
1351      }
1352  
1353      send(Messages::WebPageProxy::DataCallback(dataReference, callbackID));
1354  }
1355  
getWebArchiveOfFrame(uint64_t frameID,uint64_t callbackID)1356  void WebPage::getWebArchiveOfFrame(uint64_t frameID, uint64_t callbackID)
1357  {
1358      CoreIPC::DataReference dataReference;
1359  
1360  #if PLATFORM(MAC) || PLATFORM(WIN)
1361      RetainPtr<CFDataRef> data;
1362      if (WebFrame* frame = WebProcess::shared().webFrame(frameID)) {
1363          if (RefPtr<LegacyWebArchive> archive = LegacyWebArchive::create(frame->coreFrame()->document())) {
1364              if ((data = archive->rawDataRepresentation()))
1365                  dataReference = CoreIPC::DataReference(CFDataGetBytePtr(data.get()), CFDataGetLength(data.get()));
1366          }
1367      }
1368  #endif
1369  
1370      send(Messages::WebPageProxy::DataCallback(dataReference, callbackID));
1371  }
1372  
forceRepaintWithoutCallback()1373  void WebPage::forceRepaintWithoutCallback()
1374  {
1375      m_drawingArea->forceRepaint();
1376  }
1377  
forceRepaint(uint64_t callbackID)1378  void WebPage::forceRepaint(uint64_t callbackID)
1379  {
1380      forceRepaintWithoutCallback();
1381      send(Messages::WebPageProxy::VoidCallback(callbackID));
1382  }
1383  
preferencesDidChange(const WebPreferencesStore & store)1384  void WebPage::preferencesDidChange(const WebPreferencesStore& store)
1385  {
1386      WebPreferencesStore::removeTestRunnerOverrides();
1387      updatePreferences(store);
1388  }
1389  
updatePreferences(const WebPreferencesStore & store)1390  void WebPage::updatePreferences(const WebPreferencesStore& store)
1391  {
1392      Settings* settings = m_page->settings();
1393  
1394      m_tabToLinks = store.getBoolValueForKey(WebPreferencesKey::tabsToLinksKey());
1395  
1396      // FIXME: This should be generated from macro expansion for all preferences,
1397      // but we currently don't match the naming of WebCore exactly so we are
1398      // handrolling the boolean and integer preferences until that is fixed.
1399  
1400  #define INITIALIZE_SETTINGS(KeyUpper, KeyLower, TypeName, Type, DefaultValue) settings->set##KeyUpper(store.get##TypeName##ValueForKey(WebPreferencesKey::KeyLower##Key()));
1401  
1402      FOR_EACH_WEBKIT_STRING_PREFERENCE(INITIALIZE_SETTINGS)
1403  
1404  #undef INITIALIZE_SETTINGS
1405  
1406      settings->setJavaScriptEnabled(store.getBoolValueForKey(WebPreferencesKey::javaScriptEnabledKey()));
1407      settings->setLoadsImagesAutomatically(store.getBoolValueForKey(WebPreferencesKey::loadsImagesAutomaticallyKey()));
1408      settings->setLoadsSiteIconsIgnoringImageLoadingSetting(store.getBoolValueForKey(WebPreferencesKey::loadsSiteIconsIgnoringImageLoadingPreferenceKey()));
1409      settings->setPluginsEnabled(store.getBoolValueForKey(WebPreferencesKey::pluginsEnabledKey()));
1410      settings->setJavaEnabled(store.getBoolValueForKey(WebPreferencesKey::javaEnabledKey()));
1411      settings->setOfflineWebApplicationCacheEnabled(store.getBoolValueForKey(WebPreferencesKey::offlineWebApplicationCacheEnabledKey()));
1412      settings->setLocalStorageEnabled(store.getBoolValueForKey(WebPreferencesKey::localStorageEnabledKey()));
1413      settings->setXSSAuditorEnabled(store.getBoolValueForKey(WebPreferencesKey::xssAuditorEnabledKey()));
1414      settings->setFrameFlatteningEnabled(store.getBoolValueForKey(WebPreferencesKey::frameFlatteningEnabledKey()));
1415      settings->setPrivateBrowsingEnabled(store.getBoolValueForKey(WebPreferencesKey::privateBrowsingEnabledKey()));
1416      settings->setDeveloperExtrasEnabled(store.getBoolValueForKey(WebPreferencesKey::developerExtrasEnabledKey()));
1417      settings->setTextAreasAreResizable(store.getBoolValueForKey(WebPreferencesKey::textAreasAreResizableKey()));
1418      settings->setNeedsSiteSpecificQuirks(store.getBoolValueForKey(WebPreferencesKey::needsSiteSpecificQuirksKey()));
1419      settings->setJavaScriptCanOpenWindowsAutomatically(store.getBoolValueForKey(WebPreferencesKey::javaScriptCanOpenWindowsAutomaticallyKey()));
1420      settings->setForceFTPDirectoryListings(store.getBoolValueForKey(WebPreferencesKey::forceFTPDirectoryListingsKey()));
1421      settings->setDNSPrefetchingEnabled(store.getBoolValueForKey(WebPreferencesKey::dnsPrefetchingEnabledKey()));
1422  #if ENABLE(WEB_ARCHIVE)
1423      settings->setWebArchiveDebugModeEnabled(store.getBoolValueForKey(WebPreferencesKey::webArchiveDebugModeEnabledKey()));
1424  #endif
1425      settings->setLocalFileContentSniffingEnabled(store.getBoolValueForKey(WebPreferencesKey::localFileContentSniffingEnabledKey()));
1426      settings->setUsesPageCache(store.getBoolValueForKey(WebPreferencesKey::usesPageCacheKey()));
1427      settings->setAuthorAndUserStylesEnabled(store.getBoolValueForKey(WebPreferencesKey::authorAndUserStylesEnabledKey()));
1428      settings->setPaginateDuringLayoutEnabled(store.getBoolValueForKey(WebPreferencesKey::paginateDuringLayoutEnabledKey()));
1429      settings->setDOMPasteAllowed(store.getBoolValueForKey(WebPreferencesKey::domPasteAllowedKey()));
1430      settings->setJavaScriptCanAccessClipboard(store.getBoolValueForKey(WebPreferencesKey::javaScriptCanAccessClipboardKey()));
1431      settings->setShouldPrintBackgrounds(store.getBoolValueForKey(WebPreferencesKey::shouldPrintBackgroundsKey()));
1432      settings->setWebSecurityEnabled(store.getBoolValueForKey(WebPreferencesKey::webSecurityEnabledKey()));
1433      settings->setAllowUniversalAccessFromFileURLs(store.getBoolValueForKey(WebPreferencesKey::allowUniversalAccessFromFileURLsKey()));
1434      settings->setAllowFileAccessFromFileURLs(store.getBoolValueForKey(WebPreferencesKey::allowFileAccessFromFileURLsKey()));
1435  
1436      settings->setMinimumFontSize(store.getUInt32ValueForKey(WebPreferencesKey::minimumFontSizeKey()));
1437      settings->setMinimumLogicalFontSize(store.getUInt32ValueForKey(WebPreferencesKey::minimumLogicalFontSizeKey()));
1438      settings->setDefaultFontSize(store.getUInt32ValueForKey(WebPreferencesKey::defaultFontSizeKey()));
1439      settings->setDefaultFixedFontSize(store.getUInt32ValueForKey(WebPreferencesKey::defaultFixedFontSizeKey()));
1440      settings->setEditableLinkBehavior(static_cast<WebCore::EditableLinkBehavior>(store.getUInt32ValueForKey(WebPreferencesKey::editableLinkBehaviorKey())));
1441  
1442      settings->setAcceleratedCompositingEnabled(store.getBoolValueForKey(WebPreferencesKey::acceleratedCompositingEnabledKey()) && LayerTreeHost::supportsAcceleratedCompositing());
1443      settings->setAcceleratedDrawingEnabled(store.getBoolValueForKey(WebPreferencesKey::acceleratedDrawingEnabledKey()) && LayerTreeHost::supportsAcceleratedCompositing());
1444      settings->setCanvasUsesAcceleratedDrawing(store.getBoolValueForKey(WebPreferencesKey::canvasUsesAcceleratedDrawingKey()) && LayerTreeHost::supportsAcceleratedCompositing());
1445      settings->setShowDebugBorders(store.getBoolValueForKey(WebPreferencesKey::compositingBordersVisibleKey()));
1446      settings->setShowRepaintCounter(store.getBoolValueForKey(WebPreferencesKey::compositingRepaintCountersVisibleKey()));
1447      settings->setWebGLEnabled(store.getBoolValueForKey(WebPreferencesKey::webGLEnabledKey()));
1448  
1449  #if ENABLE(DATABASE)
1450      AbstractDatabase::setIsAvailable(store.getBoolValueForKey(WebPreferencesKey::databasesEnabledKey()));
1451  #endif
1452  
1453  #if ENABLE(FULLSCREEN_API)
1454      settings->setFullScreenEnabled(store.getBoolValueForKey(WebPreferencesKey::fullScreenEnabledKey()));
1455  #endif
1456  
1457  #if ENABLE(DOM_STORAGE)
1458      settings->setLocalStorageDatabasePath(WebProcess::shared().localStorageDirectory());
1459  #endif
1460  
1461      platformPreferencesDidChange(store);
1462  }
1463  
1464  #if ENABLE(INSPECTOR)
inspector()1465  WebInspector* WebPage::inspector()
1466  {
1467      if (m_isClosed)
1468          return 0;
1469      if (!m_inspector)
1470          m_inspector = WebInspector::create(this);
1471      return m_inspector.get();
1472  }
1473  #endif
1474  
1475  #if ENABLE(FULLSCREEN_API)
fullScreenManager()1476  WebFullScreenManager* WebPage::fullScreenManager()
1477  {
1478      if (!m_fullScreenManager)
1479          m_fullScreenManager = WebFullScreenManager::create(this);
1480      return m_fullScreenManager.get();
1481  }
1482  #endif
1483  
1484  #if !PLATFORM(GTK) && !PLATFORM(MAC)
handleEditingKeyboardEvent(KeyboardEvent * evt)1485  bool WebPage::handleEditingKeyboardEvent(KeyboardEvent* evt)
1486  {
1487      Node* node = evt->target()->toNode();
1488      ASSERT(node);
1489      Frame* frame = node->document()->frame();
1490      ASSERT(frame);
1491  
1492      const PlatformKeyboardEvent* keyEvent = evt->keyEvent();
1493      if (!keyEvent)
1494          return false;
1495  
1496      Editor::Command command = frame->editor()->command(interpretKeyEvent(evt));
1497  
1498      if (keyEvent->type() == PlatformKeyboardEvent::RawKeyDown) {
1499          // WebKit doesn't have enough information about mode to decide how commands that just insert text if executed via Editor should be treated,
1500          // so we leave it upon WebCore to either handle them immediately (e.g. Tab that changes focus) or let a keypress event be generated
1501          // (e.g. Tab that inserts a Tab character, or Enter).
1502          return !command.isTextInsertion() && command.execute(evt);
1503      }
1504  
1505      if (command.execute(evt))
1506          return true;
1507  
1508      // Don't insert null or control characters as they can result in unexpected behaviour
1509      if (evt->charCode() < ' ')
1510          return false;
1511  
1512      return frame->editor()->insertText(evt->keyEvent()->text(), evt);
1513  }
1514  #endif
1515  
1516  #if PLATFORM(WIN)
performDragControllerAction(uint64_t action,WebCore::IntPoint clientPosition,WebCore::IntPoint globalPosition,uint64_t draggingSourceOperationMask,const WebCore::DragDataMap & dataMap,uint32_t flags)1517  void WebPage::performDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, const WebCore::DragDataMap& dataMap, uint32_t flags)
1518  {
1519      if (!m_page) {
1520          send(Messages::WebPageProxy::DidPerformDragControllerAction(DragOperationNone));
1521          return;
1522      }
1523  
1524      DragData dragData(dataMap, clientPosition, globalPosition, static_cast<DragOperation>(draggingSourceOperationMask), static_cast<DragApplicationFlags>(flags));
1525      switch (action) {
1526      case DragControllerActionEntered:
1527          send(Messages::WebPageProxy::DidPerformDragControllerAction(m_page->dragController()->dragEntered(&dragData)));
1528          break;
1529  
1530      case DragControllerActionUpdated:
1531          send(Messages::WebPageProxy::DidPerformDragControllerAction(m_page->dragController()->dragUpdated(&dragData)));
1532          break;
1533  
1534      case DragControllerActionExited:
1535          m_page->dragController()->dragExited(&dragData);
1536          break;
1537  
1538      case DragControllerActionPerformDrag:
1539          m_page->dragController()->performDrag(&dragData);
1540          break;
1541  
1542      default:
1543          ASSERT_NOT_REACHED();
1544      }
1545  }
1546  #else
performDragControllerAction(uint64_t action,WebCore::IntPoint clientPosition,WebCore::IntPoint globalPosition,uint64_t draggingSourceOperationMask,const String & dragStorageName,uint32_t flags,const SandboxExtension::Handle & sandboxExtensionHandle)1547  void WebPage::performDragControllerAction(uint64_t action, WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t draggingSourceOperationMask, const String& dragStorageName, uint32_t flags, const SandboxExtension::Handle& sandboxExtensionHandle)
1548  {
1549      if (!m_page) {
1550          send(Messages::WebPageProxy::DidPerformDragControllerAction(DragOperationNone));
1551          return;
1552      }
1553  
1554      DragData dragData(dragStorageName, clientPosition, globalPosition, static_cast<DragOperation>(draggingSourceOperationMask), static_cast<DragApplicationFlags>(flags));
1555      switch (action) {
1556      case DragControllerActionEntered:
1557          send(Messages::WebPageProxy::DidPerformDragControllerAction(m_page->dragController()->dragEntered(&dragData)));
1558          break;
1559  
1560      case DragControllerActionUpdated:
1561          send(Messages::WebPageProxy::DidPerformDragControllerAction(m_page->dragController()->dragUpdated(&dragData)));
1562          break;
1563  
1564      case DragControllerActionExited:
1565          m_page->dragController()->dragExited(&dragData);
1566          break;
1567  
1568      case DragControllerActionPerformDrag: {
1569          ASSERT(!m_pendingDropSandboxExtension);
1570  
1571          m_pendingDropSandboxExtension = SandboxExtension::create(sandboxExtensionHandle);
1572  
1573          m_page->dragController()->performDrag(&dragData);
1574  
1575          // If we started loading a local file, the sandbox extension tracker would have adopted this
1576          // pending drop sandbox extension. If not, we'll play it safe and invalidate it.
1577          if (m_pendingDropSandboxExtension) {
1578              m_pendingDropSandboxExtension->invalidate();
1579              m_pendingDropSandboxExtension = nullptr;
1580          }
1581  
1582          break;
1583      }
1584  
1585      default:
1586          ASSERT_NOT_REACHED();
1587      }
1588  }
1589  #endif
1590  
dragEnded(WebCore::IntPoint clientPosition,WebCore::IntPoint globalPosition,uint64_t operation)1591  void WebPage::dragEnded(WebCore::IntPoint clientPosition, WebCore::IntPoint globalPosition, uint64_t operation)
1592  {
1593      IntPoint adjustedClientPosition(clientPosition.x() + m_page->dragController()->dragOffset().x(), clientPosition.y() + m_page->dragController()->dragOffset().y());
1594      IntPoint adjustedGlobalPosition(globalPosition.x() + m_page->dragController()->dragOffset().x(), globalPosition.y() + m_page->dragController()->dragOffset().y());
1595  
1596      platformDragEnded();
1597      m_page->dragController()->dragEnded();
1598      FrameView* view = m_page->mainFrame()->view();
1599      if (!view)
1600          return;
1601      // FIXME: These are fake modifier keys here, but they should be real ones instead.
1602      PlatformMouseEvent event(adjustedClientPosition, adjustedGlobalPosition, LeftButton, MouseEventMoved, 0, false, false, false, false, currentTime());
1603      m_page->mainFrame()->eventHandler()->dragSourceEndedAt(event, (DragOperation)operation);
1604  }
1605  
willPerformLoadDragDestinationAction()1606  void WebPage::willPerformLoadDragDestinationAction()
1607  {
1608      m_sandboxExtensionTracker.willPerformLoadDragDestinationAction(m_pendingDropSandboxExtension.release());
1609  }
1610  
webEditCommand(uint64_t commandID)1611  WebEditCommand* WebPage::webEditCommand(uint64_t commandID)
1612  {
1613      return m_editCommandMap.get(commandID).get();
1614  }
1615  
addWebEditCommand(uint64_t commandID,WebEditCommand * command)1616  void WebPage::addWebEditCommand(uint64_t commandID, WebEditCommand* command)
1617  {
1618      m_editCommandMap.set(commandID, command);
1619  }
1620  
removeWebEditCommand(uint64_t commandID)1621  void WebPage::removeWebEditCommand(uint64_t commandID)
1622  {
1623      m_editCommandMap.remove(commandID);
1624  }
1625  
unapplyEditCommand(uint64_t commandID)1626  void WebPage::unapplyEditCommand(uint64_t commandID)
1627  {
1628      WebEditCommand* command = webEditCommand(commandID);
1629      if (!command)
1630          return;
1631  
1632      command->command()->unapply();
1633  }
1634  
reapplyEditCommand(uint64_t commandID)1635  void WebPage::reapplyEditCommand(uint64_t commandID)
1636  {
1637      WebEditCommand* command = webEditCommand(commandID);
1638      if (!command)
1639          return;
1640  
1641      m_isInRedo = true;
1642      command->command()->reapply();
1643      m_isInRedo = false;
1644  }
1645  
didRemoveEditCommand(uint64_t commandID)1646  void WebPage::didRemoveEditCommand(uint64_t commandID)
1647  {
1648      removeWebEditCommand(commandID);
1649  }
1650  
setActivePopupMenu(WebPopupMenu * menu)1651  void WebPage::setActivePopupMenu(WebPopupMenu* menu)
1652  {
1653      m_activePopupMenu = menu;
1654  }
1655  
setActiveOpenPanelResultListener(PassRefPtr<WebOpenPanelResultListener> openPanelResultListener)1656  void WebPage::setActiveOpenPanelResultListener(PassRefPtr<WebOpenPanelResultListener> openPanelResultListener)
1657  {
1658      m_activeOpenPanelResultListener = openPanelResultListener;
1659  }
1660  
findStringFromInjectedBundle(const String & target,FindOptions options)1661  bool WebPage::findStringFromInjectedBundle(const String& target, FindOptions options)
1662  {
1663      return m_page->findString(target, options);
1664  }
1665  
findString(const String & string,uint32_t options,uint32_t maxMatchCount)1666  void WebPage::findString(const String& string, uint32_t options, uint32_t maxMatchCount)
1667  {
1668      m_findController.findString(string, static_cast<FindOptions>(options), maxMatchCount);
1669  }
1670  
hideFindUI()1671  void WebPage::hideFindUI()
1672  {
1673      m_findController.hideFindUI();
1674  }
1675  
countStringMatches(const String & string,uint32_t options,uint32_t maxMatchCount)1676  void WebPage::countStringMatches(const String& string, uint32_t options, uint32_t maxMatchCount)
1677  {
1678      m_findController.countStringMatches(string, static_cast<FindOptions>(options), maxMatchCount);
1679  }
1680  
didChangeSelectedIndexForActivePopupMenu(int32_t newIndex)1681  void WebPage::didChangeSelectedIndexForActivePopupMenu(int32_t newIndex)
1682  {
1683      if (!m_activePopupMenu)
1684          return;
1685  
1686      m_activePopupMenu->didChangeSelectedIndex(newIndex);
1687      m_activePopupMenu = 0;
1688  }
1689  
didChooseFilesForOpenPanel(const Vector<String> & files)1690  void WebPage::didChooseFilesForOpenPanel(const Vector<String>& files)
1691  {
1692      if (!m_activeOpenPanelResultListener)
1693          return;
1694  
1695      m_activeOpenPanelResultListener->didChooseFiles(files);
1696      m_activeOpenPanelResultListener = 0;
1697  }
1698  
didCancelForOpenPanel()1699  void WebPage::didCancelForOpenPanel()
1700  {
1701      m_activeOpenPanelResultListener = 0;
1702  }
1703  
1704  #if ENABLE(WEB_PROCESS_SANDBOX)
extendSandboxForFileFromOpenPanel(const SandboxExtension::Handle & handle)1705  void WebPage::extendSandboxForFileFromOpenPanel(const SandboxExtension::Handle& handle)
1706  {
1707      SandboxExtension::create(handle)->consumePermanently();
1708  }
1709  #endif
1710  
didReceiveGeolocationPermissionDecision(uint64_t geolocationID,bool allowed)1711  void WebPage::didReceiveGeolocationPermissionDecision(uint64_t geolocationID, bool allowed)
1712  {
1713      m_geolocationPermissionRequestManager.didReceiveGeolocationPermissionDecision(geolocationID, allowed);
1714  }
1715  
advanceToNextMisspelling(bool startBeforeSelection)1716  void WebPage::advanceToNextMisspelling(bool startBeforeSelection)
1717  {
1718      Frame* frame = m_page->focusController()->focusedOrMainFrame();
1719      frame->editor()->advanceToNextMisspelling(startBeforeSelection);
1720  }
1721  
changeSpellingToWord(const String & word)1722  void WebPage::changeSpellingToWord(const String& word)
1723  {
1724      replaceSelectionWithText(m_page->focusController()->focusedOrMainFrame(), word);
1725  }
1726  
unmarkAllMisspellings()1727  void WebPage::unmarkAllMisspellings()
1728  {
1729      for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
1730          if (Document* document = frame->document())
1731              document->markers()->removeMarkers(DocumentMarker::Spelling);
1732      }
1733  }
1734  
unmarkAllBadGrammar()1735  void WebPage::unmarkAllBadGrammar()
1736  {
1737      for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
1738          if (Document* document = frame->document())
1739              document->markers()->removeMarkers(DocumentMarker::Grammar);
1740      }
1741  }
1742  
1743  #if PLATFORM(MAC)
uppercaseWord()1744  void WebPage::uppercaseWord()
1745  {
1746      m_page->focusController()->focusedOrMainFrame()->editor()->uppercaseWord();
1747  }
1748  
lowercaseWord()1749  void WebPage::lowercaseWord()
1750  {
1751      m_page->focusController()->focusedOrMainFrame()->editor()->lowercaseWord();
1752  }
1753  
capitalizeWord()1754  void WebPage::capitalizeWord()
1755  {
1756      m_page->focusController()->focusedOrMainFrame()->editor()->capitalizeWord();
1757  }
1758  #endif
1759  
setTextForActivePopupMenu(int32_t index)1760  void WebPage::setTextForActivePopupMenu(int32_t index)
1761  {
1762      if (!m_activePopupMenu)
1763          return;
1764  
1765      m_activePopupMenu->setTextForIndex(index);
1766  }
1767  
didSelectItemFromActiveContextMenu(const WebContextMenuItemData & item)1768  void WebPage::didSelectItemFromActiveContextMenu(const WebContextMenuItemData& item)
1769  {
1770      ASSERT(m_contextMenu);
1771      m_contextMenu->itemSelected(item);
1772      m_contextMenu = 0;
1773  }
1774  
replaceSelectionWithText(Frame * frame,const String & text)1775  void WebPage::replaceSelectionWithText(Frame* frame, const String& text)
1776  {
1777      if (frame->selection()->isNone())
1778          return;
1779  
1780      RefPtr<DocumentFragment> textFragment = createFragmentFromText(frame->selection()->toNormalizedRange().get(), text);
1781      applyCommand(ReplaceSelectionCommand::create(frame->document(), textFragment.release(), ReplaceSelectionCommand::SelectReplacement | ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting));
1782      frame->selection()->revealSelection(ScrollAlignment::alignToEdgeIfNeeded);
1783  }
1784  
mainFrameHasCustomRepresentation() const1785  bool WebPage::mainFrameHasCustomRepresentation() const
1786  {
1787      return static_cast<WebFrameLoaderClient*>(mainFrame()->coreFrame()->loader()->client())->frameHasCustomRepresentation();
1788  }
1789  
didChangeScrollOffsetForMainFrame()1790  void WebPage::didChangeScrollOffsetForMainFrame()
1791  {
1792      Frame* frame = m_page->mainFrame();
1793      IntPoint scrollPosition = frame->view()->scrollPosition();
1794      IntPoint maximumScrollPosition = frame->view()->maximumScrollPosition();
1795      IntPoint minimumScrollPosition = frame->view()->minimumScrollPosition();
1796  
1797      bool isPinnedToLeftSide = (scrollPosition.x() <= minimumScrollPosition.x());
1798      bool isPinnedToRightSide = (scrollPosition.x() >= maximumScrollPosition.x());
1799  
1800      if (isPinnedToLeftSide != m_cachedMainFrameIsPinnedToLeftSide || isPinnedToRightSide != m_cachedMainFrameIsPinnedToRightSide) {
1801          send(Messages::WebPageProxy::DidChangeScrollOffsetPinningForMainFrame(isPinnedToLeftSide, isPinnedToRightSide));
1802  
1803          m_cachedMainFrameIsPinnedToLeftSide = isPinnedToLeftSide;
1804          m_cachedMainFrameIsPinnedToRightSide = isPinnedToRightSide;
1805      }
1806  }
1807  
1808  #if PLATFORM(MAC)
1809  
addPluginView(PluginView * pluginView)1810  void WebPage::addPluginView(PluginView* pluginView)
1811  {
1812      ASSERT(!m_pluginViews.contains(pluginView));
1813  
1814      m_pluginViews.add(pluginView);
1815  }
1816  
removePluginView(PluginView * pluginView)1817  void WebPage::removePluginView(PluginView* pluginView)
1818  {
1819      ASSERT(m_pluginViews.contains(pluginView));
1820  
1821      m_pluginViews.remove(pluginView);
1822  }
1823  
setWindowIsVisible(bool windowIsVisible)1824  void WebPage::setWindowIsVisible(bool windowIsVisible)
1825  {
1826      m_windowIsVisible = windowIsVisible;
1827  
1828      // Tell all our plug-in views that the window visibility changed.
1829      for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
1830          (*it)->setWindowIsVisible(windowIsVisible);
1831  }
1832  
windowAndViewFramesChanged(const WebCore::IntRect & windowFrameInScreenCoordinates,const WebCore::IntRect & viewFrameInWindowCoordinates,const WebCore::IntPoint & accessibilityViewCoordinates)1833  void WebPage::windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates, const WebCore::IntPoint& accessibilityViewCoordinates)
1834  {
1835      m_windowFrameInScreenCoordinates = windowFrameInScreenCoordinates;
1836      m_viewFrameInWindowCoordinates = viewFrameInWindowCoordinates;
1837      m_accessibilityPosition = accessibilityViewCoordinates;
1838  
1839      // Tell all our plug-in views that the window and view frames have changed.
1840      for (HashSet<PluginView*>::const_iterator it = m_pluginViews.begin(), end = m_pluginViews.end(); it != end; ++it)
1841          (*it)->windowAndViewFramesChanged(windowFrameInScreenCoordinates, viewFrameInWindowCoordinates);
1842  }
1843  
1844  #endif
1845  
windowIsFocused() const1846  bool WebPage::windowIsFocused() const
1847  {
1848      return m_page->focusController()->isActive();
1849  }
1850  
didReceiveMessage(CoreIPC::Connection * connection,CoreIPC::MessageID messageID,CoreIPC::ArgumentDecoder * arguments)1851  void WebPage::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
1852  {
1853      if (messageID.is<CoreIPC::MessageClassDrawingAreaLegacy>()) {
1854          if (m_drawingArea)
1855              m_drawingArea->didReceiveMessage(connection, messageID, arguments);
1856          return;
1857      }
1858  
1859  #if PLATFORM(MAC) || PLATFORM(WIN)
1860      if (messageID.is<CoreIPC::MessageClassDrawingArea>()) {
1861          if (m_drawingArea)
1862              m_drawingArea->didReceiveDrawingAreaMessage(connection, messageID, arguments);
1863          return;
1864      }
1865  #endif
1866  
1867  #if ENABLE(INSPECTOR)
1868      if (messageID.is<CoreIPC::MessageClassWebInspector>()) {
1869          if (WebInspector* inspector = this->inspector())
1870              inspector->didReceiveWebInspectorMessage(connection, messageID, arguments);
1871          return;
1872      }
1873  #endif
1874  
1875  #if ENABLE(FULLSCREEN_API)
1876      if (messageID.is<CoreIPC::MessageClassWebFullScreenManager>()) {
1877          fullScreenManager()->didReceiveMessage(connection, messageID, arguments);
1878          return;
1879      }
1880  #endif
1881  
1882      didReceiveWebPageMessage(connection, messageID, arguments);
1883  }
1884  
didReceiveSyncMessage(CoreIPC::Connection * connection,CoreIPC::MessageID messageID,CoreIPC::ArgumentDecoder * arguments,CoreIPC::ArgumentEncoder * reply)1885  CoreIPC::SyncReplyMode WebPage::didReceiveSyncMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments, CoreIPC::ArgumentEncoder* reply)
1886  {
1887      return didReceiveSyncWebPageMessage(connection, messageID, arguments, reply);
1888  }
1889  
backForwardList()1890  InjectedBundleBackForwardList* WebPage::backForwardList()
1891  {
1892      if (!m_backForwardList)
1893          m_backForwardList = InjectedBundleBackForwardList::create(this);
1894      return m_backForwardList.get();
1895  }
1896  
1897  #if PLATFORM(QT)
findZoomableAreaForPoint(const WebCore::IntPoint & point)1898  void WebPage::findZoomableAreaForPoint(const WebCore::IntPoint& point)
1899  {
1900      const int minimumZoomTargetWidth = 100;
1901  
1902      Frame* mainframe = m_mainFrame->coreFrame();
1903      HitTestResult result = mainframe->eventHandler()->hitTestResultAtPoint(mainframe->view()->windowToContents(point), /*allowShadowContent*/ false, /*ignoreClipping*/ true);
1904  
1905      Node* node = result.innerNode();
1906      while (node && node->getRect().width() < minimumZoomTargetWidth)
1907          node = node->parentNode();
1908  
1909      IntRect zoomableArea;
1910      if (node)
1911          zoomableArea = node->getRect();
1912      send(Messages::WebPageProxy::DidFindZoomableArea(zoomableArea));
1913  }
1914  #endif
1915  
~SandboxExtensionTracker()1916  WebPage::SandboxExtensionTracker::~SandboxExtensionTracker()
1917  {
1918      invalidate();
1919  }
1920  
invalidate()1921  void WebPage::SandboxExtensionTracker::invalidate()
1922  {
1923      if (m_pendingProvisionalSandboxExtension) {
1924          m_pendingProvisionalSandboxExtension->invalidate();
1925          m_pendingProvisionalSandboxExtension = 0;
1926      }
1927  
1928      if (m_provisionalSandboxExtension) {
1929          m_provisionalSandboxExtension->invalidate();
1930          m_provisionalSandboxExtension = 0;
1931      }
1932  
1933      if (m_committedSandboxExtension) {
1934          m_committedSandboxExtension->invalidate();
1935          m_committedSandboxExtension = 0;
1936      }
1937  }
1938  
willPerformLoadDragDestinationAction(PassRefPtr<SandboxExtension> pendingDropSandboxExtension)1939  void WebPage::SandboxExtensionTracker::willPerformLoadDragDestinationAction(PassRefPtr<SandboxExtension> pendingDropSandboxExtension)
1940  {
1941      setPendingProvisionalSandboxExtension(pendingDropSandboxExtension);
1942  }
1943  
beginLoad(WebFrame * frame,const SandboxExtension::Handle & handle)1944  void WebPage::SandboxExtensionTracker::beginLoad(WebFrame* frame, const SandboxExtension::Handle& handle)
1945  {
1946      ASSERT(frame->isMainFrame());
1947  
1948      setPendingProvisionalSandboxExtension(SandboxExtension::create(handle));
1949  }
1950  
setPendingProvisionalSandboxExtension(PassRefPtr<SandboxExtension> pendingProvisionalSandboxExtension)1951  void WebPage::SandboxExtensionTracker::setPendingProvisionalSandboxExtension(PassRefPtr<SandboxExtension> pendingProvisionalSandboxExtension)
1952  {
1953      // If we get two beginLoad calls in succession, without a provisional load starting, then
1954      // m_pendingProvisionalSandboxExtension will be non-null. Invalidate and null out the extension if that is the case.
1955      if (m_pendingProvisionalSandboxExtension) {
1956          m_pendingProvisionalSandboxExtension->invalidate();
1957          m_pendingProvisionalSandboxExtension = nullptr;
1958      }
1959  
1960      m_pendingProvisionalSandboxExtension = pendingProvisionalSandboxExtension;
1961  }
1962  
shouldReuseCommittedSandboxExtension(WebFrame * frame)1963  static bool shouldReuseCommittedSandboxExtension(WebFrame* frame)
1964  {
1965      ASSERT(frame->isMainFrame());
1966  
1967      FrameLoader* frameLoader = frame->coreFrame()->loader();
1968      FrameLoadType frameLoadType = frameLoader->loadType();
1969  
1970      // If the page is being reloaded, it should reuse whatever extension is committed.
1971      if (frameLoadType == FrameLoadTypeReload || frameLoadType == FrameLoadTypeReloadFromOrigin)
1972          return true;
1973  
1974      DocumentLoader* documentLoader = frameLoader->documentLoader();
1975      DocumentLoader* provisionalDocumentLoader = frameLoader->provisionalDocumentLoader();
1976      if (!documentLoader || !provisionalDocumentLoader)
1977          return false;
1978  
1979      if (documentLoader->url().isLocalFile() && provisionalDocumentLoader->url().isLocalFile())
1980          return true;
1981  
1982      return false;
1983  }
1984  
didStartProvisionalLoad(WebFrame * frame)1985  void WebPage::SandboxExtensionTracker::didStartProvisionalLoad(WebFrame* frame)
1986  {
1987      if (!frame->isMainFrame())
1988          return;
1989  
1990      if (shouldReuseCommittedSandboxExtension(frame)) {
1991          m_pendingProvisionalSandboxExtension = m_committedSandboxExtension.release();
1992          ASSERT(!m_committedSandboxExtension);
1993      }
1994  
1995      ASSERT(!m_provisionalSandboxExtension);
1996  
1997      m_provisionalSandboxExtension = m_pendingProvisionalSandboxExtension.release();
1998      if (!m_provisionalSandboxExtension)
1999          return;
2000  
2001      m_provisionalSandboxExtension->consume();
2002  }
2003  
didCommitProvisionalLoad(WebFrame * frame)2004  void WebPage::SandboxExtensionTracker::didCommitProvisionalLoad(WebFrame* frame)
2005  {
2006      if (!frame->isMainFrame())
2007          return;
2008  
2009      ASSERT(!m_pendingProvisionalSandboxExtension);
2010  
2011      // The provisional load has been committed. Invalidate the currently committed sandbox
2012      // extension and make the provisional sandbox extension the committed sandbox extension.
2013      if (m_committedSandboxExtension)
2014          m_committedSandboxExtension->invalidate();
2015  
2016      m_committedSandboxExtension = m_provisionalSandboxExtension.release();
2017  }
2018  
didFailProvisionalLoad(WebFrame * frame)2019  void WebPage::SandboxExtensionTracker::didFailProvisionalLoad(WebFrame* frame)
2020  {
2021      if (!frame->isMainFrame())
2022          return;
2023  
2024      if (!m_provisionalSandboxExtension)
2025          return;
2026  
2027      m_provisionalSandboxExtension->invalidate();
2028      m_provisionalSandboxExtension = nullptr;
2029  }
2030  
hasLocalDataForURL(const KURL & url)2031  bool WebPage::hasLocalDataForURL(const KURL& url)
2032  {
2033      if (url.isLocalFile())
2034          return true;
2035  
2036      FrameLoader* frameLoader = m_page->mainFrame()->loader();
2037      DocumentLoader* documentLoader = frameLoader ? frameLoader->documentLoader() : 0;
2038      if (documentLoader && documentLoader->subresource(url))
2039          return true;
2040  
2041      return platformHasLocalDataForURL(url);
2042  }
2043  
setCustomTextEncodingName(const String & encoding)2044  void WebPage::setCustomTextEncodingName(const String& encoding)
2045  {
2046      m_page->mainFrame()->loader()->reloadWithOverrideEncoding(encoding);
2047  }
2048  
didRemoveBackForwardItem(uint64_t itemID)2049  void WebPage::didRemoveBackForwardItem(uint64_t itemID)
2050  {
2051      WebBackForwardListProxy::removeItem(itemID);
2052  }
2053  
2054  #if PLATFORM(MAC)
2055  
isSpeaking()2056  bool WebPage::isSpeaking()
2057  {
2058      bool result;
2059      return sendSync(Messages::WebPageProxy::GetIsSpeaking(), Messages::WebPageProxy::GetIsSpeaking::Reply(result)) && result;
2060  }
2061  
speak(const String & string)2062  void WebPage::speak(const String& string)
2063  {
2064      send(Messages::WebPageProxy::Speak(string));
2065  }
2066  
stopSpeaking()2067  void WebPage::stopSpeaking()
2068  {
2069      send(Messages::WebPageProxy::StopSpeaking());
2070  }
2071  
2072  #endif
2073  
beginPrinting(uint64_t frameID,const PrintInfo & printInfo)2074  void WebPage::beginPrinting(uint64_t frameID, const PrintInfo& printInfo)
2075  {
2076      WebFrame* frame = WebProcess::shared().webFrame(frameID);
2077      if (!frame)
2078          return;
2079  
2080      Frame* coreFrame = frame->coreFrame();
2081      if (!coreFrame)
2082          return;
2083  
2084      if (!m_printContext)
2085          m_printContext = adoptPtr(new PrintContext(coreFrame));
2086  
2087      m_printContext->begin(printInfo.availablePaperWidth, printInfo.availablePaperHeight);
2088  
2089      float fullPageHeight;
2090      m_printContext->computePageRects(FloatRect(0, 0, printInfo.availablePaperWidth, printInfo.availablePaperHeight), 0, 0, printInfo.pageSetupScaleFactor, fullPageHeight, true);
2091  }
2092  
endPrinting()2093  void WebPage::endPrinting()
2094  {
2095      m_printContext = nullptr;
2096  }
2097  
computePagesForPrinting(uint64_t frameID,const PrintInfo & printInfo,uint64_t callbackID)2098  void WebPage::computePagesForPrinting(uint64_t frameID, const PrintInfo& printInfo, uint64_t callbackID)
2099  {
2100      Vector<IntRect> resultPageRects;
2101      double resultTotalScaleFactorForPrinting = 1;
2102  
2103      beginPrinting(frameID, printInfo);
2104  
2105      if (m_printContext) {
2106          resultPageRects = m_printContext->pageRects();
2107          resultTotalScaleFactorForPrinting = m_printContext->computeAutomaticScaleFactor(FloatSize(printInfo.availablePaperWidth, printInfo.availablePaperHeight)) * printInfo.pageSetupScaleFactor;
2108      }
2109  
2110      // If we're asked to print, we should actually print at least a blank page.
2111      if (resultPageRects.isEmpty())
2112          resultPageRects.append(IntRect(0, 0, 1, 1));
2113  
2114      send(Messages::WebPageProxy::ComputedPagesCallback(resultPageRects, resultTotalScaleFactorForPrinting, callbackID));
2115  }
2116  
2117  #if PLATFORM(MAC) || PLATFORM(WIN)
drawRectToPDF(uint64_t frameID,const WebCore::IntRect & rect,uint64_t callbackID)2118  void WebPage::drawRectToPDF(uint64_t frameID, const WebCore::IntRect& rect, uint64_t callbackID)
2119  {
2120      WebFrame* frame = WebProcess::shared().webFrame(frameID);
2121      Frame* coreFrame = frame ? frame->coreFrame() : 0;
2122  
2123      RetainPtr<CFMutableDataRef> pdfPageData(AdoptCF, CFDataCreateMutable(0, 0));
2124  
2125      if (coreFrame) {
2126          ASSERT(coreFrame->document()->printing());
2127  
2128  #if USE(CG)
2129          // FIXME: Use CGDataConsumerCreate with callbacks to avoid copying the data.
2130          RetainPtr<CGDataConsumerRef> pdfDataConsumer(AdoptCF, CGDataConsumerCreateWithCFData(pdfPageData.get()));
2131  
2132          CGRect mediaBox = CGRectMake(0, 0, rect.width(), rect.height());
2133          RetainPtr<CGContextRef> context(AdoptCF, CGPDFContextCreate(pdfDataConsumer.get(), &mediaBox, 0));
2134          RetainPtr<CFDictionaryRef> pageInfo(AdoptCF, CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
2135          CGPDFContextBeginPage(context.get(), pageInfo.get());
2136  
2137          GraphicsContext ctx(context.get());
2138          ctx.scale(FloatSize(1, -1));
2139          ctx.translate(0, -rect.height());
2140          m_printContext->spoolRect(ctx, rect);
2141  
2142          CGPDFContextEndPage(context.get());
2143          CGPDFContextClose(context.get());
2144  #endif
2145      }
2146  
2147      send(Messages::WebPageProxy::DataCallback(CoreIPC::DataReference(CFDataGetBytePtr(pdfPageData.get()), CFDataGetLength(pdfPageData.get())), callbackID));
2148  }
2149  
drawPagesToPDF(uint64_t frameID,uint32_t first,uint32_t count,uint64_t callbackID)2150  void WebPage::drawPagesToPDF(uint64_t frameID, uint32_t first, uint32_t count, uint64_t callbackID)
2151  {
2152      WebFrame* frame = WebProcess::shared().webFrame(frameID);
2153      Frame* coreFrame = frame ? frame->coreFrame() : 0;
2154  
2155      RetainPtr<CFMutableDataRef> pdfPageData(AdoptCF, CFDataCreateMutable(0, 0));
2156  
2157      if (coreFrame) {
2158          ASSERT(coreFrame->document()->printing());
2159  
2160  #if USE(CG)
2161          // FIXME: Use CGDataConsumerCreate with callbacks to avoid copying the data.
2162          RetainPtr<CGDataConsumerRef> pdfDataConsumer(AdoptCF, CGDataConsumerCreateWithCFData(pdfPageData.get()));
2163  
2164          CGRect mediaBox = m_printContext->pageCount() ? m_printContext->pageRect(0) : CGRectMake(0, 0, 1, 1);
2165          RetainPtr<CGContextRef> context(AdoptCF, CGPDFContextCreate(pdfDataConsumer.get(), &mediaBox, 0));
2166          for (uint32_t page = first; page < first + count; ++page) {
2167              if (page >= m_printContext->pageCount())
2168                  break;
2169  
2170              RetainPtr<CFDictionaryRef> pageInfo(AdoptCF, CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
2171              CGPDFContextBeginPage(context.get(), pageInfo.get());
2172  
2173              GraphicsContext ctx(context.get());
2174              ctx.scale(FloatSize(1, -1));
2175              ctx.translate(0, -m_printContext->pageRect(page).height());
2176              m_printContext->spoolPage(ctx, page, m_printContext->pageRect(page).width());
2177  
2178              CGPDFContextEndPage(context.get());
2179          }
2180          CGPDFContextClose(context.get());
2181  #endif
2182      }
2183  
2184      send(Messages::WebPageProxy::DataCallback(CoreIPC::DataReference(CFDataGetBytePtr(pdfPageData.get()), CFDataGetLength(pdfPageData.get())), callbackID));
2185  }
2186  #endif
2187  
runModal()2188  void WebPage::runModal()
2189  {
2190      if (m_isClosed)
2191          return;
2192      if (m_isRunningModal)
2193          return;
2194  
2195      m_isRunningModal = true;
2196      send(Messages::WebPageProxy::RunModal());
2197      RunLoop::run();
2198      ASSERT(!m_isRunningModal);
2199  }
2200  
setMemoryCacheMessagesEnabled(bool memoryCacheMessagesEnabled)2201  void WebPage::setMemoryCacheMessagesEnabled(bool memoryCacheMessagesEnabled)
2202  {
2203      m_page->setMemoryCacheClientCallsEnabled(memoryCacheMessagesEnabled);
2204  }
2205  
2206  #if !PLATFORM(MAC)
platformDragEnded()2207  void WebPage::platformDragEnded()
2208  {
2209  }
2210  #endif
2211  
canHandleRequest(const WebCore::ResourceRequest & request)2212  bool WebPage::canHandleRequest(const WebCore::ResourceRequest& request)
2213  {
2214      if (SchemeRegistry::shouldLoadURLSchemeAsEmptyDocument(request.url().protocol()))
2215          return true;
2216      return platformCanHandleRequest(request);
2217  }
2218  
2219  #if PLATFORM(MAC) && !defined(BUILDING_ON_SNOW_LEOPARD)
handleCorrectionPanelResult(const String & result)2220  void WebPage::handleCorrectionPanelResult(const String& result)
2221  {
2222      Frame* frame = m_page->focusController()->focusedOrMainFrame();
2223      if (!frame)
2224          return;
2225      frame->editor()->handleCorrectionPanelResult(result);
2226  }
2227  #endif
2228  
simulateMouseDown(int button,WebCore::IntPoint position,int clickCount,WKEventModifiers modifiers,double time)2229  void WebPage::simulateMouseDown(int button, WebCore::IntPoint position, int clickCount, WKEventModifiers modifiers, double time)
2230  {
2231      mouseEvent(WebMouseEvent(WebMouseEvent::MouseDown, static_cast<WebMouseEvent::Button>(button), position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time));
2232  }
2233  
simulateMouseUp(int button,WebCore::IntPoint position,int clickCount,WKEventModifiers modifiers,double time)2234  void WebPage::simulateMouseUp(int button, WebCore::IntPoint position, int clickCount, WKEventModifiers modifiers, double time)
2235  {
2236      mouseEvent(WebMouseEvent(WebMouseEvent::MouseUp, static_cast<WebMouseEvent::Button>(button), position, position, 0, 0, 0, clickCount, static_cast<WebMouseEvent::Modifiers>(modifiers), time));
2237  }
2238  
simulateMouseMotion(WebCore::IntPoint position,double time)2239  void WebPage::simulateMouseMotion(WebCore::IntPoint position, double time)
2240  {
2241      mouseEvent(WebMouseEvent(WebMouseEvent::MouseMove, WebMouseEvent::NoButton, position, position, 0, 0, 0, 0, WebMouseEvent::Modifiers(), time));
2242  }
2243  
2244  } // namespace WebKit
2245