Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / frame / FrameView.h
1 /*
2    Copyright (C) 1997 Martin Jones (mjones@kde.org)
3              (C) 1998 Waldo Bastian (bastian@kde.org)
4              (C) 1998, 1999 Torben Weis (weis@kde.org)
5              (C) 1999 Lars Knoll (knoll@kde.org)
6              (C) 1999 Antti Koivisto (koivisto@kde.org)
7    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
8
9    This library is free software; you can redistribute it and/or
10    modify it under the terms of the GNU Library General Public
11    License as published by the Free Software Foundation; either
12    version 2 of the License, or (at your option) any later version.
13
14    This library is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17    Library General Public License for more details.
18
19    You should have received a copy of the GNU Library General Public License
20    along with this library; see the file COPYING.LIB.  If not, write to
21    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22    Boston, MA 02110-1301, USA.
23 */
24
25 #ifndef FrameView_h
26 #define FrameView_h
27
28 #include "RuntimeEnabledFeatures.h"
29 #include "core/rendering/PaintPhase.h"
30 #include "platform/geometry/LayoutRect.h"
31 #include "platform/graphics/Color.h"
32 #include "platform/scroll/ScrollView.h"
33 #include "wtf/Forward.h"
34 #include "wtf/OwnPtr.h"
35 #include "wtf/text/WTFString.h"
36
37 namespace WebCore {
38
39 class AXObjectCache;
40 class DocumentLifecycle;
41 class Cursor;
42 class Element;
43 class FloatSize;
44 class HTMLFrameOwnerElement;
45 class LocalFrame;
46 class KURL;
47 class Node;
48 class Page;
49 class RenderBox;
50 class RenderEmbeddedObject;
51 class RenderObject;
52 class RenderScrollbarPart;
53 class RenderStyle;
54 class RenderView;
55 class RenderWidget;
56
57 typedef unsigned long long DOMTimeStamp;
58
59 class FrameView FINAL : public ScrollView {
60 public:
61     friend class RenderView;
62     friend class Internals;
63
64     static PassRefPtr<FrameView> create(LocalFrame*);
65     static PassRefPtr<FrameView> create(LocalFrame*, const IntSize& initialSize);
66
67     virtual ~FrameView();
68
69     virtual HostWindow* hostWindow() const OVERRIDE;
70
71     virtual void invalidateRect(const IntRect&) OVERRIDE;
72     virtual void setFrameRect(const IntRect&) OVERRIDE;
73
74     virtual bool scheduleAnimation() OVERRIDE;
75
76     LocalFrame& frame() const { return *m_frame; }
77     Page* page() const;
78
79     RenderView* renderView() const;
80
81     virtual void setCanHaveScrollbars(bool) OVERRIDE;
82
83     virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation) OVERRIDE;
84
85     virtual void setContentsSize(const IntSize&) OVERRIDE;
86     IntPoint clampOffsetAtScale(const IntPoint& offset, float scale) const;
87
88     void layout(bool allowSubtree = true);
89     bool didFirstLayout() const;
90     void scheduleRelayout();
91     void scheduleRelayoutOfSubtree(RenderObject*);
92     bool layoutPending() const;
93     bool isInPerformLayout() const;
94
95     void setCanRepaintDuringPerformLayout(bool b) { m_canRepaintDuringPerformLayout = b; }
96     bool canRepaintDuringPerformLayout() const { return m_canRepaintDuringPerformLayout; }
97
98     RenderObject* layoutRoot(bool onlyDuringLayout = false) const;
99     void clearLayoutSubtreeRoot() { m_layoutSubtreeRoot = 0; }
100     int layoutCount() const { return m_layoutCount; }
101
102     bool needsLayout() const;
103     void setNeedsLayout();
104
105     // Methods for getting/setting the size Blink should use to layout the contents.
106     IntSize layoutSize(IncludeScrollbarsInRect = ExcludeScrollbars) const;
107     void setLayoutSize(const IntSize&);
108
109     // If this is set to false, the layout size will need to be explicitly set by the owner.
110     // E.g. WebViewImpl sets its mainFrame's layout size manually
111     void setLayoutSizeFixedToFrameSize(bool isFixed) { m_layoutSizeFixedToFrameSize = isFixed; }
112     bool layoutSizeFixedToFrameSize() { return m_layoutSizeFixedToFrameSize; }
113
114     bool needsFullRepaint() const { return m_doFullRepaint; }
115
116     void updateAcceleratedCompositingSettings();
117
118     void recalcOverflowAfterStyleChange();
119     void updateCompositingLayersAfterStyleChange();
120
121     bool hasCompositedContent() const;
122     bool isEnclosedInCompositingLayer() const;
123
124     void resetScrollbars();
125     void prepareForDetach();
126     void detachCustomScrollbars();
127     virtual void recalculateScrollbarOverlayStyle();
128
129     void clear();
130
131     bool isTransparent() const;
132     void setTransparent(bool isTransparent);
133
134     // True if the FrameView is not transparent, and the base background color is opaque.
135     bool hasOpaqueBackground() const;
136
137     Color baseBackgroundColor() const;
138     void setBaseBackgroundColor(const Color&);
139     void updateBackgroundRecursively(const Color&, bool);
140
141     void adjustViewSize();
142
143     virtual IntRect windowClipRect(IncludeScrollbarsInRect = ExcludeScrollbars) const OVERRIDE;
144     IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*) const;
145
146     virtual IntRect windowResizerRect() const OVERRIDE;
147
148     virtual float visibleContentScaleFactor() const OVERRIDE { return m_visibleContentScaleFactor; }
149     void setVisibleContentScaleFactor(float);
150
151     virtual float inputEventsScaleFactor() const OVERRIDE;
152     virtual IntSize inputEventsOffsetForEmulation() const OVERRIDE;
153     void setInputEventsTransformForEmulation(const IntSize&, float);
154
155     virtual void setScrollPosition(const IntPoint&) OVERRIDE;
156     virtual bool shouldRubberBandInDirection(ScrollDirection) const OVERRIDE;
157     virtual bool isRubberBandInProgress() const OVERRIDE;
158     void setScrollPositionNonProgrammatically(const IntPoint&);
159
160     // This is different than visibleContentRect() in that it ignores negative (or overly positive)
161     // offsets from rubber-banding, and it takes zooming into account.
162     LayoutRect viewportConstrainedVisibleContentRect() const;
163     void viewportConstrainedVisibleContentSizeChanged(bool widthChanged, bool heightChanged);
164
165     AtomicString mediaType() const;
166     void setMediaType(const AtomicString&);
167     void adjustMediaTypeForPrinting(bool printing);
168
169     void setCannotBlitToWindow();
170     void setIsOverlapped(bool);
171     bool isOverlapped() const { return m_isOverlapped; }
172     void setContentIsOpaque(bool);
173
174     void addSlowRepaintObject();
175     void removeSlowRepaintObject();
176     bool hasSlowRepaintObjects() const { return m_slowRepaintObjectCount; }
177
178     // Includes fixed- and sticky-position objects.
179     typedef HashSet<RenderObject*> ViewportConstrainedObjectSet;
180     void addViewportConstrainedObject(RenderObject*);
181     void removeViewportConstrainedObject(RenderObject*);
182     const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); }
183     bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; }
184
185     void handleLoadCompleted();
186
187     void updateAnnotatedRegions();
188     void updateControlTints();
189
190     void restoreScrollbar();
191
192     void postLayoutTimerFired(Timer<FrameView>*);
193
194     bool wasScrolledByUser() const;
195     void setWasScrolledByUser(bool);
196
197     bool safeToPropagateScrollToParent() const { return m_safeToPropagateScrollToParent; }
198     void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; }
199
200     void addWidget(RenderWidget*);
201     void removeWidget(RenderWidget*);
202     void updateWidgetPositions();
203
204     void addWidgetToUpdate(RenderEmbeddedObject&);
205
206     virtual void paintContents(GraphicsContext*, const IntRect& damageRect) OVERRIDE;
207     void setPaintBehavior(PaintBehavior);
208     PaintBehavior paintBehavior() const;
209     bool isPainting() const;
210     bool hasEverPainted() const { return m_lastPaintTime; }
211     void setNodeToDraw(Node*);
212
213     virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) OVERRIDE;
214     virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect) OVERRIDE;
215     virtual void paintScrollbar(GraphicsContext*, Scrollbar*, const IntRect&) OVERRIDE;
216
217     Color documentBackgroundColor() const;
218
219     static double currentFrameTimeStamp() { return s_currentFrameTimeStamp; }
220
221     void updateLayoutAndStyleForPainting();
222     void updateLayoutAndStyleIfNeededRecursive();
223
224     void incrementVisuallyNonEmptyCharacterCount(unsigned);
225     void incrementVisuallyNonEmptyPixelCount(const IntSize&);
226     void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; }
227     void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize);
228
229     void forceLayout(bool allowSubtree = false);
230     void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor);
231
232     bool scrollToFragment(const KURL&);
233     bool scrollToAnchor(const String&);
234     void maintainScrollPositionAtAnchor(Node*);
235     void scrollElementToRect(Element*, const IntRect&);
236     void scrollContentsIfNeededRecursive();
237
238     // Methods to convert points and rects between the coordinate space of the renderer, and this view.
239     IntRect convertFromRenderer(const RenderObject&, const IntRect&) const;
240     IntRect convertToRenderer(const RenderObject&, const IntRect&) const;
241     IntPoint convertFromRenderer(const RenderObject&, const IntPoint&) const;
242     IntPoint convertToRenderer(const RenderObject&, const IntPoint&) const;
243
244     bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; }
245
246     bool isScrollable();
247
248     enum ScrollbarModesCalculationStrategy { RulesFromWebContentOnly, AnyRule };
249     void calculateScrollbarModesForLayoutAndSetViewportRenderer(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule);
250
251     virtual IntPoint lastKnownMousePosition() const OVERRIDE;
252     bool shouldSetCursor() const;
253
254     void setCursor(const Cursor&);
255
256     virtual bool scrollbarsCanBeActive() const OVERRIDE;
257
258     // FIXME: Remove this method once plugin loading is decoupled from layout.
259     void flushAnyPendingPostLayoutTasks();
260
261     virtual bool shouldSuspendScrollAnimations() const OVERRIDE;
262     virtual void scrollbarStyleChanged() OVERRIDE;
263
264     RenderBox* embeddedContentBox() const;
265
266     void setTracksRepaints(bool);
267     bool isTrackingRepaints() const { return m_isTrackingRepaints; }
268     void resetTrackedRepaints();
269     String trackedRepaintRectsAsText() const;
270
271     typedef HashSet<ScrollableArea*> ScrollableAreaSet;
272     // Returns whether the scrollable area has just been newly added.
273     bool addScrollableArea(ScrollableArea*);
274     // Returns whether the scrollable area has just been removed.
275     bool removeScrollableArea(ScrollableArea*);
276     const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); }
277
278     // With CSS style "resize:" enabled, a little resizer handle will appear at the bottom
279     // right of the object. We keep track of these resizer areas for checking if touches
280     // (implemented using Scroll gesture) are targeting the resizer.
281     typedef HashSet<RenderBox*> ResizerAreaSet;
282     void addResizerArea(RenderBox&);
283     void removeResizerArea(RenderBox&);
284     const ResizerAreaSet* resizerAreas() const { return m_resizerAreas.get(); }
285
286     virtual void removeChild(Widget*) OVERRIDE;
287
288     // This function exists for ports that need to handle wheel events manually.
289     // On Mac WebKit1 the underlying NSScrollView just does the scrolling, but on most other platforms
290     // we need this function in order to do the scroll ourselves.
291     bool wheelEvent(const PlatformWheelEvent&);
292
293     bool inProgrammaticScroll() const { return m_inProgrammaticScroll; }
294     void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; }
295
296     void setHasSoftwareFilters(bool hasSoftwareFilters) { m_hasSoftwareFilters = hasSoftwareFilters; }
297     bool hasSoftwareFilters() const { return m_hasSoftwareFilters; }
298
299     virtual bool isActive() const OVERRIDE;
300
301     // DEPRECATED: Use viewportConstrainedVisibleContentRect() instead.
302     IntSize scrollOffsetForFixedPosition() const;
303
304     virtual bool shouldPlaceVerticalScrollbarOnLeft() const OVERRIDE;
305
306     // Override scrollbar notifications to update the AXObject cache.
307     virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
308     virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
309
310     virtual bool shouldAttemptToScrollUsingFastPath() const OVERRIDE;
311     // FIXME: This should probably be renamed as the 'inSubtreeLayout' parameter
312     // passed around the FrameView layout methods can be true while this returns
313     // false.
314     bool isSubtreeLayout() const { return !!m_layoutSubtreeRoot; }
315
316     // Sets the tickmarks for the FrameView, overriding the default behavior
317     // which is to display the tickmarks corresponding to find results.
318     // If |m_tickmarks| is empty, the default behavior is restored.
319     void setTickmarks(const Vector<IntRect>& tickmarks) { m_tickmarks = tickmarks; }
320
321     // ScrollableArea interface
322     virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE;
323     virtual void getTickmarks(Vector<IntRect>&) const OVERRIDE;
324     virtual void scrollTo(const IntSize&) OVERRIDE;
325     virtual IntRect scrollableAreaBoundingBox() const OVERRIDE;
326     virtual bool scrollAnimatorEnabled() const OVERRIDE;
327     virtual bool usesCompositedScrolling() const OVERRIDE;
328     virtual GraphicsLayer* layerForScrolling() const OVERRIDE;
329     virtual GraphicsLayer* layerForHorizontalScrollbar() const OVERRIDE;
330     virtual GraphicsLayer* layerForVerticalScrollbar() const OVERRIDE;
331     virtual GraphicsLayer* layerForScrollCorner() const OVERRIDE;
332
333 protected:
334     virtual void scrollContentsIfNeeded();
335     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) OVERRIDE;
336     virtual void scrollContentsSlowPath(const IntRect& updateRect) OVERRIDE;
337
338     virtual bool isVerticalDocument() const OVERRIDE;
339     virtual bool isFlippedDocument() const OVERRIDE;
340
341 private:
342     explicit FrameView(LocalFrame*);
343
344     void reset();
345     void init();
346
347     virtual void frameRectsChanged() OVERRIDE;
348     virtual bool isFrameView() const OVERRIDE { return true; }
349
350     friend class RenderWidget;
351     bool useSlowRepaints(bool considerOverlap = true) const;
352     bool useSlowRepaintsIfNotOverlapped() const;
353
354     bool contentsInCompositedLayer() const;
355
356     void applyOverflowToViewportAndSetRenderer(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode);
357     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
358
359     void updateCounters();
360     void autoSizeIfEnabled();
361     void forceLayoutParentViewIfNeeded();
362     void performPreLayoutTasks();
363     void performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout);
364     void scheduleOrPerformPostLayoutTasks();
365     void performPostLayoutTasks();
366
367     void repaintTree(RenderObject* root);
368
369     void gatherDebugLayoutRects(RenderObject* layoutRoot);
370
371     DocumentLifecycle& lifecycle() const;
372
373     virtual void repaintContentRectangle(const IntRect&) OVERRIDE;
374     virtual void contentsResized() OVERRIDE;
375     virtual void scrollbarExistenceDidChange() OVERRIDE;
376
377     // Override ScrollView methods to do point conversion via renderers, in order to
378     // take transforms into account.
379     virtual IntRect convertToContainingView(const IntRect&) const OVERRIDE;
380     virtual IntRect convertFromContainingView(const IntRect&) const OVERRIDE;
381     virtual IntPoint convertToContainingView(const IntPoint&) const OVERRIDE;
382     virtual IntPoint convertFromContainingView(const IntPoint&) const OVERRIDE;
383
384     void sendResizeEventIfNeeded();
385
386     void updateScrollableAreaSet();
387
388     virtual void notifyPageThatContentAreaWillPaint() const OVERRIDE;
389
390     void scheduleUpdateWidgetsIfNecessary();
391     void updateWidgetsTimerFired(Timer<FrameView>*);
392     bool updateWidgets();
393
394     void scrollToAnchor();
395     void scrollPositionChanged();
396     void didScrollTimerFired(Timer<FrameView>*);
397
398     void updateLayersAndCompositingAfterScrollIfNeeded();
399     void updateFixedElementRepaintRectsAfterScroll();
400
401     bool hasCustomScrollbars() const;
402     bool shouldUseCustomScrollbars(Element*& customScrollbarElement, LocalFrame*& customScrollbarFrame);
403
404     virtual void updateScrollCorner() OVERRIDE;
405
406     FrameView* parentFrameView() const;
407
408     AXObjectCache* axObjectCache() const;
409     void removeFromAXObjectCache();
410
411     void setLayoutSizeInternal(const IntSize&);
412
413     bool repaintAllowed() const
414     {
415         if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled())
416             return true;
417
418         return !isInPerformLayout() || canRepaintDuringPerformLayout();
419     }
420
421     static double s_currentFrameTimeStamp; // used for detecting decoded resource thrash in the cache
422     static bool s_inPaintContents;
423
424     LayoutSize m_size;
425
426     typedef HashSet<RefPtr<RenderEmbeddedObject> > EmbeddedObjectSet;
427     EmbeddedObjectSet m_widgetUpdateSet;
428
429     // FIXME: These are just "children" of the FrameView and should be RefPtr<Widget> instead.
430     HashSet<RefPtr<RenderWidget> > m_widgets;
431
432     RefPtr<LocalFrame> m_frame;
433
434     bool m_doFullRepaint;
435
436     bool m_canHaveScrollbars;
437     bool m_cannotBlitToWindow;
438     bool m_isOverlapped;
439     bool m_contentIsOpaque;
440     unsigned m_slowRepaintObjectCount;
441
442     bool m_hasPendingLayout;
443     RenderObject* m_layoutSubtreeRoot;
444
445     bool m_layoutSchedulingEnabled;
446     bool m_inPerformLayout;
447     bool m_canRepaintDuringPerformLayout;
448     bool m_inSynchronousPostLayout;
449     int m_layoutCount;
450     unsigned m_nestedLayoutCount;
451     Timer<FrameView> m_postLayoutTasksTimer;
452     Timer<FrameView> m_updateWidgetsTimer;
453     bool m_firstLayoutCallbackPending;
454
455     bool m_firstLayout;
456     bool m_isTransparent;
457     Color m_baseBackgroundColor;
458     IntSize m_lastViewportSize;
459     float m_lastZoomFactor;
460
461     AtomicString m_mediaType;
462     AtomicString m_mediaTypeWhenNotPrinting;
463
464     bool m_overflowStatusDirty;
465     bool m_horizontalOverflow;
466     bool m_verticalOverflow;
467     RenderObject* m_viewportRenderer;
468
469     bool m_wasScrolledByUser;
470     bool m_inProgrammaticScroll;
471     bool m_safeToPropagateScrollToParent;
472
473     double m_lastPaintTime;
474
475     bool m_isTrackingRepaints; // Used for testing.
476     Vector<IntRect> m_trackedRepaintRects;
477
478     RefPtr<Node> m_nodeToDraw;
479     PaintBehavior m_paintBehavior;
480     bool m_isPainting;
481
482     unsigned m_visuallyNonEmptyCharacterCount;
483     unsigned m_visuallyNonEmptyPixelCount;
484     bool m_isVisuallyNonEmpty;
485     bool m_firstVisuallyNonEmptyLayoutCallbackPending;
486
487     RefPtr<Node> m_maintainScrollPositionAnchor;
488
489     // Renderer to hold our custom scroll corner.
490     RenderScrollbarPart* m_scrollCorner;
491
492     // If true, automatically resize the frame view around its content.
493     bool m_shouldAutoSize;
494     bool m_inAutoSize;
495     // True if autosize has been run since m_shouldAutoSize was set.
496     bool m_didRunAutosize;
497     // The lower bound on the size when autosizing.
498     IntSize m_minAutoSize;
499     // The upper bound on the size when autosizing.
500     IntSize m_maxAutoSize;
501
502     OwnPtr<ScrollableAreaSet> m_scrollableAreas;
503     OwnPtr<ResizerAreaSet> m_resizerAreas;
504     OwnPtr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects;
505
506     bool m_hasSoftwareFilters;
507
508     float m_visibleContentScaleFactor;
509     IntSize m_inputEventsOffsetForEmulation;
510     float m_inputEventsScaleFactorForEmulation;
511
512     IntSize m_layoutSize;
513     bool m_layoutSizeFixedToFrameSize;
514
515     Timer<FrameView> m_didScrollTimer;
516
517     Vector<IntRect> m_tickmarks;
518 };
519
520 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)
521 {
522     if (m_isVisuallyNonEmpty)
523         return;
524     m_visuallyNonEmptyCharacterCount += count;
525     // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout.
526     // The first few hundred characters rarely contain the interesting content of the page.
527     static const unsigned visualCharacterThreshold = 200;
528     if (m_visuallyNonEmptyCharacterCount > visualCharacterThreshold)
529         setIsVisuallyNonEmpty();
530 }
531
532 inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size)
533 {
534     if (m_isVisuallyNonEmpty)
535         return;
536     m_visuallyNonEmptyPixelCount += size.width() * size.height();
537     // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout
538     static const unsigned visualPixelThreshold = 32 * 32;
539     if (m_visuallyNonEmptyPixelCount > visualPixelThreshold)
540         setIsVisuallyNonEmpty();
541 }
542
543 DEFINE_TYPE_CASTS(FrameView, Widget, widget, widget->isFrameView(), widget.isFrameView());
544
545 class AllowRepaintScope {
546 public:
547     explicit AllowRepaintScope(FrameView* view)
548         : m_view(view)
549         , m_originalValue(view ? view->canRepaintDuringPerformLayout() : false)
550     {
551         if (!m_view)
552             return;
553
554         m_view->setCanRepaintDuringPerformLayout(true);
555     }
556
557     ~AllowRepaintScope()
558     {
559         if (!m_view)
560             return;
561
562         m_view->setCanRepaintDuringPerformLayout(m_originalValue);
563     }
564 private:
565     FrameView* m_view;
566     bool m_originalValue;
567 };
568
569 } // namespace WebCore
570
571 #endif // FrameView_h