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

Side by Side Diff: Source/core/inspector/InspectorOverlay.cpp

Issue 237313003: CSS shapes support in Web Inspector (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 8 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) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 } 485 }
486 486
487 static PassRefPtr<JSONObject> buildObjectForSize(const IntSize& size) 487 static PassRefPtr<JSONObject> buildObjectForSize(const IntSize& size)
488 { 488 {
489 RefPtr<JSONObject> result = JSONObject::create(); 489 RefPtr<JSONObject> result = JSONObject::create();
490 result->setNumber("width", size.width()); 490 result->setNumber("width", size.width());
491 result->setNumber("height", size.height()); 491 result->setNumber("height", size.height());
492 return result.release(); 492 return result.release();
493 } 493 }
494 494
495 static FloatPoint localPointToRoot(RenderObject* renderer, const FrameView* main View, const FrameView* view, const FloatPoint& point)
496 {
497 FloatPoint result = renderer->localToAbsolute(point);
498 result = view->contentsToRootView(roundedIntPoint(result));
499 result += mainView->scrollOffset();
500 return result;
501 }
502
503 struct PathApplyInfo {
504 FrameView* rootView;
505 FrameView* view;
506 JSONArray* array;
507 RenderObject* renderer;
508 const ShapeOutsideInfo* shapeOutsideInfo;
509 };
510
511 static void appendPathCommandAndPoints(PathApplyInfo* info, const String& comman d, const FloatPoint points[], unsigned length)
512 {
513 FloatPoint point;
514 info->array->pushString(command);
515 for (unsigned i = 0; i < length; i++) {
516 point = info->shapeOutsideInfo->shapeToRendererPoint(points[i]);
517 point = localPointToRoot(info->renderer, info->rootView, info->view, poi nt);
518 info->array->pushNumber(point.x());
519 info->array->pushNumber(point.y());
520 }
521 }
522
523 static void appendPathSegment(void* info, const PathElement* pathElement)
524 {
525 PathApplyInfo* pathApplyInfo = static_cast<PathApplyInfo*>(info);
pfeldman 2014/04/15 11:59:09 Please don't reinterpret, call it using simple loo
Habib Virji 2014/04/17 15:43:47 Tried to remove but problem is paths.shape.apply(&
apavlov 2014/04/17 16:11:32 Well, the current code is along the lines of what
526 FloatPoint point;
527 switch (pathElement->type) {
528 // The points member will contain 1 value.
529 case PathElementMoveToPoint:
530 appendPathCommandAndPoints(pathApplyInfo, ("M"), pathElement->points, 1) ;
apavlov 2014/04/17 16:11:32 The parentheses around strings are not needed?
531 break;
532 // The points member will contain 1 value.
533 case PathElementAddLineToPoint:
534 appendPathCommandAndPoints(pathApplyInfo, ("L"), pathElement->points, 1) ;
535 break;
536 // The points member will contain 3 values.
537 case PathElementAddCurveToPoint:
538 appendPathCommandAndPoints(pathApplyInfo, ("C"), pathElement->points, 3) ;
539 break;
540 // The points member will contain 2 values.
541 case PathElementAddQuadCurveToPoint:
542 appendPathCommandAndPoints(pathApplyInfo, ("Q"), pathElement->points, 2) ;
543 break;
544 // The points member will contain no values.
545 case PathElementCloseSubpath:
546 appendPathCommandAndPoints(pathApplyInfo, ("Z"), 0, 0);
547 break;
548 }
549 }
550
551 static PassRefPtr<JSONObject> buildObjectForShapeOutside(LocalFrame* containingF rame, RenderBox* renderer)
552 {
553 const ShapeOutsideInfo* shapeOutsideInfo = renderer->shapeOutsideInfo();
554 if (!shapeOutsideInfo)
555 return nullptr;
556
557 RefPtr<JSONObject> shapeObject = JSONObject::create();
558 LayoutRect shapeBounds = shapeOutsideInfo->computedShapePhysicalBoundingBox( );
559 FloatQuad shapeQuad = renderer->localToAbsoluteQuad(FloatRect(shapeBounds));
560 contentsQuadToPage(containingFrame->page()->mainFrame()->view(), containingF rame->view(), shapeQuad);
561 shapeObject->setArray("bounds", buildArrayForQuad(shapeQuad));
562
563 Shape::DisplayPaths paths;
564 shapeOutsideInfo->computedShape().buildDisplayPaths(paths);
565
566 if (paths.shape.length()) {
567 RefPtr<JSONArray> shapePath = JSONArray::create();
568 PathApplyInfo info;
569 info.rootView = containingFrame->page()->mainFrame()->view();
pfeldman 2014/04/15 11:59:09 Extract FrameView* mainView above - you use it mul
Habib Virji 2014/04/17 15:43:47 Done.
570 info.view = containingFrame->view();
pfeldman 2014/04/15 11:59:09 FrameView* containingView
Habib Virji 2014/04/17 15:43:47 Done.
571 info.array = shapePath.get();
572 info.renderer = renderer;
573 info.shapeOutsideInfo = shapeOutsideInfo;
574
575 paths.shape.apply(&info, &appendPathSegment);
576
577 shapeObject->setArray("shape", shapePath.release());
578
579 if (paths.marginShape.length()) {
580 shapePath = JSONArray::create();
581 info.array = shapePath.get();
582 paths.marginShape.apply(&info, &appendPathSegment);
583 shapeObject->setArray("marginShape", shapePath.release());
584 }
585 }
586
587 return shapeObject.release();
588 }
589
495 void InspectorOverlay::drawNodeHighlight() 590 void InspectorOverlay::drawNodeHighlight()
496 { 591 {
497 if (!m_highlightNode) 592 if (!m_highlightNode)
498 return; 593 return;
499 594
500 Highlight highlight; 595 Highlight highlight;
501 buildNodeHighlight(m_highlightNode.get(), m_nodeHighlightConfig, &highlight) ; 596 buildNodeHighlight(m_highlightNode.get(), m_nodeHighlightConfig, &highlight) ;
502 if (m_eventTargetNode) { 597 if (m_eventTargetNode) {
503 Highlight eventTargetHighlight; 598 Highlight eventTargetHighlight;
504 buildNodeHighlight(m_eventTargetNode.get(), m_nodeHighlightConfig, &even tTargetHighlight); 599 buildNodeHighlight(m_eventTargetNode.get(), m_nodeHighlightConfig, &even tTargetHighlight);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 if (!classNames.isEmpty()) 636 if (!classNames.isEmpty())
542 elementInfo->setString("className", classNames.toString()); 637 elementInfo->setString("className", classNames.toString());
543 638
544 RenderObject* renderer = node->renderer(); 639 RenderObject* renderer = node->renderer();
545 LocalFrame* containingFrame = node->document().frame(); 640 LocalFrame* containingFrame = node->document().frame();
546 FrameView* containingView = containingFrame->view(); 641 FrameView* containingView = containingFrame->view();
547 IntRect boundingBox = pixelSnappedIntRect(containingView->contentsToRoot View(renderer->absoluteBoundingBoxRect())); 642 IntRect boundingBox = pixelSnappedIntRect(containingView->contentsToRoot View(renderer->absoluteBoundingBoxRect()));
548 RenderBoxModelObject* modelObject = renderer->isBoxModelObject() ? toRen derBoxModelObject(renderer) : 0; 643 RenderBoxModelObject* modelObject = renderer->isBoxModelObject() ? toRen derBoxModelObject(renderer) : 0;
549 elementInfo->setString("nodeWidth", String::number(modelObject ? adjustF orAbsoluteZoom(modelObject->pixelSnappedOffsetWidth(), modelObject) : boundingBo x.width())); 644 elementInfo->setString("nodeWidth", String::number(modelObject ? adjustF orAbsoluteZoom(modelObject->pixelSnappedOffsetWidth(), modelObject) : boundingBo x.width()));
550 elementInfo->setString("nodeHeight", String::number(modelObject ? adjust ForAbsoluteZoom(modelObject->pixelSnappedOffsetHeight(), modelObject) : bounding Box.height())); 645 elementInfo->setString("nodeHeight", String::number(modelObject ? adjust ForAbsoluteZoom(modelObject->pixelSnappedOffsetHeight(), modelObject) : bounding Box.height()));
646 if (renderer->isBox()) {
647 RenderBox* renderBox = toRenderBox(renderer);
648 if (RefPtr<JSONObject> shapeObject = buildObjectForShapeOutside(cont ainingFrame, renderBox))
649 elementInfo->setObject("shapeOutsideInfo", shapeObject.release() );
650 }
551 highlightObject->setObject("elementInfo", elementInfo.release()); 651 highlightObject->setObject("elementInfo", elementInfo.release());
552 } 652 }
553 evaluateInOverlay("drawNodeHighlight", highlightObject); 653 evaluateInOverlay("drawNodeHighlight", highlightObject);
554 } 654 }
555 655
556 void InspectorOverlay::drawQuadHighlight() 656 void InspectorOverlay::drawQuadHighlight()
557 { 657 {
558 if (!m_highlightQuad) 658 if (!m_highlightQuad)
559 return; 659 return;
560 660
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 m_timer.stop(); 785 m_timer.stop();
686 } 786 }
687 787
688 void InspectorOverlay::startedRecordingProfile() 788 void InspectorOverlay::startedRecordingProfile()
689 { 789 {
690 if (!m_activeProfilerCount++) 790 if (!m_activeProfilerCount++)
691 freePage(); 791 freePage();
692 } 792 }
693 793
694 } // namespace WebCore 794 } // namespace WebCore
OLDNEW
« no previous file with comments | « no previous file | Source/core/inspector/InspectorOverlayPage.html » ('j') | Source/core/inspector/InspectorOverlayPage.html » ('J')

Powered by Google App Engine
This is Rietveld 408576698