[webkit-reviews] review denied: [Bug 93597] Add DeviceController to support DOMWindow device events : [Attachment 160375] Patch
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Mon Aug 27 11:27:52 PDT 2012
Adam Barth <abarth at webkit.org> has denied Kihong Kwon
<kihong.kwon at samsung.com>'s request for review:
Bug 93597: Add DeviceController to support DOMWindow device events
https://bugs.webkit.org/show_bug.cgi?id=93597
Attachment 160375: Patch
https://bugs.webkit.org/attachment.cgi?id=160375&action=review
------- Additional Comments from Adam Barth <abarth at webkit.org>
View in context: https://bugs.webkit.org/attachment.cgi?id=160375&action=review
I think we can improve this design substantially. You're trying to have
DeviceController do too much. It's responsible for handling all types of
events for all documents in a Page. Instead, we should subclass
DeviceController for each type of event and keep the per-DOMWindow state in a
Supplement<DOMWindow>. That way this state will be owned by the DOMWindow
instead of needing to use a RefPtr<DOMWindow> to keep the DOMWindow alive.
> Source/WebCore/WebCore.xcodeproj/project.pbxproj:28545
> FD537352137B651800008DCE /* ZeroPole.cpp in
Sources */,
> + CC24D64A15E212E90079DD79 /*
DeviceController.cpp in Sources */,
When you modify the Xcodeproj file, you might want to run
Tools/Scrips/sort-xcodeproj . That keeps the file sorted and reduces the risk
of merge conflicts.
> Source/WebCore/page/DeviceController.cpp:51
> + if (!m_clients.contains(eventType))
> + return;
> +
> + DeviceClientMap::iterator iterClient = m_clients.find(eventType);
You can merge these calls together so we only do a find once. The iterator
will be end() if the eventType isn't in the map.
iterClient -> client
> Source/WebCore/page/DeviceController.cpp:52
> + if (iterClient != m_clients.end() && iterClient->second->lastEvent()) {
iterClient != m_clients.end() <-- This is redundant with the contains check
> Source/WebCore/page/DeviceController.cpp:53
> + m_lastEventHandler.append(LastEventHandler(window,
iterClient->second->lastEvent()));
It's strange that window is being passed in here... I'll keep reading to see
how the lifetime issues work out.
> Source/WebCore/page/DeviceController.cpp:74
> + ListenersCountedSet* listeners =
m_listeners.find(eventType)->second.get();
Similar problem as above. It's inefficient to do the contains and the find
operation separately.
> Source/WebCore/page/DeviceController.cpp:82
> + size_t lastEventHandlerCount = m_lastEventHandler.size();
> + for (size_t i = 0; i < lastEventHandlerCount; ++i)
You don't need the lastEventHandlerCount variable. You can just put
m_lastEventHandler.size() in the loop condition.
> Source/WebCore/page/DeviceController.cpp:90
> + int listenersCount = m_listeners.size();
> + for (int i = 0; i < listenersCount; ++i) {
ditto
> Source/WebCore/page/DeviceController.cpp:101
> + size_t lastEventHandlerCount = m_lastEventHandler.size();
> + for (size_t i = 0; i < lastEventHandlerCount; ++i)
ditto
> Source/WebCore/page/DeviceController.cpp:127
> + Vector<RefPtr<DOMWindow> > listeners;
It's not a good idea to grab a RefPtr to the DOMWindow. DOMWindow is only
RefCounted because for some odd cases involving initial documents. This could
shouldn't be holding references to DOMWindows.
> Source/WebCore/page/Page.cpp:118
> + , m_deviceController(DeviceController::create(this))
We should avoid spamming Page with a bunch of random objects. Instead,
DeviceController should be a Supplement<Page>.
More information about the webkit-reviews
mailing list