1 /* 2 Copyright (C) 1997 Martin Jones (mjones (at) kde.org) 3 (C) 1998 Waldo Bastian (bastian (at) kde.org) 4 (C) 1998, 1999 Torben Weis (weis (at) kde.org) 5 (C) 1999 Lars Knoll (knoll (at) kde.org) 6 (C) 1999 Antti Koivisto (koivisto (at) 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 "core/rendering/PaintPhase.h" 29 #include "platform/RuntimeEnabledFeatures.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 setCanInvalidatePaintDuringPerformLayout(bool b) { m_canInvalidatePaintDuringPerformLayout = b; } 96 bool canInvalidatePaintDuringPerformLayout() const { return m_canInvalidatePaintDuringPerformLayout; } 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 needsFullPaintInvalidation() const { return m_doFullPaintInvalidation; } 115 116 void updateAcceleratedCompositingSettings(); 117 118 void recalcOverflowAfterStyleChange(); 119 120 bool hasCompositedContent() const; 121 bool isEnclosedInCompositingLayer() const; 122 123 void resetScrollbars(); 124 void prepareForDetach(); 125 void detachCustomScrollbars(); 126 virtual void recalculateScrollbarOverlayStyle(); 127 128 void clear(); 129 130 bool isTransparent() const; 131 void setTransparent(bool isTransparent); 132 133 // True if the FrameView is not transparent, and the base background color is opaque. 134 bool hasOpaqueBackground() const; 135 136 Color baseBackgroundColor() const; 137 void setBaseBackgroundColor(const Color&); 138 void updateBackgroundRecursively(const Color&, bool); 139 140 void adjustViewSize(); 141 142 virtual IntRect windowClipRect(IncludeScrollbarsInRect = ExcludeScrollbars) const OVERRIDE; 143 IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*) const; 144 145 virtual IntRect windowResizerRect() const OVERRIDE; 146 147 virtual float visibleContentScaleFactor() const OVERRIDE { return m_visibleContentScaleFactor; } 148 void setVisibleContentScaleFactor(float); 149 150 virtual float inputEventsScaleFactor() const OVERRIDE; 151 virtual IntSize inputEventsOffsetForEmulation() const OVERRIDE; 152 void setInputEventsTransformForEmulation(const IntSize&, float); 153 154 virtual void setScrollPosition(const IntPoint&) OVERRIDE; 155 virtual bool isRubberBandInProgress() const OVERRIDE; 156 void setScrollPositionNonProgrammatically(const IntPoint&); 157 158 // This is different than visibleContentRect() in that it ignores negative (or overly positive) 159 // offsets from rubber-banding, and it takes zooming into account. 160 LayoutRect viewportConstrainedVisibleContentRect() const; 161 void viewportConstrainedVisibleContentSizeChanged(bool widthChanged, bool heightChanged); 162 163 AtomicString mediaType() const; 164 void setMediaType(const AtomicString&); 165 void adjustMediaTypeForPrinting(bool printing); 166 167 void setCannotBlitToWindow(); 168 void setIsOverlapped(bool); 169 bool isOverlapped() const { return m_isOverlapped; } 170 void setContentIsOpaque(bool); 171 172 void addSlowRepaintObject(); 173 void removeSlowRepaintObject(); 174 bool hasSlowRepaintObjects() const { return m_slowRepaintObjectCount; } 175 176 // Includes fixed- and sticky-position objects. 177 typedef HashSet<RenderObject*> ViewportConstrainedObjectSet; 178 void addViewportConstrainedObject(RenderObject*); 179 void removeViewportConstrainedObject(RenderObject*); 180 const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); } 181 bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; } 182 183 void handleLoadCompleted(); 184 185 void updateAnnotatedRegions(); 186 void updateControlTints(); 187 188 void restoreScrollbar(); 189 190 void postLayoutTimerFired(Timer<FrameView>*); 191 192 bool wasScrolledByUser() const; 193 void setWasScrolledByUser(bool); 194 195 bool safeToPropagateScrollToParent() const { return m_safeToPropagateScrollToParent; } 196 void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; } 197 198 void addWidget(RenderWidget*); 199 void removeWidget(RenderWidget*); 200 void updateWidgetPositions(); 201 202 void addWidgetToUpdate(RenderEmbeddedObject&); 203 204 virtual void paintContents(GraphicsContext*, const IntRect& damageRect) OVERRIDE; 205 void setPaintBehavior(PaintBehavior); 206 PaintBehavior paintBehavior() const; 207 bool isPainting() const; 208 bool hasEverPainted() const { return m_lastPaintTime; } 209 void setNodeToDraw(Node*); 210 211 virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) OVERRIDE; 212 virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect) OVERRIDE; 213 virtual void paintScrollbar(GraphicsContext*, Scrollbar*, const IntRect&) OVERRIDE; 214 215 Color documentBackgroundColor() const; 216 217 static double currentFrameTimeStamp() { return s_currentFrameTimeStamp; } 218 219 void updateLayoutAndStyleForPainting(); 220 void updateLayoutAndStyleIfNeededRecursive(); 221 222 void incrementVisuallyNonEmptyCharacterCount(unsigned); 223 void incrementVisuallyNonEmptyPixelCount(const IntSize&); 224 void setIsVisuallyNonEmpty() { m_isVisuallyNonEmpty = true; } 225 void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize); 226 227 void forceLayout(bool allowSubtree = false); 228 void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor); 229 230 bool scrollToFragment(const KURL&); 231 bool scrollToAnchor(const String&); 232 void maintainScrollPositionAtAnchor(Node*); 233 void scrollElementToRect(Element*, const IntRect&); 234 void scrollContentsIfNeededRecursive(); 235 236 // Methods to convert points and rects between the coordinate space of the renderer, and this view. 237 IntRect convertFromRenderer(const RenderObject&, const IntRect&) const; 238 IntRect convertToRenderer(const RenderObject&, const IntRect&) const; 239 IntPoint convertFromRenderer(const RenderObject&, const IntPoint&) const; 240 IntPoint convertToRenderer(const RenderObject&, const IntPoint&) const; 241 242 bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; } 243 244 bool isScrollable(); 245 246 enum ScrollbarModesCalculationStrategy { RulesFromWebContentOnly, AnyRule }; 247 void calculateScrollbarModesForLayoutAndSetViewportRenderer(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule); 248 249 virtual IntPoint lastKnownMousePosition() const OVERRIDE; 250 bool shouldSetCursor() const; 251 252 void setCursor(const Cursor&); 253 254 virtual bool scrollbarsCanBeActive() const OVERRIDE; 255 256 // FIXME: Remove this method once plugin loading is decoupled from layout. 257 void flushAnyPendingPostLayoutTasks(); 258 259 virtual bool shouldSuspendScrollAnimations() const OVERRIDE; 260 virtual void scrollbarStyleChanged() OVERRIDE; 261 262 RenderBox* embeddedContentBox() const; 263 264 void setTracksPaintInvalidations(bool); 265 bool isTrackingPaintInvalidations() const { return m_isTrackingPaintInvalidations; } 266 void resetTrackedPaintInvalidations(); 267 String trackedPaintInvalidationRectsAsText() const; 268 269 typedef HashSet<ScrollableArea*> ScrollableAreaSet; 270 void addScrollableArea(ScrollableArea*); 271 void removeScrollableArea(ScrollableArea*); 272 const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); } 273 274 // With CSS style "resize:" enabled, a little resizer handle will appear at the bottom 275 // right of the object. We keep track of these resizer areas for checking if touches 276 // (implemented using Scroll gesture) are targeting the resizer. 277 typedef HashSet<RenderBox*> ResizerAreaSet; 278 void addResizerArea(RenderBox&); 279 void removeResizerArea(RenderBox&); 280 const ResizerAreaSet* resizerAreas() const { return m_resizerAreas.get(); } 281 282 virtual void removeChild(Widget*) OVERRIDE; 283 284 // This function exists for ports that need to handle wheel events manually. 285 // On Mac WebKit1 the underlying NSScrollView just does the scrolling, but on most other platforms 286 // we need this function in order to do the scroll ourselves. 287 bool wheelEvent(const PlatformWheelEvent&); 288 289 bool inProgrammaticScroll() const { return m_inProgrammaticScroll; } 290 void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; } 291 292 void setHasSoftwareFilters(bool hasSoftwareFilters) { m_hasSoftwareFilters = hasSoftwareFilters; } 293 bool hasSoftwareFilters() const { return m_hasSoftwareFilters; } 294 295 virtual bool isActive() const OVERRIDE; 296 297 // DEPRECATED: Use viewportConstrainedVisibleContentRect() instead. 298 IntSize scrollOffsetForFixedPosition() const; 299 300 // Override scrollbar notifications to update the AXObject cache. 301 virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE; 302 virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE; 303 304 virtual bool shouldAttemptToScrollUsingFastPath() const OVERRIDE; 305 // FIXME: This should probably be renamed as the 'inSubtreeLayout' parameter 306 // passed around the FrameView layout methods can be true while this returns 307 // false. 308 bool isSubtreeLayout() const { return !!m_layoutSubtreeRoot; } 309 310 // Sets the tickmarks for the FrameView, overriding the default behavior 311 // which is to display the tickmarks corresponding to find results. 312 // If |m_tickmarks| is empty, the default behavior is restored. 313 void setTickmarks(const Vector<IntRect>& tickmarks) { m_tickmarks = tickmarks; } 314 315 // ScrollableArea interface 316 virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) OVERRIDE; 317 virtual void getTickmarks(Vector<IntRect>&) const OVERRIDE; 318 virtual void scrollTo(const IntSize&) OVERRIDE; 319 virtual IntRect scrollableAreaBoundingBox() const OVERRIDE; 320 virtual bool scrollAnimatorEnabled() const OVERRIDE; 321 virtual bool usesCompositedScrolling() const OVERRIDE; 322 virtual GraphicsLayer* layerForScrolling() const OVERRIDE; 323 virtual GraphicsLayer* layerForHorizontalScrollbar() const OVERRIDE; 324 virtual GraphicsLayer* layerForVerticalScrollbar() const OVERRIDE; 325 virtual GraphicsLayer* layerForScrollCorner() const OVERRIDE; 326 327 protected: 328 virtual void scrollContentsIfNeeded(); 329 virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) OVERRIDE; 330 virtual void scrollContentsSlowPath(const IntRect& updateRect) OVERRIDE; 331 332 virtual bool isVerticalDocument() const OVERRIDE; 333 virtual bool isFlippedDocument() const OVERRIDE; 334 335 private: 336 explicit FrameView(LocalFrame*); 337 338 void reset(); 339 void init(); 340 341 virtual void frameRectsChanged() OVERRIDE; 342 virtual bool isFrameView() const OVERRIDE { return true; } 343 344 friend class RenderWidget; 345 bool useSlowRepaints(bool considerOverlap = true) const; 346 bool useSlowRepaintsIfNotOverlapped() const; 347 348 bool contentsInCompositedLayer() const; 349 350 void applyOverflowToViewportAndSetRenderer(RenderObject*, ScrollbarMode& hMode, ScrollbarMode& vMode); 351 void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow); 352 353 void updateCounters(); 354 void autoSizeIfEnabled(); 355 void forceLayoutParentViewIfNeeded(); 356 void performPreLayoutTasks(); 357 void performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout); 358 void scheduleOrPerformPostLayoutTasks(); 359 void performPostLayoutTasks(); 360 361 void invalidateTree(RenderObject* root); 362 363 void gatherDebugLayoutRects(RenderObject* layoutRoot); 364 365 DocumentLifecycle& lifecycle() const; 366 367 virtual void contentRectangleForPaintInvalidation(const IntRect&) OVERRIDE; 368 virtual void contentsResized() OVERRIDE; 369 virtual void scrollbarExistenceDidChange() OVERRIDE; 370 371 // Override ScrollView methods to do point conversion via renderers, in order to 372 // take transforms into account. 373 virtual IntRect convertToContainingView(const IntRect&) const OVERRIDE; 374 virtual IntRect convertFromContainingView(const IntRect&) const OVERRIDE; 375 virtual IntPoint convertToContainingView(const IntPoint&) const OVERRIDE; 376 virtual IntPoint convertFromContainingView(const IntPoint&) const OVERRIDE; 377 378 void sendResizeEventIfNeeded(); 379 380 void updateScrollableAreaSet(); 381 382 virtual void notifyPageThatContentAreaWillPaint() const OVERRIDE; 383 384 void scheduleUpdateWidgetsIfNecessary(); 385 void updateWidgetsTimerFired(Timer<FrameView>*); 386 bool updateWidgets(); 387 388 void scrollToAnchor(); 389 void scrollPositionChanged(); 390 void didScrollTimerFired(Timer<FrameView>*); 391 392 void updateLayersAndCompositingAfterScrollIfNeeded(); 393 void updateFixedElementPaintInvalidationRectsAfterScroll(); 394 395 bool hasCustomScrollbars() const; 396 bool shouldUseCustomScrollbars(Element*& customScrollbarElement, LocalFrame*& customScrollbarFrame); 397 398 virtual void updateScrollCorner() OVERRIDE; 399 400 FrameView* parentFrameView() const; 401 402 AXObjectCache* axObjectCache() const; 403 void removeFromAXObjectCache(); 404 405 void setLayoutSizeInternal(const IntSize&); 406 407 bool paintInvalidationIsAllowed() const 408 { 409 if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) 410 return true; 411 412 return !isInPerformLayout() || canInvalidatePaintDuringPerformLayout(); 413 } 414 415 static double s_currentFrameTimeStamp; // used for detecting decoded resource thrash in the cache 416 static bool s_inPaintContents; 417 418 LayoutSize m_size; 419 420 typedef HashSet<RefPtr<RenderEmbeddedObject> > EmbeddedObjectSet; 421 EmbeddedObjectSet m_widgetUpdateSet; 422 423 // FIXME: These are just "children" of the FrameView and should be RefPtr<Widget> instead. 424 HashSet<RefPtr<RenderWidget> > m_widgets; 425 426 RefPtr<LocalFrame> m_frame; 427 428 bool m_doFullPaintInvalidation; 429 430 bool m_canHaveScrollbars; 431 bool m_cannotBlitToWindow; 432 bool m_isOverlapped; 433 bool m_contentIsOpaque; 434 unsigned m_slowRepaintObjectCount; 435 436 bool m_hasPendingLayout; 437 RenderObject* m_layoutSubtreeRoot; 438 439 bool m_layoutSchedulingEnabled; 440 bool m_inPerformLayout; 441 bool m_canInvalidatePaintDuringPerformLayout; 442 bool m_inSynchronousPostLayout; 443 int m_layoutCount; 444 unsigned m_nestedLayoutCount; 445 Timer<FrameView> m_postLayoutTasksTimer; 446 Timer<FrameView> m_updateWidgetsTimer; 447 bool m_firstLayoutCallbackPending; 448 449 bool m_firstLayout; 450 bool m_isTransparent; 451 Color m_baseBackgroundColor; 452 IntSize m_lastViewportSize; 453 float m_lastZoomFactor; 454 455 AtomicString m_mediaType; 456 AtomicString m_mediaTypeWhenNotPrinting; 457 458 bool m_overflowStatusDirty; 459 bool m_horizontalOverflow; 460 bool m_verticalOverflow; 461 RenderObject* m_viewportRenderer; 462 463 bool m_wasScrolledByUser; 464 bool m_inProgrammaticScroll; 465 bool m_safeToPropagateScrollToParent; 466 467 double m_lastPaintTime; 468 469 bool m_isTrackingPaintInvalidations; // Used for testing. 470 Vector<IntRect> m_trackedPaintInvalidationRects; 471 472 RefPtrWillBePersistent<Node> m_nodeToDraw; 473 PaintBehavior m_paintBehavior; 474 bool m_isPainting; 475 476 unsigned m_visuallyNonEmptyCharacterCount; 477 unsigned m_visuallyNonEmptyPixelCount; 478 bool m_isVisuallyNonEmpty; 479 bool m_firstVisuallyNonEmptyLayoutCallbackPending; 480 481 RefPtrWillBePersistent<Node> m_maintainScrollPositionAnchor; 482 483 // Renderer to hold our custom scroll corner. 484 RenderScrollbarPart* m_scrollCorner; 485 486 // If true, automatically resize the frame view around its content. 487 bool m_shouldAutoSize; 488 bool m_inAutoSize; 489 // True if autosize has been run since m_shouldAutoSize was set. 490 bool m_didRunAutosize; 491 // The lower bound on the size when autosizing. 492 IntSize m_minAutoSize; 493 // The upper bound on the size when autosizing. 494 IntSize m_maxAutoSize; 495 496 OwnPtr<ScrollableAreaSet> m_scrollableAreas; 497 OwnPtr<ResizerAreaSet> m_resizerAreas; 498 OwnPtr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects; 499 500 bool m_hasSoftwareFilters; 501 502 float m_visibleContentScaleFactor; 503 IntSize m_inputEventsOffsetForEmulation; 504 float m_inputEventsScaleFactorForEmulation; 505 506 IntSize m_layoutSize; 507 bool m_layoutSizeFixedToFrameSize; 508 509 Timer<FrameView> m_didScrollTimer; 510 511 Vector<IntRect> m_tickmarks; 512 }; 513 514 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count) 515 { 516 if (m_isVisuallyNonEmpty) 517 return; 518 m_visuallyNonEmptyCharacterCount += count; 519 // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout. 520 // The first few hundred characters rarely contain the interesting content of the page. 521 static const unsigned visualCharacterThreshold = 200; 522 if (m_visuallyNonEmptyCharacterCount > visualCharacterThreshold) 523 setIsVisuallyNonEmpty(); 524 } 525 526 inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size) 527 { 528 if (m_isVisuallyNonEmpty) 529 return; 530 m_visuallyNonEmptyPixelCount += size.width() * size.height(); 531 // Use a threshold value to prevent very small amounts of visible content from triggering didFirstVisuallyNonEmptyLayout 532 static const unsigned visualPixelThreshold = 32 * 32; 533 if (m_visuallyNonEmptyPixelCount > visualPixelThreshold) 534 setIsVisuallyNonEmpty(); 535 } 536 537 DEFINE_TYPE_CASTS(FrameView, Widget, widget, widget->isFrameView(), widget.isFrameView()); 538 539 class AllowPaintInvalidationScope { 540 public: 541 explicit AllowPaintInvalidationScope(FrameView* view) 542 : m_view(view) 543 , m_originalValue(view ? view->canInvalidatePaintDuringPerformLayout() : false) 544 { 545 if (!m_view) 546 return; 547 548 m_view->setCanInvalidatePaintDuringPerformLayout(true); 549 } 550 551 ~AllowPaintInvalidationScope() 552 { 553 if (!m_view) 554 return; 555 556 m_view->setCanInvalidatePaintDuringPerformLayout(m_originalValue); 557 } 558 private: 559 FrameView* m_view; 560 bool m_originalValue; 561 }; 562 563 } // namespace WebCore 564 565 #endif // FrameView_h 566