2 * Copyright (C) 2011 Samsung Electronics
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef PageClientImpl_h
27 #define PageClientImpl_h
29 #include "PageClient.h"
33 #include "WebEditCommandProxy.h"
34 #include <WebCore/ViewportArguments.h>
36 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
37 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
38 #include "DrawingAreaProxyImpl.h"
39 #include <WebCore/Color.h>
42 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
43 #include "TextSelection.h"
45 #if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
46 #include "OfflinePageSave.h"
48 #if ENABLE(TIZEN_DRAG_SUPPORT)
51 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
52 #include "FormDataCandidate.h"
54 using std::numeric_limits;
55 #endif // #if OS(TIZEN)
61 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
62 class MainFrameScrollbarTizen;
65 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
69 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
70 class ClipboardHelper;
73 #if ENABLE(TIZEN_DRAG_SUPPORT)
77 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
78 class FormDataCandidate;
81 class PageClientImpl : public PageClient {
83 static PassOwnPtr<PageClientImpl> create(EwkViewImpl* viewImpl)
85 return adoptPtr(new PageClientImpl(viewImpl));
87 virtual ~PageClientImpl();
89 EwkViewImpl* viewImpl() const;
92 struct ViewportConstraints {
98 , contentsDefinedInitialScale(false)
99 , layoutSize(WebCore::IntSize())
106 bool contentsDefinedInitialScale;
107 WebCore::IntSize layoutSize;
110 bool userScalable() { return fabs(m_viewportConstraints.minimumScale - m_viewportConstraints.maximumScale) > numeric_limits<float>::epsilon(); }
111 ViewportConstraints viewportConstraints() { return m_viewportConstraints; }
112 ViewportConstraints computeViewportConstraints(const WebCore::ViewportAttributes&);
113 double adjustScaleWithViewport(double);
114 #if USE(TILED_BACKING_STORE) && ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
115 TIZEN_VIRTUAL void updateViewportSize(const WebCore::IntSize&, const int);
116 TIZEN_VIRTUAL void updateVisibleContentRectSize(const WebCore::IntSize&);
118 void prepareRestoredVisibleContectRect();
119 void initializeVisibleContentRect();
120 double availableMinimumScale();
121 void fitViewportToContent();
122 bool wasViewportFitsToContent() { return m_viewportFitsToContent; }
124 void setFocusedNodeRect(const WebCore::IntRect&);
125 WebCore::IntRect focusedNodeRect() { return m_focusedNodeRect; };
127 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
128 void textChangeInTextField(const String& name, const String& value);
131 void setViewFocused(bool focused) { m_viewFocused = focused; }
132 void setViewWindowActive(bool active) { m_viewWindowActive = active; }
133 void updateFormNavigation(int length, int offset);
135 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
136 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
137 DrawingAreaProxy* drawingArea() const;
140 const WebCore::IntPoint scrollPosition();
141 WebCore::IntRect adjustVisibleContentRect(WebCore::IntRect, float);
142 void setVisibleContentRect(const WebCore::IntRect&, float newScale, const WebCore::FloatPoint& trajectory = WebCore::FloatPoint());
143 TIZEN_VIRTUAL void displayViewport();
144 TIZEN_VIRTUAL void drawContents();
145 #if ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
146 virtual void drawContents(BackingStore::PlatformGraphicsContext);
148 void scaleImage(double, WebCore::IntPoint);
149 void scaleContents(double, const WebCore::IntPoint&);
150 WebCore::IntRect visibleContentRect() { return m_visibleContentRect; }
152 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
153 void updateScrollbar();
154 void frameRectChanged();
155 void updateVisibility();
158 // FIXME: The concept of suspending content comes from webkit opensource's PageViewportController,
159 // so below code should be replaced when PageViewportController codes are merged.
160 // Please do not use below codes. They are only for scaling contents.
161 void suspendContent();
162 void resumeContent();
163 WebCore::FloatPoint boundContentsPositionAtScale(const WebCore::FloatPoint&, float scale);
165 float scaleFactor() { return page()->pageScaleFactor(); }
166 WebCore::IntPoint scrollPosition() { return page()->scrollPosition(); }
167 #endif // #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
169 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
170 bool isTextSelectionDowned();
171 bool isTextSelectionMode();
172 void setIsTextSelectionMode(bool isTextSelectionMode);
173 void updateTextSelectionHandlesAndContextMenu(bool isShow, bool isScrolling = false);
174 bool textSelectionDown(const WebCore::IntPoint& point, bool isStartedTextSelectionFromOutside = false);
175 void textSelectionMove(const WebCore::IntPoint& point, bool isStartedTextSelectionFromOutside = false);
176 void textSelectionUp(const WebCore::IntPoint& point, bool isStartedTextSelectionFromOutside = false);
177 bool isTextSelectionHandleDowned();
178 #if ENABLE(TIZEN_WEBKIT2_FOR_MOVING_TEXT_SELECTION_HANDLE_FROM_OSP)
179 void textSelectonHandleDown(const WebCore::IntPoint& point);
180 void textSelectonHandleMove(const WebCore::IntPoint& point);
181 void textSelectonHandleUp();
183 void requestToShowTextSelectionHandlesAndContextMenu();
184 void initTextSelectionHandlesMouseDownedStatus();
185 void changeContextMenuPosition(WebCore::IntPoint& point);
188 #if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
189 void saveSerializedHTMLDataForMainPage(const String& serializedData, const String& fileName);
190 void saveSubresourcesData(Vector<WebSubresourceTizen>& subresourceData);
191 void startOfflinePageSave(String& path, String& url, String& title);
194 #if ENABLE(TIZEN_CLIPBOARD) || ENABLE(TIZEN_PASTEBOARD)
195 void setClipboardData(const String& data, const String& type);
196 void clearClipboardData();
199 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
200 void pasteContextMenuSelected();
204 #if ENABLE(TIZEN_WEBKIT2_VIEW_VISIBILITY)
205 void setIsVisible(bool isVisible);
208 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
209 bool scrollBy(WebCore::IntSize);
210 void scrollTo(WebCore::IntPoint);
213 void setIsScrollableLayerFocused(const bool b) { m_isScrollableLayerFocused = b; }
214 bool isScrollableLayerFocused() const { return m_isScrollableLayerFocused; }
216 void setIsScrollableNodeFocused(const bool b) { m_isScrollableNodeFocused = b; }
217 bool isScrollableNodeFocused() const { return m_isScrollableNodeFocused; }
219 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
220 void setOverflowResult(bool pressed, WebLayerID);
221 void findScrollableNode(const WebCore::IntPoint&);
224 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
225 bool isContextMenuVisible() { return m_isContextMenuVisible; }
226 void setIsContextMenuVisible(bool isVisible) { m_isContextMenuVisible = isVisible; }
228 TIZEN_VIRTUAL void didRenderFrame();
229 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
230 void setBackgroundColor(double red, double green, double blue, double alpha);
231 TIZEN_VIRTUAL bool makeContextCurrent() { return true; }
234 virtual void didFindZoomableArea(const WebCore::IntPoint&, const WebCore::IntRect&);
236 #if ENABLE(TIZEN_ICON_DATABASE)
237 virtual void didReceiveIcon();
240 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_MENU_CLIPBOARD)
241 void clipboardContextMenuSelected();
242 bool isClipboardWindowOpened();
243 void closeClipboardWindow();
246 #if ENABLE(TIZEN_DRAG_SUPPORT)
247 void setDragPoint(const WebCore::IntPoint& point);
249 void setDragMode(bool isDragMode);
252 #if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
253 void hideFocusRing();
256 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
257 bool isShowingFormDataCandidate();
258 void updateFormDataCandidate(const Vector<String>& data);
259 void hideFormDataCandidate();
260 void showFormDataCandidate(const WebCore::IntRect& rect);
263 #if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
264 void setWaitFrameOfNewViewortSize(bool waitFrameOfNewViewortSize) { m_waitFrameOfNewViewortSize = waitFrameOfNewViewortSize; }
267 #endif // #if OS(TIZEN)
271 virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
272 virtual void setViewNeedsDisplay(const WebCore::IntRect&);
273 virtual void displayView();
274 virtual void scrollView(const WebCore::IntRect&, const WebCore::IntSize&);
275 virtual bool isViewWindowActive() { return m_viewWindowActive; }
276 virtual bool isViewFocused() { return m_viewFocused; }
277 virtual bool isViewVisible();
278 virtual bool isViewInWindow();
280 virtual void processDidCrash();
281 virtual void didRelaunchProcess();
282 virtual void pageClosed();
284 virtual void toolTipChanged(const String&, const String&);
286 virtual void setCursor(const WebCore::Cursor&);
287 virtual void setCursorHiddenUntilMouseMoves(bool);
288 virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&);
290 virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo);
291 virtual void clearAllEditCommands();
292 virtual bool canUndoRedo(WebPageProxy::UndoOrRedo);
293 virtual void executeUndoRedo(WebPageProxy::UndoOrRedo);
294 virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
295 virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
296 virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&);
297 virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&);
299 void updateTextInputState();
300 virtual void handleDownloadRequest(DownloadProxy*);
302 virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool);
303 #if ENABLE(GESTURE_EVENTS)
304 virtual void doneWithGestureEvent(const WebGestureEvent&, bool wasEventHandled);
306 #if ENABLE(TOUCH_EVENTS)
307 virtual void doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled);
310 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
311 virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
313 #if ENABLE(INPUT_TYPE_COLOR)
314 virtual PassRefPtr<WebColorChooserProxy> createColorChooserProxy(WebPageProxy*, const WebCore::Color& initialColor);
317 virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool, bool);
318 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
319 TIZEN_VIRTUAL void initializeAcceleratedCompositingMode();
320 TIZEN_VIRTUAL void finalizeAcceleratedCompositingMode() {}
321 virtual void enterAcceleratedCompositingMode(const LayerTreeContext&) {}
322 virtual void exitAcceleratedCompositingMode() {}
324 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&);
327 virtual void didChangeScrollbarsForMainFrame() const;
330 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
331 void createScrollbarIfNeeded(bool horizontalBar, bool verticalBar);
334 virtual void didFirstVisuallyNonEmptyLayoutForMainFrame();
335 virtual void didChangeContentsSize(const WebCore::IntSize);
336 virtual void pageScaleFactorDidChange();
339 virtual void didCommitLoadForMainFrame(bool);
340 virtual void didFinishLoadingDataForCustomRepresentation(const String&, const CoreIPC::DataReference&);
341 virtual double customRepresentationZoomFactor();
342 virtual void setCustomRepresentationZoomFactor(double);
344 virtual void flashBackingStoreUpdates(const Vector<WebCore::IntRect>&);
345 virtual void findStringInCustomRepresentation(const String&, FindOptions, unsigned);
346 virtual void countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned);
348 #if USE(TILED_BACKING_STORE)
349 virtual void pageDidRequestScroll(const WebCore::IntPoint&);
352 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
353 virtual void pageDidRequestRestoreVisibleContentRect(const WebCore::IntPoint&, float);
356 #if ENABLE(TIZEN_DRAG_SUPPORT)
357 virtual void startDrag(const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage);
360 #if ENABLE(TIZEN_REGISTER_PROTOCOL_HANDLER)
361 virtual void registerProtocolHandler(const String& scheme, const String& baseURL, const String& url, const String& title);
363 #if ENABLE(TIZEN_CUSTOM_SCHEME_HANDLER)
364 virtual unsigned int isProtocolHandlerRegistered(const String& scheme, const String& baseURL, const String& url);
365 virtual void unregisterProtocolHandler(const String& scheme, const String& baseURL, const String& url);
367 #if ENABLE(TIZEN_REGISTER_CONTENT_HANDLER)
368 virtual void registerContentHandler(const String& mimeType, const String& baseURL, const String& url, const String& title);
369 virtual unsigned int isContentHandlerRegistered(const String& mimeType, const String& baseURL, const String& url);
370 virtual void unregisterContentHandler(const String& mimeType, const String& baseURL, const String& url);
372 #if ENABLE(TIZEN_SEARCH_PROVIDER)
373 virtual void addSearchProvider(const String& baseURL, const String& engineURL);
374 virtual unsigned long isSearchProviderInstalled(const String& baseURL, const String& engineURL);
377 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
378 virtual bool getStandaloneStatus();
381 #if ENABLE(SCREEN_ORIENTATION_SUPPORT) && ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT)
382 virtual bool lockOrientation(int willLockOrientation);
383 virtual void unlockOrientation();
387 explicit PageClientImpl(EwkViewImpl*);
389 virtual WebCore::IntSize viewSize();
391 EwkViewImpl* m_viewImpl;
394 ViewportConstraints m_viewportConstraints;
397 bool m_viewWindowActive;
399 bool m_pageDidRendered;
401 // Both angle and wasMinimized are added to handle device rotation
403 bool m_viewportFitsToContent;
405 WebCore::IntRect m_focusedNodeRect;
407 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
408 WebCore::IntRect m_visibleContentRect;
411 // FIXME: The concept of suspending content comes from webkit opensource's PageViewportController,
412 // so below code should be replaced when PageViewportController codes are merged.
413 // Please do not use below codes. They are only for scaling contents.
414 bool m_hasSuspendedContent;
415 #endif // ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
417 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
418 WebCore::IntPoint m_restoredScrollPosition;
419 float m_restoredScaleFactor;
421 #if ENABLE(TIZEN_WEBKIT2_BEFORE_PAGE_RENDERED_SCROLL_POSITION)
422 WebCore::IntPoint m_scrollPositionBeforePageRendered;
425 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
426 RefPtr<MainFrameScrollbarTizen> m_horizontalScrollbar;
427 RefPtr<MainFrameScrollbarTizen> m_verticalScrollbar;
429 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
430 OwnPtr<TextSelection> m_textSelection;
432 #if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
433 OwnPtr<OfflinePageSave> m_offlinePageSave;
435 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
436 OwnPtr<ClipboardHelper> m_clipboardHelper;
438 #if ENABLE(TIZEN_DRAG_SUPPORT)
441 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
442 OwnPtr<FormDataCandidate> m_formDataCandidate;
444 bool m_suspendPainting;
445 bool m_suspendResource;
446 bool m_suspendRequested;
449 bool m_isScrollableLayerFocused;
450 bool m_isScrollableNodeFocused;
452 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
453 bool m_shouldMakeBackupTexture;
454 bool m_shouldShowBackupTexture;
455 WebCore::IntRect m_initialViewRect;
458 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
459 bool m_isContextMenuVisible;
462 WebCore::Color m_bgColor;
464 Vector<RefPtr<WebKit::WebEditCommandProxy> > m_undoCommands;
465 Vector<RefPtr<WebKit::WebEditCommandProxy> > m_redoCommands;
467 #if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
468 bool m_waitFrameOfNewViewortSize;
471 #endif // #if OS(TIZEN)
475 #if ENABLE(TIZEN_WEBKIT2_TILED_AC) && ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
476 class PageClientEvasGL : public PageClientImpl {
478 static PassOwnPtr<PageClientEvasGL> create(EwkViewImpl* viewImpl)
480 return adoptPtr(new PageClientEvasGL(viewImpl));
484 virtual void updateViewportSize(const WebCore::IntSize&, const int);
485 virtual void updateVisibleContentRectSize(const WebCore::IntSize&);
486 virtual void setViewNeedsDisplay(const WebCore::IntRect&);
487 virtual void displayViewport();
488 virtual void drawContents();
489 virtual void didRenderFrame();
490 virtual bool makeContextCurrent();
493 explicit PageClientEvasGL(EwkViewImpl* viewImpl);
495 virtual void initializeAcceleratedCompositingMode();
496 virtual void finalizeAcceleratedCompositingMode();
497 virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
498 virtual void exitAcceleratedCompositingMode();
500 void setTargetSurface();
502 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
503 bool isDirectRendering() { return (m_config->options_bits == EVAS_GL_OPTIONS_DIRECT); }
507 Evas_GL_API* m_evasGlApi;
508 Evas_GL_Context* m_context;
509 Evas_GL_Surface* m_surface;
510 Evas_GL_Config* m_config;
511 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
515 bool m_isAcceleratedCompositingModeInitialized;
519 } // namespace WebKit
521 #endif // PageClientImpl_h