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

Side by Side Diff: third_party/WebKit/Source/core/input/EventHandler.cpp

Issue 2858963002: Replace ASSERT with DCHECK in core/ (Closed)
Patch Set: WorkerBackingThread Created 3 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 enum NoCursorChangeType { kNoCursorChange }; 161 enum NoCursorChangeType { kNoCursorChange };
162 162
163 class OptionalCursor { 163 class OptionalCursor {
164 public: 164 public:
165 OptionalCursor(NoCursorChangeType) : is_cursor_change_(false) {} 165 OptionalCursor(NoCursorChangeType) : is_cursor_change_(false) {}
166 OptionalCursor(const Cursor& cursor) 166 OptionalCursor(const Cursor& cursor)
167 : is_cursor_change_(true), cursor_(cursor) {} 167 : is_cursor_change_(true), cursor_(cursor) {}
168 168
169 bool IsCursorChange() const { return is_cursor_change_; } 169 bool IsCursorChange() const { return is_cursor_change_; }
170 const Cursor& GetCursor() const { 170 const Cursor& GetCursor() const {
171 ASSERT(is_cursor_change_); 171 DCHECK(is_cursor_change_);
172 return cursor_; 172 return cursor_;
173 } 173 }
174 174
175 private: 175 private:
176 bool is_cursor_change_; 176 bool is_cursor_change_;
177 Cursor cursor_; 177 Cursor cursor_;
178 }; 178 };
179 179
180 EventHandler::EventHandler(LocalFrame& frame) 180 EventHandler::EventHandler(LocalFrame& frame)
181 : frame_(frame), 181 : frame_(frame),
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 } 361 }
362 362
363 bool EventHandler::UseHandCursor(Node* node, bool is_over_link) { 363 bool EventHandler::UseHandCursor(Node* node, bool is_over_link) {
364 if (!node) 364 if (!node)
365 return false; 365 return false;
366 366
367 return ((is_over_link || IsSubmitImage(node)) && !HasEditableStyle(*node)); 367 return ((is_over_link || IsSubmitImage(node)) && !HasEditableStyle(*node));
368 } 368 }
369 369
370 void EventHandler::CursorUpdateTimerFired(TimerBase*) { 370 void EventHandler::CursorUpdateTimerFired(TimerBase*) {
371 ASSERT(frame_); 371 DCHECK(frame_);
372 ASSERT(frame_->GetDocument()); 372 DCHECK(frame_->GetDocument());
373 373
374 UpdateCursor(); 374 UpdateCursor();
375 } 375 }
376 376
377 void EventHandler::UpdateCursor() { 377 void EventHandler::UpdateCursor() {
378 TRACE_EVENT0("input", "EventHandler::updateCursor"); 378 TRACE_EVENT0("input", "EventHandler::updateCursor");
379 379
380 // We must do a cross-frame hit test because the frame that triggered the 380 // We must do a cross-frame hit test because the frame that triggered the
381 // cursor update could be occluded by a different frame. 381 // cursor update could be occluded by a different frame.
382 DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); 382 DCHECK_EQ(frame_, &frame_->LocalFrameRoot());
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
785 page->GetChromeClient().ClearToolTip(*frame_); 785 page->GetChromeClient().ClearToolTip(*frame_);
786 HandleMouseMoveOrLeaveEvent(event, Vector<WebMouseEvent>(), 0, false, true); 786 HandleMouseMoveOrLeaveEvent(event, Vector<WebMouseEvent>(), 0, false, true);
787 } 787 }
788 788
789 WebInputEventResult EventHandler::HandleMouseMoveOrLeaveEvent( 789 WebInputEventResult EventHandler::HandleMouseMoveOrLeaveEvent(
790 const WebMouseEvent& mouse_event, 790 const WebMouseEvent& mouse_event,
791 const Vector<WebMouseEvent>& coalesced_events, 791 const Vector<WebMouseEvent>& coalesced_events,
792 HitTestResult* hovered_node, 792 HitTestResult* hovered_node,
793 bool only_update_scrollbars, 793 bool only_update_scrollbars,
794 bool force_leave) { 794 bool force_leave) {
795 ASSERT(frame_); 795 DCHECK(frame_);
796 ASSERT(frame_->View()); 796 DCHECK(frame_->View());
797 797
798 mouse_event_manager_->SetLastKnownMousePosition(mouse_event); 798 mouse_event_manager_->SetLastKnownMousePosition(mouse_event);
799 799
800 hover_timer_.Stop(); 800 hover_timer_.Stop();
801 cursor_update_timer_.Stop(); 801 cursor_update_timer_.Stop();
802 802
803 mouse_event_manager_->CancelFakeMouseMoveEvent(); 803 mouse_event_manager_->CancelFakeMouseMoveEvent();
804 mouse_event_manager_->HandleSvgPanIfNeeded(false); 804 mouse_event_manager_->HandleSvgPanIfNeeded(false);
805 805
806 if (frame_set_being_resized_) { 806 if (frame_set_being_resized_) {
807 return UpdatePointerTargetAndDispatchEvents( 807 return UpdatePointerTargetAndDispatchEvents(
808 EventTypeNames::mousemove, frame_set_being_resized_.Get(), String(), 808 EventTypeNames::mousemove, frame_set_being_resized_.Get(), String(),
809 mouse_event, coalesced_events); 809 mouse_event, coalesced_events);
810 } 810 }
811 811
812 // Send events right to a scrollbar if the mouse is pressed. 812 // Send events right to a scrollbar if the mouse is pressed.
813 if (last_scrollbar_under_mouse_ && mouse_event_manager_->MousePressed()) { 813 if (last_scrollbar_under_mouse_ && mouse_event_manager_->MousePressed()) {
814 last_scrollbar_under_mouse_->MouseMoved(mouse_event); 814 last_scrollbar_under_mouse_->MouseMoved(mouse_event);
815 return WebInputEventResult::kHandledSystem; 815 return WebInputEventResult::kHandledSystem;
816 } 816 }
817 817
818 // Mouse events simulated from touch should not hit-test again. 818 // Mouse events simulated from touch should not hit-test again.
819 ASSERT(!mouse_event.FromTouch()); 819 DCHECK(!mouse_event.FromTouch());
820 820
821 HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kMove; 821 HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kMove;
822 if (mouse_event_manager_->MousePressed()) { 822 if (mouse_event_manager_->MousePressed()) {
823 hit_type |= HitTestRequest::kActive; 823 hit_type |= HitTestRequest::kActive;
824 } else if (only_update_scrollbars) { 824 } else if (only_update_scrollbars) {
825 // Mouse events should be treated as "read-only" if we're updating only 825 // Mouse events should be treated as "read-only" if we're updating only
826 // scrollbars. This means that :hover and :active freeze in the state they 826 // scrollbars. This means that :hover and :active freeze in the state they
827 // were in, rather than updating for nodes the mouse moves while the window 827 // were in, rather than updating for nodes the mouse moves while the window
828 // is not key (which will be the case if onlyUpdateScrollbars is true). 828 // is not key (which will be the case if onlyUpdateScrollbars is true).
829 hit_type |= HitTestRequest::kReadOnly; 829 hit_type |= HitTestRequest::kReadOnly;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 951
952 if (last_scrollbar_under_mouse_) { 952 if (last_scrollbar_under_mouse_) {
953 mouse_event_manager_->InvalidateClick(); 953 mouse_event_manager_->InvalidateClick();
954 last_scrollbar_under_mouse_->MouseUp(mouse_event); 954 last_scrollbar_under_mouse_->MouseUp(mouse_event);
955 return UpdatePointerTargetAndDispatchEvents( 955 return UpdatePointerTargetAndDispatchEvents(
956 EventTypeNames::mouseup, mouse_event_manager_->GetNodeUnderMouse(), 956 EventTypeNames::mouseup, mouse_event_manager_->GetNodeUnderMouse(),
957 String(), mouse_event, Vector<WebMouseEvent>()); 957 String(), mouse_event, Vector<WebMouseEvent>());
958 } 958 }
959 959
960 // Mouse events simulated from touch should not hit-test again. 960 // Mouse events simulated from touch should not hit-test again.
961 ASSERT(!mouse_event.FromTouch()); 961 DCHECK(!mouse_event.FromTouch());
962 962
963 HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kRelease; 963 HitTestRequest::HitTestRequestType hit_type = HitTestRequest::kRelease;
964 HitTestRequest request(hit_type); 964 HitTestRequest request(hit_type);
965 MouseEventWithHitTestResults mev = 965 MouseEventWithHitTestResults mev =
966 EventHandlingUtil::PerformMouseEventHitTest(frame_, request, mouse_event); 966 EventHandlingUtil::PerformMouseEventHitTest(frame_, request, mouse_event);
967 Element* mouse_release_target = mev.InnerElement(); 967 Element* mouse_release_target = mev.InnerElement();
968 LocalFrame* subframe = 968 LocalFrame* subframe =
969 capturing_mouse_events_node_.Get() 969 capturing_mouse_events_node_.Get()
970 ? SubframeForTargetNode(capturing_mouse_events_node_.Get()) 970 ? SubframeForTargetNode(capturing_mouse_events_node_.Get())
971 : SubframeForHitTestResult(mev); 971 : SubframeForHitTestResult(mev);
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 TRACE_EVENT0("input", "EventHandler::handleGestureEvent"); 1334 TRACE_EVENT0("input", "EventHandler::handleGestureEvent");
1335 if (!frame_->GetPage()) 1335 if (!frame_->GetPage())
1336 return WebInputEventResult::kNotHandled; 1336 return WebInputEventResult::kNotHandled;
1337 1337
1338 // Propagation to inner frames is handled below this function. 1338 // Propagation to inner frames is handled below this function.
1339 DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); 1339 DCHECK_EQ(frame_, &frame_->LocalFrameRoot());
1340 1340
1341 // Non-scrolling related gesture events do a single cross-frame hit-test and 1341 // Non-scrolling related gesture events do a single cross-frame hit-test and
1342 // jump directly to the inner most frame. This matches handleMousePressEvent 1342 // jump directly to the inner most frame. This matches handleMousePressEvent
1343 // etc. 1343 // etc.
1344 ASSERT(!targeted_event.Event().IsScrollEvent()); 1344 DCHECK(!targeted_event.Event().IsScrollEvent());
1345 1345
1346 // Update mouseout/leave/over/enter events before jumping directly to the 1346 // Update mouseout/leave/over/enter events before jumping directly to the
1347 // inner most frame. 1347 // inner most frame.
1348 if (targeted_event.Event().GetType() == WebInputEvent::kGestureTap) 1348 if (targeted_event.Event().GetType() == WebInputEvent::kGestureTap)
1349 UpdateGestureTargetNodeForMouseEvent(targeted_event); 1349 UpdateGestureTargetNodeForMouseEvent(targeted_event);
1350 1350
1351 // Route to the correct frame. 1351 // Route to the correct frame.
1352 if (LocalFrame* inner_frame = 1352 if (LocalFrame* inner_frame =
1353 targeted_event.GetHitTestResult().InnerNodeFrame()) 1353 targeted_event.GetHitTestResult().InnerNodeFrame())
1354 return inner_frame->GetEventHandler().HandleGestureEventInFrame( 1354 return inner_frame->GetEventHandler().HandleGestureEventInFrame(
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 return !event.TapAreaInRootFrame().IsEmpty(); 1396 return !event.TapAreaInRootFrame().IsEmpty();
1397 } 1397 }
1398 1398
1399 bool EventHandler::BestClickableNodeForHitTestResult( 1399 bool EventHandler::BestClickableNodeForHitTestResult(
1400 const HitTestResult& result, 1400 const HitTestResult& result,
1401 IntPoint& target_point, 1401 IntPoint& target_point,
1402 Node*& target_node) { 1402 Node*& target_node) {
1403 // FIXME: Unify this with the other best* functions which are very similar. 1403 // FIXME: Unify this with the other best* functions which are very similar.
1404 1404
1405 TRACE_EVENT0("input", "EventHandler::bestClickableNodeForHitTestResult"); 1405 TRACE_EVENT0("input", "EventHandler::bestClickableNodeForHitTestResult");
1406 ASSERT(result.IsRectBasedTest()); 1406 DCHECK(result.IsRectBasedTest());
1407 1407
1408 // If the touch is over a scrollbar, don't adjust the touch point since touch 1408 // If the touch is over a scrollbar, don't adjust the touch point since touch
1409 // adjustment only takes into account DOM nodes so a touch over a scrollbar 1409 // adjustment only takes into account DOM nodes so a touch over a scrollbar
1410 // will be adjusted towards nearby nodes. This leads to things like textarea 1410 // will be adjusted towards nearby nodes. This leads to things like textarea
1411 // scrollbars being untouchable. 1411 // scrollbars being untouchable.
1412 if (result.GetScrollbar()) { 1412 if (result.GetScrollbar()) {
1413 target_node = 0; 1413 target_node = 0;
1414 return false; 1414 return false;
1415 } 1415 }
1416 1416
1417 IntPoint touch_center = 1417 IntPoint touch_center =
1418 frame_->View()->ContentsToRootFrame(result.RoundedPointInMainFrame()); 1418 frame_->View()->ContentsToRootFrame(result.RoundedPointInMainFrame());
1419 IntRect touch_rect = frame_->View()->ContentsToRootFrame( 1419 IntRect touch_rect = frame_->View()->ContentsToRootFrame(
1420 result.GetHitTestLocation().BoundingBox()); 1420 result.GetHitTestLocation().BoundingBox());
1421 1421
1422 HeapVector<Member<Node>, 11> nodes; 1422 HeapVector<Member<Node>, 11> nodes;
1423 CopyToVector(result.ListBasedTestResult(), nodes); 1423 CopyToVector(result.ListBasedTestResult(), nodes);
1424 1424
1425 // FIXME: the explicit Vector conversion copies into a temporary and is 1425 // FIXME: the explicit Vector conversion copies into a temporary and is
1426 // wasteful. 1426 // wasteful.
1427 return FindBestClickableCandidate(target_node, target_point, touch_center, 1427 return FindBestClickableCandidate(target_node, target_point, touch_center,
1428 touch_rect, 1428 touch_rect,
1429 HeapVector<Member<Node>>(nodes)); 1429 HeapVector<Member<Node>>(nodes));
1430 } 1430 }
1431 1431
1432 bool EventHandler::BestContextMenuNodeForHitTestResult( 1432 bool EventHandler::BestContextMenuNodeForHitTestResult(
1433 const HitTestResult& result, 1433 const HitTestResult& result,
1434 IntPoint& target_point, 1434 IntPoint& target_point,
1435 Node*& target_node) { 1435 Node*& target_node) {
1436 ASSERT(result.IsRectBasedTest()); 1436 DCHECK(result.IsRectBasedTest());
1437 IntPoint touch_center = 1437 IntPoint touch_center =
1438 frame_->View()->ContentsToRootFrame(result.RoundedPointInMainFrame()); 1438 frame_->View()->ContentsToRootFrame(result.RoundedPointInMainFrame());
1439 IntRect touch_rect = frame_->View()->ContentsToRootFrame( 1439 IntRect touch_rect = frame_->View()->ContentsToRootFrame(
1440 result.GetHitTestLocation().BoundingBox()); 1440 result.GetHitTestLocation().BoundingBox());
1441 HeapVector<Member<Node>, 11> nodes; 1441 HeapVector<Member<Node>, 11> nodes;
1442 CopyToVector(result.ListBasedTestResult(), nodes); 1442 CopyToVector(result.ListBasedTestResult(), nodes);
1443 1443
1444 // FIXME: the explicit Vector conversion copies into a temporary and is 1444 // FIXME: the explicit Vector conversion copies into a temporary and is
1445 // wasteful. 1445 // wasteful.
1446 return FindBestContextMenuCandidate(target_node, target_point, touch_center, 1446 return FindBestContextMenuCandidate(target_node, target_point, touch_center,
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 } 1633 }
1634 } 1634 }
1635 1635
1636 GestureEventWithHitTestResults EventHandler::TargetGestureEvent( 1636 GestureEventWithHitTestResults EventHandler::TargetGestureEvent(
1637 const WebGestureEvent& gesture_event, 1637 const WebGestureEvent& gesture_event,
1638 bool read_only) { 1638 bool read_only) {
1639 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); 1639 TRACE_EVENT0("input", "EventHandler::targetGestureEvent");
1640 1640
1641 DCHECK_EQ(frame_, &frame_->LocalFrameRoot()); 1641 DCHECK_EQ(frame_, &frame_->LocalFrameRoot());
1642 // Scrolling events get hit tested per frame (like wheel events do). 1642 // Scrolling events get hit tested per frame (like wheel events do).
1643 ASSERT(!gesture_event.IsScrollEvent()); 1643 DCHECK(!gesture_event.IsScrollEvent());
1644 1644
1645 HitTestRequest::HitTestRequestType hit_type = 1645 HitTestRequest::HitTestRequestType hit_type =
1646 gesture_manager_->GetHitTypeForGestureType(gesture_event.GetType()); 1646 gesture_manager_->GetHitTypeForGestureType(gesture_event.GetType());
1647 TimeDelta active_interval; 1647 TimeDelta active_interval;
1648 bool should_keep_active_for_min_interval = false; 1648 bool should_keep_active_for_min_interval = false;
1649 if (read_only) { 1649 if (read_only) {
1650 hit_type |= HitTestRequest::kReadOnly; 1650 hit_type |= HitTestRequest::kReadOnly;
1651 } else if (gesture_event.GetType() == WebInputEvent::kGestureTap && 1651 } else if (gesture_event.GetType() == WebInputEvent::kGestureTap &&
1652 gesture_manager_->GetLastShowPressTimestamp()) { 1652 gesture_manager_->GetLastShowPressTimestamp()) {
1653 // If the Tap is received very shortly after ShowPress, we want to 1653 // If the Tap is received very shortly after ShowPress, we want to
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1719 hit_test_result = EventHandlingUtil::HitTestResultInFrame( 1719 hit_test_result = EventHandlingUtil::HitTestResultInFrame(
1720 hit_frame, 1720 hit_frame,
1721 hit_frame->View()->RootFrameToContents( 1721 hit_frame->View()->RootFrameToContents(
1722 FlooredIntPoint(adjusted_event.PositionInRootFrame())), 1722 FlooredIntPoint(adjusted_event.PositionInRootFrame())),
1723 (hit_type | HitTestRequest::kReadOnly) & ~HitTestRequest::kListBased); 1723 (hit_type | HitTestRequest::kReadOnly) & ~HitTestRequest::kListBased);
1724 } 1724 }
1725 1725
1726 // If we did a rect-based hit test it must be resolved to the best single node 1726 // If we did a rect-based hit test it must be resolved to the best single node
1727 // by now to ensure consumers don't accidentally use one of the other 1727 // by now to ensure consumers don't accidentally use one of the other
1728 // candidates. 1728 // candidates.
1729 ASSERT(!hit_test_result.IsRectBasedTest()); 1729 DCHECK(!hit_test_result.IsRectBasedTest());
1730 1730
1731 return GestureEventWithHitTestResults(adjusted_event, hit_test_result); 1731 return GestureEventWithHitTestResults(adjusted_event, hit_test_result);
1732 } 1732 }
1733 1733
1734 void EventHandler::ApplyTouchAdjustment(WebGestureEvent* gesture_event, 1734 void EventHandler::ApplyTouchAdjustment(WebGestureEvent* gesture_event,
1735 HitTestResult* hit_test_result) { 1735 HitTestResult* hit_test_result) {
1736 if (!ShouldApplyTouchAdjustment(*gesture_event)) 1736 if (!ShouldApplyTouchAdjustment(*gesture_event))
1737 return; 1737 return;
1738 1738
1739 Node* adjusted_node = nullptr; 1739 Node* adjusted_node = nullptr;
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1929 frame_set_being_resized_ = frame_set; 1929 frame_set_being_resized_ = frame_set;
1930 } 1930 }
1931 1931
1932 void EventHandler::ResizeScrollableAreaDestroyed() { 1932 void EventHandler::ResizeScrollableAreaDestroyed() {
1933 scroll_manager_->ClearResizeScrollableArea(true); 1933 scroll_manager_->ClearResizeScrollableArea(true);
1934 } 1934 }
1935 1935
1936 void EventHandler::HoverTimerFired(TimerBase*) { 1936 void EventHandler::HoverTimerFired(TimerBase*) {
1937 TRACE_EVENT0("input", "EventHandler::hoverTimerFired"); 1937 TRACE_EVENT0("input", "EventHandler::hoverTimerFired");
1938 1938
1939 ASSERT(frame_); 1939 DCHECK(frame_);
1940 ASSERT(frame_->GetDocument()); 1940 DCHECK(frame_->GetDocument());
1941 1941
1942 if (LayoutViewItem layout_item = frame_->ContentLayoutItem()) { 1942 if (LayoutViewItem layout_item = frame_->ContentLayoutItem()) {
1943 if (FrameView* view = frame_->View()) { 1943 if (FrameView* view = frame_->View()) {
1944 HitTestRequest request(HitTestRequest::kMove); 1944 HitTestRequest request(HitTestRequest::kMove);
1945 HitTestResult result(request, 1945 HitTestResult result(request,
1946 view->RootFrameToContents( 1946 view->RootFrameToContents(
1947 mouse_event_manager_->LastKnownMousePosition())); 1947 mouse_event_manager_->LastKnownMousePosition()));
1948 layout_item.HitTest(result); 1948 layout_item.HitTest(result);
1949 frame_->GetDocument()->UpdateHoverActiveState(request, 1949 frame_->GetDocument()->UpdateHoverActiveState(request,
1950 result.InnerElement()); 1950 result.InnerElement());
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
2117 MouseEventWithHitTestResults& mev, 2117 MouseEventWithHitTestResults& mev,
2118 LocalFrame* subframe) { 2118 LocalFrame* subframe) {
2119 WebInputEventResult result = 2119 WebInputEventResult result =
2120 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event()); 2120 subframe->GetEventHandler().HandleMouseReleaseEvent(mev.Event());
2121 if (result != WebInputEventResult::kNotHandled) 2121 if (result != WebInputEventResult::kNotHandled)
2122 return result; 2122 return result;
2123 return WebInputEventResult::kHandledSystem; 2123 return WebInputEventResult::kHandledSystem;
2124 } 2124 }
2125 2125
2126 } // namespace blink 2126 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698