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);
175 void textSelectionMove(const WebCore::IntPoint& point);
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 setDeferUpdateViewportSize(bool b) { m_deferUpdateViewportSize = b; }
206 bool deferUpdateViewportSize() const { return m_deferUpdateViewportSize; }
207 bool isVisible() const { return m_isVisible; }
208 void setIsVisible(bool isVisible);
211 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
212 bool scrollBy(WebCore::IntSize);
213 void scrollTo(WebCore::IntPoint);
216 void setIsScrollableLayerFocused(const bool b) { m_isScrollableLayerFocused = b; }
217 bool isScrollableLayerFocused() const { return m_isScrollableLayerFocused; }
219 void setIsScrollableNodeFocused(const bool b) { m_isScrollableNodeFocused = b; }
220 bool isScrollableNodeFocused() const { return m_isScrollableNodeFocused; }
222 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
223 void setOverflowResult(bool pressed, WebLayerID);
224 void findScrollableNode(const WebCore::IntPoint&);
227 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
228 bool isContextMenuVisible() { return m_isContextMenuVisible; }
229 void setIsContextMenuVisible(bool isVisible) { m_isContextMenuVisible = isVisible; }
231 TIZEN_VIRTUAL void didRenderFrame();
232 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
233 void setBackgroundColor(double red, double green, double blue, double alpha);
234 TIZEN_VIRTUAL bool makeContextCurrent() { return true; }
237 virtual void didFindZoomableArea(const WebCore::IntPoint&, const WebCore::IntRect&);
239 #if ENABLE(TIZEN_ICON_DATABASE)
240 virtual void didReceiveIcon();
243 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_MENU_CLIPBOARD)
244 void clipboardContextMenuSelected();
245 bool isClipboardWindowOpened();
246 void closeClipboardWindow();
249 #if ENABLE(TIZEN_DRAG_SUPPORT)
250 void setDragPoint(const WebCore::IntPoint& point);
252 void setDragMode(bool isDragMode);
255 #if ENABLE(TIZEN_WEBKIT2_FOCUS_RING)
256 void hideFocusRing();
259 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
260 bool isShowingFormDataCandidate();
261 void updateFormDataCandidate(const Vector<String>& data);
262 void hideFormDataCandidate();
263 void showFormDataCandidate(const WebCore::IntRect& rect);
266 #if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
267 void setWaitFrameOfNewViewortSize(bool waitFrameOfNewViewortSize) { m_waitFrameOfNewViewortSize = waitFrameOfNewViewortSize; }
270 bool notifiedNonemptyLayout() { return m_nonemptyLayoutRendered; }
271 #endif // #if OS(TIZEN)
275 virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
276 virtual void setViewNeedsDisplay(const WebCore::IntRect&);
277 virtual void displayView();
278 virtual void scrollView(const WebCore::IntRect&, const WebCore::IntSize&);
279 virtual bool isViewWindowActive() { return m_viewWindowActive; }
280 virtual bool isViewFocused() { return m_viewFocused; }
281 virtual bool isViewVisible();
282 virtual bool isViewInWindow();
284 virtual void processDidCrash();
285 virtual void didRelaunchProcess();
286 virtual void pageClosed();
288 virtual void toolTipChanged(const String&, const String&);
290 virtual void setCursor(const WebCore::Cursor&);
291 virtual void setCursorHiddenUntilMouseMoves(bool);
292 virtual void didChangeViewportProperties(const WebCore::ViewportAttributes&);
294 virtual void registerEditCommand(PassRefPtr<WebEditCommandProxy>, WebPageProxy::UndoOrRedo);
295 virtual void clearAllEditCommands();
296 virtual bool canUndoRedo(WebPageProxy::UndoOrRedo);
297 virtual void executeUndoRedo(WebPageProxy::UndoOrRedo);
298 virtual WebCore::FloatRect convertToDeviceSpace(const WebCore::FloatRect&);
299 virtual WebCore::FloatRect convertToUserSpace(const WebCore::FloatRect&);
300 virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&);
301 virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&);
303 void updateTextInputState();
304 virtual void handleDownloadRequest(DownloadProxy*);
306 virtual void doneWithKeyEvent(const NativeWebKeyboardEvent&, bool);
307 #if ENABLE(GESTURE_EVENTS)
308 virtual void doneWithGestureEvent(const WebGestureEvent&, bool wasEventHandled);
310 #if ENABLE(TOUCH_EVENTS)
311 virtual void doneWithTouchEvent(const NativeWebTouchEvent&, bool wasEventHandled);
314 virtual PassRefPtr<WebPopupMenuProxy> createPopupMenuProxy(WebPageProxy*);
315 virtual PassRefPtr<WebContextMenuProxy> createContextMenuProxy(WebPageProxy*);
317 #if ENABLE(INPUT_TYPE_COLOR)
318 virtual PassRefPtr<WebColorChooserProxy> createColorChooserProxy(WebPageProxy*, const WebCore::Color& initialColor);
321 virtual void setFindIndicator(PassRefPtr<FindIndicator>, bool, bool);
322 #if ENABLE(TIZEN_WEBKIT2_TILED_AC)
323 TIZEN_VIRTUAL void initializeAcceleratedCompositingMode();
324 TIZEN_VIRTUAL void finalizeAcceleratedCompositingMode() {}
325 virtual void enterAcceleratedCompositingMode(const LayerTreeContext&) {}
326 virtual void exitAcceleratedCompositingMode() {}
328 virtual void updateAcceleratedCompositingMode(const LayerTreeContext&);
331 virtual void didChangeScrollbarsForMainFrame() const;
334 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
335 void createScrollbarIfNeeded(bool horizontalBar, bool verticalBar);
338 virtual void didFirstVisuallyNonEmptyLayoutForMainFrame();
339 virtual void didChangeContentsSize(const WebCore::IntSize);
340 virtual void pageScaleFactorDidChange();
343 virtual void didCommitLoadForMainFrame(bool);
344 virtual void didFinishLoadingDataForCustomRepresentation(const String&, const CoreIPC::DataReference&);
345 virtual double customRepresentationZoomFactor();
346 virtual void setCustomRepresentationZoomFactor(double);
348 virtual void flashBackingStoreUpdates(const Vector<WebCore::IntRect>&);
349 virtual void findStringInCustomRepresentation(const String&, FindOptions, unsigned);
350 virtual void countStringMatchesInCustomRepresentation(const String&, FindOptions, unsigned);
352 #if USE(TILED_BACKING_STORE)
353 virtual void pageDidRequestScroll(const WebCore::IntPoint&);
356 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
357 virtual void pageDidRequestRestoreVisibleContentRect(const WebCore::IntPoint&, float);
360 #if ENABLE(TIZEN_DRAG_SUPPORT)
361 virtual void startDrag(const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage);
364 #if ENABLE(TIZEN_REGISTER_PROTOCOL_HANDLER)
365 virtual void registerProtocolHandler(const String& scheme, const String& baseURL, const String& url, const String& title);
367 #if ENABLE(TIZEN_CUSTOM_SCHEME_HANDLER)
368 virtual unsigned int isProtocolHandlerRegistered(const String& scheme, const String& baseURL, const String& url);
369 virtual void unregisterProtocolHandler(const String& scheme, const String& baseURL, const String& url);
371 #if ENABLE(TIZEN_REGISTER_CONTENT_HANDLER)
372 virtual void registerContentHandler(const String& mimeType, const String& baseURL, const String& url, const String& title);
373 virtual unsigned int isContentHandlerRegistered(const String& mimeType, const String& baseURL, const String& url);
374 virtual void unregisterContentHandler(const String& mimeType, const String& baseURL, const String& url);
376 #if ENABLE(TIZEN_SEARCH_PROVIDER)
377 virtual void addSearchProvider(const String& baseURL, const String& engineURL);
378 virtual unsigned long isSearchProviderInstalled(const String& baseURL, const String& engineURL);
381 #if ENABLE(TIZEN_SUPPORT_WEBAPP_META_TAG)
382 virtual bool getStandaloneStatus();
385 #if ENABLE(SCREEN_ORIENTATION_SUPPORT) && ENABLE(TIZEN_SCREEN_ORIENTATION_SUPPORT)
386 virtual bool lockOrientation(int willLockOrientation);
387 virtual void unlockOrientation();
391 explicit PageClientImpl(EwkViewImpl*);
393 virtual WebCore::IntSize viewSize();
395 EwkViewImpl* m_viewImpl;
398 ViewportConstraints m_viewportConstraints;
401 bool m_viewWindowActive;
403 bool m_pageDidRendered;
405 // Both angle and wasMinimized are added to handle device rotation
407 bool m_viewportFitsToContent;
409 WebCore::IntRect m_focusedNodeRect;
411 #if ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
412 WebCore::IntRect m_visibleContentRect;
415 // FIXME: The concept of suspending content comes from webkit opensource's PageViewportController,
416 // so below code should be replaced when PageViewportController codes are merged.
417 // Please do not use below codes. They are only for scaling contents.
418 bool m_hasSuspendedContent;
419 #endif // ENABLE(TIZEN_WEBKIT2_TILED_BACKING_STORE)
421 #if ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
422 WebCore::IntPoint m_restoredScrollPosition;
423 float m_restoredScaleFactor;
425 #if ENABLE(TIZEN_WEBKIT2_BEFORE_PAGE_RENDERED_SCROLL_POSITION)
426 WebCore::IntPoint m_scrollPositionBeforePageRendered;
429 #if ENABLE(TIZEN_WEBKIT2_TILED_SCROLLBAR)
430 RefPtr<MainFrameScrollbarTizen> m_horizontalScrollbar;
431 RefPtr<MainFrameScrollbarTizen> m_verticalScrollbar;
433 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
434 OwnPtr<TextSelection> m_textSelection;
436 #if ENABLE(TIZEN_OFFLINE_PAGE_SAVE)
437 OwnPtr<OfflinePageSave> m_offlinePageSave;
439 #if ENABLE(TIZEN_WEBKIT2_CLIPBOARD_HELPER)
440 OwnPtr<ClipboardHelper> m_clipboardHelper;
442 #if ENABLE(TIZEN_DRAG_SUPPORT)
445 #if ENABLE(TIZEN_WEBKIT2_FORM_DATABASE)
446 OwnPtr<FormDataCandidate> m_formDataCandidate;
448 bool m_suspendPainting;
449 bool m_suspendResource;
450 bool m_suspendRequested;
452 bool m_deferUpdateViewportSize;
454 bool m_isScrollableLayerFocused;
455 bool m_isScrollableNodeFocused;
457 #if ENABLE(TIZEN_WEBKIT2_TILED_AC_SHARED_PLATFORM_SURFACE_BACKUP_IMAGE)
458 bool m_shouldMakeBackupTexture;
459 bool m_shouldShowBackupTexture;
460 WebCore::IntRect m_initialViewRect;
463 #if ENABLE(TIZEN_CONTEXT_MENU_WEBKIT_2)
464 bool m_isContextMenuVisible;
467 WebCore::Color m_bgColor;
469 Vector<RefPtr<WebKit::WebEditCommandProxy> > m_undoCommands;
470 Vector<RefPtr<WebKit::WebEditCommandProxy> > m_redoCommands;
472 #if ENABLE(TIZEN_PRERENDERING_FOR_ROTATION)
473 bool m_waitFrameOfNewViewortSize;
476 bool m_nonemptyLayoutRendered;
477 #endif // #if OS(TIZEN)
481 #if ENABLE(TIZEN_WEBKIT2_TILED_AC) && ENABLE(TIZEN_RUNTIME_BACKEND_SELECTION)
482 class PageClientEvasGL : public PageClientImpl {
484 static PassOwnPtr<PageClientEvasGL> create(EwkViewImpl* viewImpl)
486 return adoptPtr(new PageClientEvasGL(viewImpl));
490 virtual void updateViewportSize(const WebCore::IntSize&, const int);
491 virtual void updateVisibleContentRectSize(const WebCore::IntSize&);
492 virtual void setViewNeedsDisplay(const WebCore::IntRect&);
493 virtual void displayViewport();
494 virtual void drawContents();
495 virtual void didRenderFrame();
496 virtual bool makeContextCurrent();
499 explicit PageClientEvasGL(EwkViewImpl* viewImpl);
501 virtual void initializeAcceleratedCompositingMode();
502 virtual void finalizeAcceleratedCompositingMode();
503 virtual void enterAcceleratedCompositingMode(const LayerTreeContext&);
504 virtual void exitAcceleratedCompositingMode();
506 void setTargetSurface();
508 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
509 bool isDirectRendering() { return (m_config->options_bits == EVAS_GL_OPTIONS_DIRECT); }
513 Evas_GL_API* m_evasGlApi;
514 Evas_GL_Context* m_context;
515 Evas_GL_Surface* m_surface;
516 Evas_GL_Config* m_config;
517 #if ENABLE(TIZEN_WEBKIT2_DIRECT_RENDERING)
521 bool m_isAcceleratedCompositingModeInitialized;
525 } // namespace WebKit
527 #endif // PageClientImpl_h