Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1334)

Side by Side Diff: Source/core/rendering/RenderView.h

Issue 196533012: Make LayoutState always be RAII (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix FlexBox LayoutState scoping Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2006 Apple Computer, Inc. 3 * Copyright (C) 2006 Apple Computer, Inc.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 || (renderer.isRenderBlock() && toRenderBlock(renderer).shapeInsideI nfo()) 225 || (renderer.isRenderBlock() && toRenderBlock(renderer).shapeInsideI nfo())
226 || (m_layoutState->shapeInsideInfo() && renderer.isRenderBlock() && !toRenderBlock(renderer).allowsShapeInsideInfoSharing(&m_layoutState->shapeInsid eInfo()->owner())) 226 || (m_layoutState->shapeInsideInfo() && renderer.isRenderBlock() && !toRenderBlock(renderer).allowsShapeInsideInfoSharing(&m_layoutState->shapeInsid eInfo()->owner()))
227 ) { 227 ) {
228 pushLayoutStateForCurrentFlowThread(renderer); 228 pushLayoutStateForCurrentFlowThread(renderer);
229 m_layoutState = new LayoutState(m_layoutState, renderer, offset, pag eHeight, pageHeightChanged, colInfo); 229 m_layoutState = new LayoutState(m_layoutState, renderer, offset, pag eHeight, pageHeightChanged, colInfo);
230 return true; 230 return true;
231 } 231 }
232 return false; 232 return false;
233 } 233 }
234 234
235 void layoutContent(const LayoutState&); 235 void layoutContent();
236 #ifndef NDEBUG 236 #ifndef NDEBUG
237 void checkLayoutState(const LayoutState&); 237 void checkLayoutState();
238 #endif 238 #endif
239 239
240 void positionDialog(RenderBox*); 240 void positionDialog(RenderBox*);
241 void positionDialogs(); 241 void positionDialogs();
242 242
243 void pushLayoutStateForCurrentFlowThread(const RenderObject&); 243 void pushLayoutStateForCurrentFlowThread(const RenderObject&);
244 void popLayoutStateForCurrentFlowThread(); 244 void popLayoutStateForCurrentFlowThread();
245 245
246 friend class LayoutStateMaintainer; 246 friend class LayoutStateMaintainer;
247 friend class LayoutStateDisabler; 247 friend class LayoutStateDisabler;
248 friend class RootLayoutStateScope;
248 249
249 bool shouldUsePrintingLayout() const; 250 bool shouldUsePrintingLayout() const;
250 251
251 FrameView* m_frameView; 252 FrameView* m_frameView;
252 253
253 RenderObject* m_selectionStart; 254 RenderObject* m_selectionStart;
254 RenderObject* m_selectionEnd; 255 RenderObject* m_selectionEnd;
255 256
256 int m_selectionStartPos; 257 int m_selectionStartPos;
257 int m_selectionEndPos; 258 int m_selectionEndPos;
258 259
259 int m_maximalOutlineSize; // Used to apply a fudge factor to dirty-rect chec ks on blocks/tables. 260 int m_maximalOutlineSize; // Used to apply a fudge factor to dirty-rect chec ks on blocks/tables.
260 int m_oldMaximalOutlineSize; // The fudge factor from the previous layout. 261 int m_oldMaximalOutlineSize; // The fudge factor from the previous layout.
261 262
262 LayoutUnit m_pageLogicalHeight; 263 LayoutUnit m_pageLogicalHeight;
263 bool m_pageLogicalHeightChanged; 264 bool m_pageLogicalHeightChanged;
264 LayoutState* m_layoutState; 265 LayoutState* m_layoutState;
265 unsigned m_layoutStateDisableCount; 266 unsigned m_layoutStateDisableCount;
266 OwnPtr<RenderLayerCompositor> m_compositor; 267 OwnPtr<RenderLayerCompositor> m_compositor;
267 OwnPtr<FlowThreadController> m_flowThreadController; 268 OwnPtr<FlowThreadController> m_flowThreadController;
268 RefPtr<IntervalArena> m_intervalArena; 269 RefPtr<IntervalArena> m_intervalArena;
269 270
270 RenderQuote* m_renderQuoteHead; 271 RenderQuote* m_renderQuoteHead;
271 unsigned m_renderCounterCount; 272 unsigned m_renderCounterCount;
272 }; 273 };
273 274
274 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderView, isRenderView()); 275 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderView, isRenderView());
275 276
277 class RootLayoutStateScope {
278 public:
279 explicit RootLayoutStateScope(RenderView& view)
280 : m_view(view)
281 {
282 ASSERT(!m_view.m_layoutState);
283 initializeLayoutState();
284 m_view.m_layoutState = &m_rootLayoutState;
285 }
286
287 ~RootLayoutStateScope()
288 {
289 ASSERT(m_view.m_layoutState == &m_rootLayoutState);
290 m_view.m_layoutState = 0;
291 }
292 private:
293 void initializeLayoutState();
294 RenderView& m_view;
295 LayoutState m_rootLayoutState;
296 };
297
276 // Stack-based class to assist with LayoutState push/pop 298 // Stack-based class to assist with LayoutState push/pop
277 class LayoutStateMaintainer { 299 class LayoutStateMaintainer {
278 WTF_MAKE_NONCOPYABLE(LayoutStateMaintainer); 300 WTF_MAKE_NONCOPYABLE(LayoutStateMaintainer);
279 public: 301 public:
280 // ctor to push now 302 // ctor to push now
281 explicit LayoutStateMaintainer(RenderBox& root, const LayoutSize& offset, La youtUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0 ) 303 explicit LayoutStateMaintainer(RenderBox& root, const LayoutSize& offset, La youtUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0 )
282 : m_view(*root.view()) 304 : m_view(*root.view())
283 , m_disabled(root.shouldDisableLayoutState()) 305 , m_disabled(root.shouldDisableLayoutState())
284 , m_didStart(false) 306 , m_didStart(false)
285 , m_didEnd(false) 307 , m_didEnd(false)
286 , m_didCreateLayoutState(false) 308 , m_didCreateLayoutState(false)
287 { 309 {
288 push(root, offset, pageHeight, pageHeightChanged, colInfo); 310 push(root, offset, pageHeight, pageHeightChanged, colInfo);
289 } 311 }
290 312
291 // ctor to maybe push later 313 // ctor to maybe push later
292 explicit LayoutStateMaintainer(RenderBox& root) 314 explicit LayoutStateMaintainer(RenderBox& root)
293 : m_view(*root.view()) 315 : m_view(*root.view())
294 , m_disabled(false) 316 , m_disabled(false)
295 , m_didStart(false) 317 , m_didStart(false)
296 , m_didEnd(false) 318 , m_didEnd(false)
297 , m_didCreateLayoutState(false) 319 , m_didCreateLayoutState(false)
298 { 320 {
299 } 321 }
300 322
301 ~LayoutStateMaintainer() 323 ~LayoutStateMaintainer()
302 { 324 {
325 if (m_didStart)
326 pop();
303 ASSERT(m_didStart == m_didEnd); // if this fires, it means that someon e did a push(), but forgot to pop(). 327 ASSERT(m_didStart == m_didEnd); // if this fires, it means that someon e did a push(), but forgot to pop().
304 } 328 }
305 329
306 void push(RenderBox& root, const LayoutSize& offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0) 330 void push(RenderBox& root, const LayoutSize& offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
307 { 331 {
308 ASSERT(!m_didStart); 332 ASSERT(!m_didStart);
309 // We push state even if disabled, because we still need to store layout Delta 333 // We push state even if disabled, because we still need to store layout Delta
310 m_didCreateLayoutState = m_view.pushLayoutState(root, offset, pageHeight , pageHeightChanged, colInfo); 334 m_didCreateLayoutState = m_view.pushLayoutState(root, offset, pageHeight , pageHeightChanged, colInfo);
311 if (m_disabled && m_didCreateLayoutState) 335 if (m_disabled && m_didCreateLayoutState)
312 m_view.disableLayoutState(); 336 m_view.disableLayoutState();
313 m_didStart = true; 337 m_didStart = true;
314 } 338 }
315 339
316 void pop()
317 {
318 if (m_didStart) {
319 ASSERT(!m_didEnd);
320 if (m_didCreateLayoutState) {
321 m_view.popLayoutState();
322 if (m_disabled)
323 m_view.enableLayoutState();
324 }
325
326 m_didEnd = true;
327 }
328 }
329
330 bool didPush() const { return m_didStart; } 340 bool didPush() const { return m_didStart; }
331 341
332 private: 342 private:
343 void pop()
344 {
345 ASSERT(m_didStart && !m_didEnd);
346 if (m_didCreateLayoutState) {
347 m_view.popLayoutState();
348 if (m_disabled)
349 m_view.enableLayoutState();
350 }
351
352 m_didEnd = true;
353 }
354
333 RenderView& m_view; 355 RenderView& m_view;
334 bool m_disabled : 1; // true if the offset and clip part of layoutSta te is disabled 356 bool m_disabled : 1; // true if the offset and clip part of layoutSta te is disabled
335 bool m_didStart : 1; // true if we did a push or disable 357 bool m_didStart : 1; // true if we did a push or disable
336 bool m_didEnd : 1; // true if we popped or re-enabled 358 bool m_didEnd : 1; // true if we popped or re-enabled
337 bool m_didCreateLayoutState : 1; // true if we actually made a layout state. 359 bool m_didCreateLayoutState : 1; // true if we actually made a layout state.
338 }; 360 };
339 361
340 class LayoutStateDisabler { 362 class LayoutStateDisabler {
341 WTF_MAKE_NONCOPYABLE(LayoutStateDisabler); 363 WTF_MAKE_NONCOPYABLE(LayoutStateDisabler);
342 public: 364 public:
343 LayoutStateDisabler(const RenderBox& root) 365 LayoutStateDisabler(const RenderBox& root)
344 : m_view(*root.view()) 366 : m_view(*root.view())
345 { 367 {
346 m_view.disableLayoutState(); 368 m_view.disableLayoutState();
347 } 369 }
348 370
349 ~LayoutStateDisabler() 371 ~LayoutStateDisabler()
350 { 372 {
351 m_view.enableLayoutState(); 373 m_view.enableLayoutState();
352 } 374 }
353 private: 375 private:
354 RenderView& m_view; 376 RenderView& m_view;
355 }; 377 };
356 378
357 } // namespace WebCore 379 } // namespace WebCore
358 380
359 #endif // RenderView_h 381 #endif // RenderView_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698