Commit 87b847d2 authored by tkent@chromium.org's avatar tkent@chromium.org

Oilpan: Change Persistent<> data members to Member<> in HitTestResult.

- Disallow new/delete operations for HitTestResult.
HitTestResult was used
-- with new/delete operators
-- as part objects of ContextMenuController and MouseEventWithHitTestResult.
-- as stack allocated objects

We'd like to avoid to make such classes in Oilpan.
So, this CL disallows new/delete, and WebHitTestResult owns another
class to hold only required data copied from a HitTestResult.

- Move ContextMenuController to Oilpan heap, and trace HitTestResult member.

- Mark MouseEventWithHitTestResults STACK_ALLOCATED.

- We can't get HitTestResult from a WebHitTestResult. So we need to
introduce new function to WebViewImpl for WebSubstringUtil.mm.

Difference from r176393:
Always calling HitTestResult member functions was bad. Some of them are
expensive. So WebHitTestResultPrivate contains a HitTestResult copy, and
WebHitTestResultPrivate is RefCountedWillBeGarbageCollectedFinalized in order to
trace HitTestResult.

BUG=357163

Review URL: https://codereview.chromium.org/413903004

git-svn-id: svn://svn.chromium.org/blink/trunk@178997 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 9ae354f4
...@@ -50,9 +50,14 @@ ContextMenuController::~ContextMenuController() ...@@ -50,9 +50,14 @@ ContextMenuController::~ContextMenuController()
{ {
} }
PassOwnPtr<ContextMenuController> ContextMenuController::create(Page* page, ContextMenuClient* client) PassOwnPtrWillBeRawPtr<ContextMenuController> ContextMenuController::create(Page* page, ContextMenuClient* client)
{ {
return adoptPtr(new ContextMenuController(page, client)); return adoptPtrWillBeNoop(new ContextMenuController(page, client));
}
void ContextMenuController::trace(Visitor* visitor)
{
visitor->trace(m_hitTestResult);
} }
void ContextMenuController::clearContextMenu() void ContextMenuController::clearContextMenu()
......
...@@ -43,11 +43,12 @@ namespace blink { ...@@ -43,11 +43,12 @@ namespace blink {
class LocalFrame; class LocalFrame;
class Page; class Page;
class ContextMenuController { class ContextMenuController : public NoBaseWillBeGarbageCollectedFinalized<ContextMenuController> {
WTF_MAKE_NONCOPYABLE(ContextMenuController); WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_NONCOPYABLE(ContextMenuController); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
public: public:
static PassOwnPtr<ContextMenuController> create(Page*, ContextMenuClient*); static PassOwnPtrWillBeRawPtr<ContextMenuController> create(Page*, ContextMenuClient*);
~ContextMenuController(); ~ContextMenuController();
void trace(Visitor*);
ContextMenu* contextMenu() const { return m_contextMenu.get(); } ContextMenu* contextMenu() const { return m_contextMenu.get(); }
void clearContextMenu(); void clearContextMenu();
......
...@@ -599,6 +599,7 @@ void Page::trace(Visitor* visitor) ...@@ -599,6 +599,7 @@ void Page::trace(Visitor* visitor)
#if ENABLE(OILPAN) #if ENABLE(OILPAN)
visitor->trace(m_dragCaretController); visitor->trace(m_dragCaretController);
visitor->trace(m_dragController); visitor->trace(m_dragController);
visitor->trace(m_contextMenuController);
visitor->trace(m_inspectorController); visitor->trace(m_inspectorController);
visitor->trace(m_pointerLockController); visitor->trace(m_pointerLockController);
visitor->trace(m_undoStack); visitor->trace(m_undoStack);
......
...@@ -253,7 +253,7 @@ private: ...@@ -253,7 +253,7 @@ private:
const OwnPtrWillBeMember<DragCaretController> m_dragCaretController; const OwnPtrWillBeMember<DragCaretController> m_dragCaretController;
const OwnPtrWillBeMember<DragController> m_dragController; const OwnPtrWillBeMember<DragController> m_dragController;
const OwnPtr<FocusController> m_focusController; const OwnPtr<FocusController> m_focusController;
const OwnPtr<ContextMenuController> m_contextMenuController; const OwnPtrWillBeMember<ContextMenuController> m_contextMenuController;
const OwnPtrWillBeMember<InspectorController> m_inspectorController; const OwnPtrWillBeMember<InspectorController> m_inspectorController;
const OwnPtrWillBeMember<PointerLockController> m_pointerLockController; const OwnPtrWillBeMember<PointerLockController> m_pointerLockController;
OwnPtr<ScrollingCoordinator> m_scrollingCoordinator; OwnPtr<ScrollingCoordinator> m_scrollingCoordinator;
......
...@@ -113,6 +113,17 @@ HitTestResult& HitTestResult::operator=(const HitTestResult& other) ...@@ -113,6 +113,17 @@ HitTestResult& HitTestResult::operator=(const HitTestResult& other)
return *this; return *this;
} }
void HitTestResult::trace(Visitor* visitor)
{
visitor->trace(m_innerNode);
visitor->trace(m_innerPossiblyPseudoNode);
visitor->trace(m_innerNonSharedNode);
visitor->trace(m_innerURLElement);
#if ENABLE(OILPAN)
visitor->trace(m_rectBasedTestResult);
#endif
}
PositionWithAffinity HitTestResult::position() const PositionWithAffinity HitTestResult::position() const
{ {
if (!m_innerPossiblyPseudoNode) if (!m_innerPossiblyPseudoNode)
......
...@@ -47,6 +47,7 @@ class PositionWithAffinity; ...@@ -47,6 +47,7 @@ class PositionWithAffinity;
class Scrollbar; class Scrollbar;
class HitTestResult { class HitTestResult {
DISALLOW_ALLOCATION();
public: public:
typedef WillBeHeapListHashSet<RefPtrWillBeMember<Node> > NodeSet; typedef WillBeHeapListHashSet<RefPtrWillBeMember<Node> > NodeSet;
...@@ -58,6 +59,7 @@ public: ...@@ -58,6 +59,7 @@ public:
HitTestResult(const HitTestResult&); HitTestResult(const HitTestResult&);
~HitTestResult(); ~HitTestResult();
HitTestResult& operator=(const HitTestResult&); HitTestResult& operator=(const HitTestResult&);
void trace(Visitor*);
Node* innerNode() const { return m_innerNode.get(); } Node* innerNode() const { return m_innerNode.get(); }
Node* innerPossiblyPseudoNode() const { return m_innerPossiblyPseudoNode.get(); } Node* innerPossiblyPseudoNode() const { return m_innerPossiblyPseudoNode.get(); }
...@@ -135,19 +137,19 @@ private: ...@@ -135,19 +137,19 @@ private:
HitTestLocation m_hitTestLocation; HitTestLocation m_hitTestLocation;
RefPtrWillBePersistent<Node> m_innerNode; RefPtrWillBeMember<Node> m_innerNode;
RefPtrWillBePersistent<Node> m_innerPossiblyPseudoNode; RefPtrWillBeMember<Node> m_innerPossiblyPseudoNode;
RefPtrWillBePersistent<Node> m_innerNonSharedNode; RefPtrWillBeMember<Node> m_innerNonSharedNode;
// FIXME: Nothing changes this to a value different from m_hitTestLocation! // FIXME: Nothing changes this to a value different from m_hitTestLocation!
LayoutPoint m_pointInInnerNodeFrame; // The hit-tested point in innerNode frame coordinates. LayoutPoint m_pointInInnerNodeFrame; // The hit-tested point in innerNode frame coordinates.
LayoutPoint m_localPoint; // A point in the local coordinate space of m_innerNonSharedNode's renderer. Allows us to efficiently LayoutPoint m_localPoint; // A point in the local coordinate space of m_innerNonSharedNode's renderer. Allows us to efficiently
// determine where inside the renderer we hit on subsequent operations. // determine where inside the renderer we hit on subsequent operations.
RefPtrWillBePersistent<Element> m_innerURLElement; RefPtrWillBeMember<Element> m_innerURLElement;
RefPtr<Scrollbar> m_scrollbar; RefPtr<Scrollbar> m_scrollbar;
bool m_isOverWidget; // Returns true if we are over a widget (and not in the border/padding area of a RenderWidget for example). bool m_isOverWidget; // Returns true if we are over a widget (and not in the border/padding area of a RenderWidget for example).
bool m_isFirstLetter; bool m_isFirstLetter;
mutable OwnPtrWillBePersistent<NodeSet> m_rectBasedTestResult; mutable OwnPtrWillBeMember<NodeSet> m_rectBasedTestResult;
}; };
} // namespace blink } // namespace blink
......
...@@ -41,52 +41,81 @@ using namespace blink; ...@@ -41,52 +41,81 @@ using namespace blink;
namespace blink { namespace blink {
class WebHitTestResultPrivate : public RefCountedWillBeGarbageCollectedFinalized<WebHitTestResultPrivate> {
public:
static PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> create(const HitTestResult&);
static PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> create(const WebHitTestResultPrivate&);
void trace(Visitor* visitor) { visitor->trace(m_result); }
const HitTestResult& result() const { return m_result; }
private:
WebHitTestResultPrivate(const HitTestResult&);
WebHitTestResultPrivate(const WebHitTestResultPrivate&);
HitTestResult m_result;
};
inline WebHitTestResultPrivate::WebHitTestResultPrivate(const HitTestResult& result)
: m_result(result)
{
}
inline WebHitTestResultPrivate::WebHitTestResultPrivate(const WebHitTestResultPrivate& result)
: m_result(result.m_result)
{
}
PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> WebHitTestResultPrivate::create(const HitTestResult& result)
{
return adoptRefWillBeNoop(new WebHitTestResultPrivate(result));
}
PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> WebHitTestResultPrivate::create(const WebHitTestResultPrivate& result)
{
return adoptRefWillBeNoop(new WebHitTestResultPrivate(result));
}
WebNode WebHitTestResult::node() const WebNode WebHitTestResult::node() const
{ {
return WebNode(m_private->innerNode()); return WebNode(m_private->result().innerNode());
} }
WebPoint WebHitTestResult::localPoint() const WebPoint WebHitTestResult::localPoint() const
{ {
return roundedIntPoint(m_private->localPoint()); return roundedIntPoint(m_private->result().localPoint());
} }
WebElement WebHitTestResult::urlElement() const WebElement WebHitTestResult::urlElement() const
{ {
return WebElement(m_private->URLElement()); return WebElement(m_private->result().URLElement());
} }
WebURL WebHitTestResult::absoluteImageURL() const WebURL WebHitTestResult::absoluteImageURL() const
{ {
return m_private->absoluteImageURL(); return m_private->result().absoluteImageURL();
} }
WebURL WebHitTestResult::absoluteLinkURL() const WebURL WebHitTestResult::absoluteLinkURL() const
{ {
return m_private->absoluteLinkURL(); return m_private->result().absoluteLinkURL();
} }
bool WebHitTestResult::isContentEditable() const bool WebHitTestResult::isContentEditable() const
{ {
return m_private->isContentEditable(); return m_private->result().isContentEditable();
} }
WebHitTestResult::WebHitTestResult(const HitTestResult& result) WebHitTestResult::WebHitTestResult(const HitTestResult& result)
: m_private(WebHitTestResultPrivate::create(result))
{ {
m_private.reset(new HitTestResult(result));
} }
WebHitTestResult& WebHitTestResult::operator=(const HitTestResult& result) WebHitTestResult& WebHitTestResult::operator=(const HitTestResult& result)
{ {
m_private.reset(new HitTestResult(result)); m_private = WebHitTestResultPrivate::create(result);
return *this; return *this;
} }
WebHitTestResult::operator HitTestResult() const
{
return *m_private.get();
}
bool WebHitTestResult::isNull() const bool WebHitTestResult::isNull() const
{ {
return !m_private.get(); return !m_private.get();
...@@ -94,12 +123,15 @@ bool WebHitTestResult::isNull() const ...@@ -94,12 +123,15 @@ bool WebHitTestResult::isNull() const
void WebHitTestResult::assign(const WebHitTestResult& info) void WebHitTestResult::assign(const WebHitTestResult& info)
{ {
m_private.reset(new HitTestResult(info)); if (info.isNull())
m_private.reset();
else
m_private = WebHitTestResultPrivate::create(*info.m_private.get());
} }
void WebHitTestResult::reset() void WebHitTestResult::reset()
{ {
m_private.reset(0); m_private.reset();
} }
} // namespace blink } // namespace blink
...@@ -3219,6 +3219,11 @@ void WebViewImpl::performPluginAction(const WebPluginAction& action, ...@@ -3219,6 +3219,11 @@ void WebViewImpl::performPluginAction(const WebPluginAction& action,
} }
WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point) WebHitTestResult WebViewImpl::hitTestResultAt(const WebPoint& point)
{
return coreHitTestResultAt(point);
}
HitTestResult WebViewImpl::coreHitTestResultAt(const WebPoint& point)
{ {
IntPoint scaledPoint = point; IntPoint scaledPoint = point;
scaledPoint.scale(1 / pageScaleFactor(), 1 / pageScaleFactor()); scaledPoint.scale(1 / pageScaleFactor(), 1 / pageScaleFactor());
......
...@@ -264,6 +264,7 @@ public: ...@@ -264,6 +264,7 @@ public:
// WebViewImpl // WebViewImpl
blink::HitTestResult coreHitTestResultAt(const WebPoint&);
void suppressInvalidations(bool enable); void suppressInvalidations(bool enable);
void invalidateRect(const blink::IntRect&); void invalidateRect(const blink::IntRect&);
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
#include "public/web/WebRange.h" #include "public/web/WebRange.h"
#include "public/web/WebView.h" #include "public/web/WebView.h"
#include "web/WebLocalFrameImpl.h" #include "web/WebLocalFrameImpl.h"
#include "web/WebViewImpl.h"
using namespace blink; using namespace blink;
...@@ -112,7 +113,7 @@ namespace blink { ...@@ -112,7 +113,7 @@ namespace blink {
NSAttributedString* WebSubstringUtil::attributedWordAtPoint(WebView* view, WebPoint point, WebPoint& baselinePoint) NSAttributedString* WebSubstringUtil::attributedWordAtPoint(WebView* view, WebPoint point, WebPoint& baselinePoint)
{ {
HitTestResult result = view->hitTestResultAt(point); HitTestResult result = static_cast<WebViewImpl*>(view)->coreHitTestResultAt(point);
if (!result.targetNode()) if (!result.targetNode())
return nil; return nil;
LocalFrame* frame = result.targetNode()->document().frame(); LocalFrame* frame = result.targetNode()->document().frame();
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#ifndef WebHitTestResult_h #ifndef WebHitTestResult_h
#define WebHitTestResult_h #define WebHitTestResult_h
#include "../platform/WebPrivateOwnPtr.h" #include "../platform/WebPrivatePtr.h"
namespace blink { namespace blink {
class HitTestResult; class HitTestResult;
...@@ -35,6 +35,7 @@ class HitTestResult; ...@@ -35,6 +35,7 @@ class HitTestResult;
namespace blink { namespace blink {
class WebElement; class WebElement;
class WebHitTestResultPrivate;
class WebNode; class WebNode;
class WebURL; class WebURL;
struct WebPoint; struct WebPoint;
...@@ -74,11 +75,10 @@ public: ...@@ -74,11 +75,10 @@ public:
#if BLINK_IMPLEMENTATION #if BLINK_IMPLEMENTATION
WebHitTestResult(const blink::HitTestResult&); WebHitTestResult(const blink::HitTestResult&);
WebHitTestResult& operator=(const blink::HitTestResult&); WebHitTestResult& operator=(const blink::HitTestResult&);
operator blink::HitTestResult() const;
#endif #endif
protected: protected:
WebPrivateOwnPtr<blink::HitTestResult> m_private; WebPrivatePtr<WebHitTestResultPrivate> m_private;
}; };
} // namespace blink } // namespace blink
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment