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

Side by Side Diff: Source/WebKit/chromium/src/FindInPageCoordinates.cpp

Issue 12092069: Merge 141252 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1364/
Patch Set: Created 7 years, 10 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
« no previous file with comments | « Source/WebKit/chromium/ChangeLog ('k') | Source/WebKit/chromium/tests/WebFrameTest.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) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * 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 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 #include "RenderBox.h" 42 #include "RenderBox.h"
43 #include "RenderObject.h" 43 #include "RenderObject.h"
44 #include "RenderPart.h" 44 #include "RenderPart.h"
45 #include "RenderStyle.h" 45 #include "RenderStyle.h"
46 #include "RenderView.h" 46 #include "RenderView.h"
47 47
48 using namespace WebCore; 48 using namespace WebCore;
49 49
50 namespace WebKit { 50 namespace WebKit {
51 51
52 static FloatRect toNormalizedRect(const FloatRect& absoluteRect, const RenderObj ect* renderer) 52 static const RenderBlock* enclosingScrollableAncestor(const RenderObject* render er)
53 {
54 ASSERT(!renderer->isRenderView());
55
56 // Trace up the containingBlocks until we reach either the render view or a scrollable object.
57 const RenderBlock* container = renderer->containingBlock();
58 while (!container->hasOverflowClip() && !container->isRenderView())
59 container = container->containingBlock();
60 return container;
61 }
62
63 static FloatRect toNormalizedRect(const FloatRect& absoluteRect, const RenderObj ect* renderer, const RenderBlock* container)
53 { 64 {
54 ASSERT(renderer); 65 ASSERT(renderer);
55 66
56 const RenderBlock* container = renderer->containingBlock();
57 ASSERT(container || renderer->isRenderView()); 67 ASSERT(container || renderer->isRenderView());
58 if (!container) 68 if (!container)
59 return FloatRect(); 69 return FloatRect();
60 70
61 // We want to normalize by the max layout overflow size instead of only the visible bounding box. 71 // We want to normalize by the max layout overflow size instead of only the visible bounding box.
62 // Quads and their enclosing bounding boxes need to be used in order to keep results transform-friendly. 72 // Quads and their enclosing bounding boxes need to be used in order to keep results transform-friendly.
63 FloatPoint scrolledOrigin; 73 FloatPoint scrolledOrigin;
64 74
65 // For overflow:scroll we need to get where the actual origin is independent ly of the scroll. 75 // For overflow:scroll we need to get where the actual origin is independent ly of the scroll.
66 if (container->hasOverflowClip()) 76 if (container->hasOverflowClip())
(...skipping 18 matching lines...) Expand all
85 normalizedRect.scale(1 / containerRect.width(), 1 / containerRect.height()); 95 normalizedRect.scale(1 / containerRect.width(), 1 / containerRect.height());
86 return normalizedRect; 96 return normalizedRect;
87 } 97 }
88 98
89 FloatRect findInPageRectFromAbsoluteRect(const FloatRect& inputRect, const Rende rObject* baseRenderer) 99 FloatRect findInPageRectFromAbsoluteRect(const FloatRect& inputRect, const Rende rObject* baseRenderer)
90 { 100 {
91 if (!baseRenderer || inputRect.isEmpty()) 101 if (!baseRenderer || inputRect.isEmpty())
92 return FloatRect(); 102 return FloatRect();
93 103
94 // Normalize the input rect to its container block. 104 // Normalize the input rect to its container block.
95 FloatRect normalizedRect = toNormalizedRect(inputRect, baseRenderer); 105 const RenderBlock* baseContainer = enclosingScrollableAncestor(baseRenderer) ;
106 FloatRect normalizedRect = toNormalizedRect(inputRect, baseRenderer, baseCon tainer);
96 107
97 // Go up across frames. 108 // Go up across frames.
98 for (const RenderObject* renderer = baseRenderer->containingBlock(); rendere r; ) { 109 for (const RenderBox* renderer = baseContainer; renderer; ) {
99 110
100 // Go up the render tree until we reach the root of the current frame (t he RenderView). 111 // Go up the render tree until we reach the root of the current frame (t he RenderView).
101 for (const RenderBlock* container = renderer->containingBlock(); contain er; 112 while (!renderer->isRenderView()) {
102 renderer = container, container = container->containingBlock()) { 113 const RenderBlock* container = enclosingScrollableAncestor(renderer) ;
103 114
104 // Compose the normalized rects. 115 // Compose the normalized rects.
105 FloatRect normalizedBoxRect = toNormalizedRect(renderer->absoluteBou ndingBoxRect(), renderer); 116 FloatRect normalizedBoxRect = toNormalizedRect(renderer->absoluteBou ndingBoxRect(), renderer, container);
106 normalizedRect.scale(normalizedBoxRect.width(), normalizedBoxRect.he ight()); 117 normalizedRect.scale(normalizedBoxRect.width(), normalizedBoxRect.he ight());
107 normalizedRect.moveBy(normalizedBoxRect.location()); 118 normalizedRect.moveBy(normalizedBoxRect.location());
108 119
109 if (normalizedRect.isEmpty()) 120 renderer = container;
110 return normalizedRect;
111 } 121 }
112 122
123 ASSERT(renderer->isRenderView());
124
113 // Jump to the renderer owning the frame, if any. 125 // Jump to the renderer owning the frame, if any.
114 ASSERT(renderer->isRenderView());
115 renderer = renderer->frame() ? renderer->frame()->ownerRenderer() : 0; 126 renderer = renderer->frame() ? renderer->frame()->ownerRenderer() : 0;
116 } 127 }
117 128
118 return normalizedRect; 129 return normalizedRect;
119 } 130 }
120 131
121 FloatRect findInPageRectFromRange(Range* range) 132 FloatRect findInPageRectFromRange(Range* range)
122 { 133 {
123 if (!range || !range->firstNode()) 134 if (!range || !range->firstNode())
124 return FloatRect(); 135 return FloatRect();
125 136
126 return findInPageRectFromAbsoluteRect(RenderObject::absoluteBoundingBoxRectF orRange(range), range->firstNode()->renderer()); 137 return findInPageRectFromAbsoluteRect(RenderObject::absoluteBoundingBoxRectF orRange(range), range->firstNode()->renderer());
127 } 138 }
128 139
129 } // namespace WebKit 140 } // namespace WebKit
OLDNEW
« no previous file with comments | « Source/WebKit/chromium/ChangeLog ('k') | Source/WebKit/chromium/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698