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

Side by Side Diff: Source/core/page/Page.cpp

Issue 336553003: Change Page::m_mainFrame to be a Frame. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 6 years, 6 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
« no previous file with comments | « Source/core/page/Page.h ('k') | Source/core/page/PageAnimator.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All R ights Reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All R ights Reserved.
3 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 3 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
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 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 16 matching lines...) Expand all
27 #include "core/editing/Caret.h" 27 #include "core/editing/Caret.h"
28 #include "core/editing/UndoStack.h" 28 #include "core/editing/UndoStack.h"
29 #include "core/events/Event.h" 29 #include "core/events/Event.h"
30 #include "core/fetch/ResourceFetcher.h" 30 #include "core/fetch/ResourceFetcher.h"
31 #include "core/frame/DOMTimer.h" 31 #include "core/frame/DOMTimer.h"
32 #include "core/frame/DOMWindow.h" 32 #include "core/frame/DOMWindow.h"
33 #include "core/frame/EventHandlerRegistry.h" 33 #include "core/frame/EventHandlerRegistry.h"
34 #include "core/frame/FrameHost.h" 34 #include "core/frame/FrameHost.h"
35 #include "core/frame/FrameView.h" 35 #include "core/frame/FrameView.h"
36 #include "core/frame/LocalFrame.h" 36 #include "core/frame/LocalFrame.h"
37 #include "core/frame/RemoteFrame.h"
38 #include "core/frame/RemoteFrameView.h"
37 #include "core/frame/Settings.h" 39 #include "core/frame/Settings.h"
38 #include "core/inspector/InspectorController.h" 40 #include "core/inspector/InspectorController.h"
39 #include "core/inspector/InspectorInstrumentation.h" 41 #include "core/inspector/InspectorInstrumentation.h"
40 #include "core/loader/FrameLoader.h" 42 #include "core/loader/FrameLoader.h"
41 #include "core/loader/HistoryItem.h" 43 #include "core/loader/HistoryItem.h"
42 #include "core/page/AutoscrollController.h" 44 #include "core/page/AutoscrollController.h"
43 #include "core/page/Chrome.h" 45 #include "core/page/Chrome.h"
44 #include "core/page/ChromeClient.h" 46 #include "core/page/ChromeClient.h"
45 #include "core/page/ContextMenuController.h" 47 #include "core/page/ContextMenuController.h"
46 #include "core/page/DragController.h" 48 #include "core/page/DragController.h"
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 } 156 }
155 157
156 void Page::makeOrdinary() 158 void Page::makeOrdinary()
157 { 159 {
158 ASSERT(!ordinaryPages().contains(this)); 160 ASSERT(!ordinaryPages().contains(this));
159 ordinaryPages().add(this); 161 ordinaryPages().add(this);
160 } 162 }
161 163
162 ViewportDescription Page::viewportDescription() const 164 ViewportDescription Page::viewportDescription() const
163 { 165 {
164 return mainFrame() && mainFrame()->document() ? mainFrame()->document()->vie wportDescription() : ViewportDescription(); 166 return mainFrame() && mainFrame()->isLocalFrame() && deprecatedLocalMainFram e()->document() ? deprecatedLocalMainFrame()->document()->viewportDescription() : ViewportDescription();
165 } 167 }
166 168
167 ScrollingCoordinator* Page::scrollingCoordinator() 169 ScrollingCoordinator* Page::scrollingCoordinator()
168 { 170 {
169 if (!m_scrollingCoordinator && m_settings->acceleratedCompositingEnabled()) 171 if (!m_scrollingCoordinator && m_settings->acceleratedCompositingEnabled())
170 m_scrollingCoordinator = ScrollingCoordinator::create(this); 172 m_scrollingCoordinator = ScrollingCoordinator::create(this);
171 173
172 return m_scrollingCoordinator.get(); 174 return m_scrollingCoordinator.get();
173 } 175 }
174 176
175 String Page::mainThreadScrollingReasonsAsText() 177 String Page::mainThreadScrollingReasonsAsText()
176 { 178 {
177 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator( )) 179 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator( ))
178 return scrollingCoordinator->mainThreadScrollingReasonsAsText(); 180 return scrollingCoordinator->mainThreadScrollingReasonsAsText();
179 181
180 return String(); 182 return String();
181 } 183 }
182 184
183 PassRefPtrWillBeRawPtr<ClientRectList> Page::nonFastScrollableRects(const LocalF rame* frame) 185 PassRefPtrWillBeRawPtr<ClientRectList> Page::nonFastScrollableRects(const LocalF rame* frame)
184 { 186 {
185 if (Document* document = m_mainFrame->document()) 187 if (m_mainFrame->isLocalFrame() && deprecatedLocalMainFrame()->document())
186 document->updateLayout(); 188 deprecatedLocalMainFrame()->document()->updateLayout();
187 189
188 Vector<IntRect> rects; 190 Vector<IntRect> rects;
189 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator( )) 191 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator( ))
190 rects = scrollingCoordinator->computeShouldHandleScrollGestureOnMainThre adRegion(frame, IntPoint()).rects(); 192 rects = scrollingCoordinator->computeShouldHandleScrollGestureOnMainThre adRegion(frame, IntPoint()).rects();
191 193
192 Vector<FloatQuad> quads(rects.size()); 194 Vector<FloatQuad> quads(rects.size());
193 for (size_t i = 0; i < rects.size(); ++i) 195 for (size_t i = 0; i < rects.size(); ++i)
194 quads[i] = FloatRect(rects[i]); 196 quads[i] = FloatRect(rects[i]);
195 return ClientRectList::create(quads); 197 return ClientRectList::create(quads);
196 } 198 }
197 199
198 void Page::setMainFrame(PassRefPtr<LocalFrame> mainFrame) 200 void Page::setMainFrame(PassRefPtr<Frame> mainFrame)
199 { 201 {
200 ASSERT(!m_mainFrame); // Should only be called during initialization 202 ASSERT(!m_mainFrame); // Should only be called during initialization
201 m_mainFrame = mainFrame; 203 m_mainFrame = mainFrame;
202 } 204 }
203 205
204 void Page::documentDetached(Document* document) 206 void Page::documentDetached(Document* document)
205 { 207 {
206 m_multisamplingChangedObservers.clear(); 208 m_multisamplingChangedObservers.clear();
207 m_pointerLockController->documentDetached(document); 209 m_pointerLockController->documentDetached(document);
208 m_contextMenuController->documentDetached(document); 210 m_contextMenuController->documentDetached(document);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 framesNeedingReload.append(toLocalFrame(frame)); 278 framesNeedingReload.append(toLocalFrame(frame));
277 } 279 }
278 } 280 }
279 281
280 for (size_t i = 0; i < framesNeedingReload.size(); ++i) 282 for (size_t i = 0; i < framesNeedingReload.size(); ++i)
281 framesNeedingReload[i]->loader().reload(); 283 framesNeedingReload[i]->loader().reload();
282 } 284 }
283 285
284 PluginData* Page::pluginData() const 286 PluginData* Page::pluginData() const
285 { 287 {
286 if (!mainFrame()->loader().allowPlugins(NotAboutToInstantiatePlugin)) 288 if (!deprecatedLocalMainFrame()->loader().allowPlugins(NotAboutToInstantiate Plugin))
287 return 0; 289 return 0;
288 if (!m_pluginData) 290 if (!m_pluginData)
289 m_pluginData = PluginData::create(this); 291 m_pluginData = PluginData::create(this);
290 return m_pluginData.get(); 292 return m_pluginData.get();
291 } 293 }
292 294
293 static Frame* incrementFrame(Frame* curr, bool forward, bool wrapFlag) 295 static Frame* incrementFrame(Frame* curr, bool forward, bool wrapFlag)
294 { 296 {
295 return forward 297 return forward
296 ? curr->tree().traverseNextWithWrap(wrapFlag) 298 ? curr->tree().traverseNextWithWrap(wrapFlag)
(...skipping 25 matching lines...) Expand all
322 324
323 m_defersLoading = defers; 325 m_defersLoading = defers;
324 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext() ) { 326 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext() ) {
325 if (frame->isLocalFrame()) 327 if (frame->isLocalFrame())
326 toLocalFrame(frame)->loader().setDefersLoading(defers); 328 toLocalFrame(frame)->loader().setDefersLoading(defers);
327 } 329 }
328 } 330 }
329 331
330 void Page::setPageScaleFactor(float scale, const IntPoint& origin) 332 void Page::setPageScaleFactor(float scale, const IntPoint& origin)
331 { 333 {
332 FrameView* view = mainFrame()->view(); 334 if (!mainFrame()->isLocalFrame())
335 return;
336
337 FrameView* view = deprecatedLocalMainFrame()->view();
333 PinchViewport& viewport = frameHost().pinchViewport(); 338 PinchViewport& viewport = frameHost().pinchViewport();
334 339
335 if (scale != viewport.scale()) { 340 if (scale != viewport.scale()) {
336 viewport.setScale(scale); 341 viewport.setScale(scale);
337 342
338 if (view && !settings().pinchVirtualViewportEnabled()) 343 if (view && !settings().pinchVirtualViewportEnabled())
339 view->setVisibleContentScaleFactor(scale); 344 view->setVisibleContentScaleFactor(scale);
340 345
341 mainFrame()->deviceOrPageScaleFactorChanged(); 346 deprecatedLocalMainFrame()->deviceOrPageScaleFactorChanged();
342 m_chrome->client().deviceOrPageScaleFactorChanged(); 347 m_chrome->client().deviceOrPageScaleFactorChanged();
343 348
344 // FIXME: In virtual-viewport pinch mode, scale doesn't change the fixed -pos viewport; 349 // FIXME: In virtual-viewport pinch mode, scale doesn't change the fixed -pos viewport;
345 // remove once it's the only pinch mode in town. 350 // remove once it's the only pinch mode in town.
346 if (view) 351 if (view)
347 view->viewportConstrainedVisibleContentSizeChanged(true, true); 352 view->viewportConstrainedVisibleContentSizeChanged(true, true);
348 353
349 mainFrame()->loader().saveScrollState(); 354 deprecatedLocalMainFrame()->loader().saveScrollState();
350 } 355 }
351 356
352 if (view && view->scrollPosition() != origin) 357 if (view && view->scrollPosition() != origin)
353 view->notifyScrollPositionChanged(origin); 358 view->notifyScrollPositionChanged(origin);
354 } 359 }
355 360
356 float Page::pageScaleFactor() const 361 float Page::pageScaleFactor() const
357 { 362 {
358 return frameHost().pinchViewport().scale(); 363 return frameHost().pinchViewport().scale();
359 } 364 }
360 365
361 void Page::setDeviceScaleFactor(float scaleFactor) 366 void Page::setDeviceScaleFactor(float scaleFactor)
362 { 367 {
363 if (m_deviceScaleFactor == scaleFactor) 368 if (m_deviceScaleFactor == scaleFactor)
364 return; 369 return;
365 370
366 m_deviceScaleFactor = scaleFactor; 371 m_deviceScaleFactor = scaleFactor;
367 setNeedsRecalcStyleInAllFrames(); 372 setNeedsRecalcStyleInAllFrames();
368 373
369 if (mainFrame()) { 374 if (mainFrame() && mainFrame()->isLocalFrame()) {
370 mainFrame()->deviceOrPageScaleFactorChanged(); 375 deprecatedLocalMainFrame()->deviceOrPageScaleFactorChanged();
371 m_chrome->client().deviceOrPageScaleFactorChanged(); 376 m_chrome->client().deviceOrPageScaleFactorChanged();
372 } 377 }
373 } 378 }
374 379
375 void Page::allVisitedStateChanged() 380 void Page::allVisitedStateChanged()
376 { 381 {
377 HashSet<Page*>::iterator pagesEnd = ordinaryPages().end(); 382 HashSet<Page*>::iterator pagesEnd = ordinaryPages().end();
378 for (HashSet<Page*>::iterator it = ordinaryPages().begin(); it != pagesEnd; ++it) { 383 for (HashSet<Page*>::iterator it = ordinaryPages().begin(); it != pagesEnd; ++it) {
379 Page* page = *it; 384 Page* page = *it;
380 for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree( ).traverseNext()) { 385 for (Frame* frame = page->m_mainFrame.get(); frame; frame = frame->tree( ).traverseNext()) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 m_visibilityState = visibilityState; 445 m_visibilityState = visibilityState;
441 446
442 if (visibilityState == WebCore::PageVisibilityStateHidden) 447 if (visibilityState == WebCore::PageVisibilityStateHidden)
443 setTimerAlignmentInterval(DOMTimer::hiddenPageAlignmentInterval()); 448 setTimerAlignmentInterval(DOMTimer::hiddenPageAlignmentInterval());
444 else 449 else
445 setTimerAlignmentInterval(DOMTimer::visiblePageAlignmentInterval()); 450 setTimerAlignmentInterval(DOMTimer::visiblePageAlignmentInterval());
446 451
447 if (!isInitialState) 452 if (!isInitialState)
448 lifecycleNotifier().notifyPageVisibilityChanged(); 453 lifecycleNotifier().notifyPageVisibilityChanged();
449 454
450 if (!isInitialState && m_mainFrame) 455 if (!isInitialState && m_mainFrame && m_mainFrame->isLocalFrame())
451 m_mainFrame->didChangeVisibilityState(); 456 deprecatedLocalMainFrame()->didChangeVisibilityState();
452 } 457 }
453 458
454 PageVisibilityState Page::visibilityState() const 459 PageVisibilityState Page::visibilityState() const
455 { 460 {
456 return m_visibilityState; 461 return m_visibilityState;
457 } 462 }
458 463
459 bool Page::isCursorVisible() const 464 bool Page::isCursorVisible() const
460 { 465 {
461 return m_isCursorVisible && settings().deviceSupportsMouse(); 466 return m_isCursorVisible && settings().deviceSupportsMouse();
462 } 467 }
463 468
464 void Page::addMultisamplingChangedObserver(MultisamplingChangedObserver* observe r) 469 void Page::addMultisamplingChangedObserver(MultisamplingChangedObserver* observe r)
465 { 470 {
466 m_multisamplingChangedObservers.add(observer); 471 m_multisamplingChangedObservers.add(observer);
467 } 472 }
468 473
469 void Page::removeMultisamplingChangedObserver(MultisamplingChangedObserver* obse rver) 474 void Page::removeMultisamplingChangedObserver(MultisamplingChangedObserver* obse rver)
470 { 475 {
471 m_multisamplingChangedObservers.remove(observer); 476 m_multisamplingChangedObservers.remove(observer);
472 } 477 }
473 478
474 void Page::settingsChanged(SettingsDelegate::ChangeType changeType) 479 void Page::settingsChanged(SettingsDelegate::ChangeType changeType)
475 { 480 {
476 switch (changeType) { 481 switch (changeType) {
477 case SettingsDelegate::StyleChange: 482 case SettingsDelegate::StyleChange:
478 setNeedsRecalcStyleInAllFrames(); 483 setNeedsRecalcStyleInAllFrames();
479 break; 484 break;
480 case SettingsDelegate::ViewportDescriptionChange: 485 case SettingsDelegate::ViewportDescriptionChange:
481 if (mainFrame()) 486 if (mainFrame() && mainFrame()->isLocalFrame())
482 mainFrame()->document()->updateViewportDescription(); 487 deprecatedLocalMainFrame()->document()->updateViewportDescription();
483 break; 488 break;
484 case SettingsDelegate::MediaTypeChange: 489 case SettingsDelegate::MediaTypeChange:
485 m_mainFrame->view()->setMediaType(AtomicString(settings().mediaTypeOverr ide())); 490 if (m_mainFrame->isLocalFrame()) {
486 setNeedsRecalcStyleInAllFrames(); 491 deprecatedLocalMainFrame()->view()->setMediaType(AtomicString(settin gs().mediaTypeOverride()));
492 setNeedsRecalcStyleInAllFrames();
493 }
487 break; 494 break;
488 case SettingsDelegate::DNSPrefetchingChange: 495 case SettingsDelegate::DNSPrefetchingChange:
489 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNe xt()) { 496 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNe xt()) {
490 if (frame->isLocalFrame()) 497 if (frame->isLocalFrame())
491 toLocalFrame(frame)->document()->initDNSPrefetch(); 498 toLocalFrame(frame)->document()->initDNSPrefetch();
492 } 499 }
493 break; 500 break;
494 case SettingsDelegate::MultisamplingChange: { 501 case SettingsDelegate::MultisamplingChange: {
495 WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserver> > ::iterator stop = m_multisamplingChangedObservers.end(); 502 WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserver> > ::iterator stop = m_multisamplingChangedObservers.end();
496 for (WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserv er> >::iterator it = m_multisamplingChangedObservers.begin(); it != stop; ++it) 503 for (WillBeHeapHashSet<RawPtrWillBeWeakMember<MultisamplingChangedObserv er> >::iterator it = m_multisamplingChangedObservers.begin(); it != stop; ++it)
497 (*it)->multisamplingChanged(m_settings->openGLMultisamplingEnabled() ); 504 (*it)->multisamplingChanged(m_settings->openGLMultisamplingEnabled() );
498 break; 505 break;
499 } 506 }
500 case SettingsDelegate::ImageLoadingChange: 507 case SettingsDelegate::ImageLoadingChange:
501 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNe xt()) { 508 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNe xt()) {
502 if (frame->isLocalFrame()) { 509 if (frame->isLocalFrame()) {
503 toLocalFrame(frame)->document()->fetcher()->setImagesEnabled(set tings().imagesEnabled()); 510 toLocalFrame(frame)->document()->fetcher()->setImagesEnabled(set tings().imagesEnabled());
504 toLocalFrame(frame)->document()->fetcher()->setAutoLoadImages(se ttings().loadsImagesAutomatically()); 511 toLocalFrame(frame)->document()->fetcher()->setAutoLoadImages(se ttings().loadsImagesAutomatically());
505 } 512 }
506 } 513 }
507 break; 514 break;
508 case SettingsDelegate::TextAutosizingChange: 515 case SettingsDelegate::TextAutosizingChange:
509 if (!mainFrame()) 516 if (!mainFrame() || !mainFrame()->isLocalFrame())
510 break; 517 break;
511 if (FastTextAutosizer* textAutosizer = mainFrame()->document()->fastText Autosizer()) { 518 if (FastTextAutosizer* textAutosizer = deprecatedLocalMainFrame()->docum ent()->fastTextAutosizer()) {
512 textAutosizer->updatePageInfoInAllFrames(); 519 textAutosizer->updatePageInfoInAllFrames();
513 } else { 520 } else {
514 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traver seNext()) { 521 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traver seNext()) {
515 if (!frame->isLocalFrame()) 522 if (!frame->isLocalFrame())
516 continue; 523 continue;
517 if (TextAutosizer* textAutosizer = toLocalFrame(frame)->document ()->textAutosizer()) 524 if (TextAutosizer* textAutosizer = toLocalFrame(frame)->document ()->textAutosizer())
518 textAutosizer->recalculateMultipliers(); 525 textAutosizer->recalculateMultipliers();
519 } 526 }
520 // TextAutosizing updates RenderStyle during layout phase (via TextA utosizer::processSubtree). 527 // TextAutosizing updates RenderStyle during layout phase (via TextA utosizer::processSubtree).
521 // We should invoke setNeedsLayout here. 528 // We should invoke setNeedsLayout here.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 visitor->trace(m_multisamplingChangedObservers); 597 visitor->trace(m_multisamplingChangedObservers);
591 visitor->trace(m_frameHost); 598 visitor->trace(m_frameHost);
592 WillBeHeapSupplementable<Page>::trace(visitor); 599 WillBeHeapSupplementable<Page>::trace(visitor);
593 } 600 }
594 601
595 void Page::willBeDestroyed() 602 void Page::willBeDestroyed()
596 { 603 {
597 // Disable all agents prior to resetting the frame view. 604 // Disable all agents prior to resetting the frame view.
598 m_inspectorController->willBeDestroyed(); 605 m_inspectorController->willBeDestroyed();
599 606
600 m_mainFrame->setView(nullptr); 607 if (m_mainFrame->isLocalFrame()) {
608 toLocalFrame(m_mainFrame.get())->setView(nullptr);
609 } else {
610 ASSERT(m_mainFrame->isRemoteFrame());
611 toRemoteFrame(m_mainFrame.get())->setView(nullptr);
612 }
601 613
602 allPages().remove(this); 614 allPages().remove(this);
603 if (ordinaryPages().contains(this)) 615 if (ordinaryPages().contains(this))
604 ordinaryPages().remove(this); 616 ordinaryPages().remove(this);
605 617
606 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext() ) { 618 for (Frame* frame = mainFrame(); frame; frame = frame->tree().traverseNext() ) {
607 if (frame->isLocalFrame()) 619 if (frame->isLocalFrame())
608 toLocalFrame(frame)->loader().frameDetached(); 620 toLocalFrame(frame)->loader().frameDetached();
609 } 621 }
610 622
(...skipping 21 matching lines...) Expand all
632 , spellCheckerClient(0) 644 , spellCheckerClient(0)
633 , storageClient(0) 645 , storageClient(0)
634 { 646 {
635 } 647 }
636 648
637 Page::PageClients::~PageClients() 649 Page::PageClients::~PageClients()
638 { 650 {
639 } 651 }
640 652
641 } // namespace WebCore 653 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/page/Page.h ('k') | Source/core/page/PageAnimator.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698