Commit 845fb570 authored by sigbjornf@opera.com's avatar sigbjornf@opera.com

Move color chooser objects to the Oilpan heap.

Keep these on the heap so that their raw pointers to heap objects can be
correctly traced.

R=mkwst,haraken,tkent,keishi
BUG=340522

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

git-svn-id: svn://svn.chromium.org/blink/trunk@183538 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 89d572ca
......@@ -30,15 +30,18 @@
#ifndef ColorChooser_h
#define ColorChooser_h
#include "platform/heap/Handle.h"
namespace blink {
class AXObject;
class Color;
class ColorChooser {
class ColorChooser : public WillBeGarbageCollectedMixin {
public:
ColorChooser();
virtual ~ColorChooser();
virtual void trace(Visitor*) { }
virtual void setSelectedColor(const Color&) { }
virtual void endChooser() { }
......
......@@ -33,17 +33,17 @@
#include "platform/ColorSuggestion.h"
#include "platform/geometry/IntRect.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h"
#include "platform/heap/Handle.h"
#include "wtf/Vector.h"
namespace blink {
class Element;
class ColorChooserClient {
class ColorChooserClient : public WillBeGarbageCollectedMixin {
public:
virtual ~ColorChooserClient();
virtual void trace(Visitor*) { }
virtual void didChooseColor(const Color&) = 0;
virtual void didEndChooser() = 0;
......
......@@ -82,7 +82,13 @@ PassRefPtrWillBeRawPtr<InputType> ColorInputType::create(HTMLInputElement& eleme
ColorInputType::~ColorInputType()
{
endColorChooser();
}
void ColorInputType::trace(Visitor* visitor)
{
visitor->trace(m_chooser);
BaseClickableWithKeyInputType::trace(visitor);
ColorChooserClient::trace(visitor);
}
void ColorInputType::countUsage()
......
......@@ -39,9 +39,11 @@ namespace blink {
class ColorChooser;
class ColorInputType final : public BaseClickableWithKeyInputType, public ColorChooserClient {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(ColorInputType);
public:
static PassRefPtrWillBeRawPtr<InputType> create(HTMLInputElement&);
virtual ~ColorInputType();
virtual void trace(Visitor*) override;
// ColorChooserClient implementation.
virtual void didChooseColor(const Color&) override;
......@@ -73,7 +75,7 @@ private:
void endColorChooser();
HTMLElement* shadowColorSwatch() const;
OwnPtr<ColorChooser> m_chooser;
OwnPtrWillBeMember<ColorChooser> m_chooser;
};
} // namespace blink
......
......@@ -82,7 +82,7 @@ PassRefPtrWillBeRawPtr<PopupMenu> EmptyChromeClient::createPopupMenu(LocalFrame&
return adoptRefWillBeNoop(new EmptyPopupMenu());
}
PassOwnPtr<ColorChooser> EmptyChromeClient::createColorChooser(LocalFrame*, ColorChooserClient*, const Color&)
PassOwnPtrWillBeRawPtr<ColorChooser> EmptyChromeClient::createColorChooser(LocalFrame*, ColorChooserClient*, const Color&)
{
return nullptr;
}
......
......@@ -144,7 +144,7 @@ public:
virtual void enumerateChosenDirectory(FileChooser*) override { }
virtual PassOwnPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color&) override;
virtual PassOwnPtrWillBeRawPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color&) override;
virtual PassRefPtr<DateTimeChooser> openDateTimeChooser(DateTimeChooserClient*, const DateTimeChooserParameters&) override;
virtual void openTextDataListChooser(HTMLInputElement&) override;
......
......@@ -330,7 +330,7 @@ void Chrome::enumerateChosenDirectory(FileChooser* fileChooser)
m_client->enumerateChosenDirectory(fileChooser);
}
PassOwnPtr<ColorChooser> Chrome::createColorChooser(LocalFrame* frame, ColorChooserClient* client, const Color& initialColor)
PassOwnPtrWillBeRawPtr<ColorChooser> Chrome::createColorChooser(LocalFrame* frame, ColorChooserClient* client, const Color& initialColor)
{
notifyPopupOpeningObservers();
return m_client->createColorChooser(frame, client, initialColor);
......
......@@ -115,7 +115,7 @@ public:
void print(LocalFrame*);
PassOwnPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color& initialColor);
PassOwnPtrWillBeRawPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color& initialColor);
PassRefPtr<DateTimeChooser> openDateTimeChooser(DateTimeChooserClient*, const DateTimeChooserParameters&);
void openTextDataListChooser(HTMLInputElement&);
......@@ -141,6 +141,6 @@ private:
Vector<PopupOpeningObserver*> m_popupOpeningObservers;
};
}
} // namespace blink
#endif // Chrome_h
......@@ -60,8 +60,6 @@ class IntRect;
class LocalFrame;
class Node;
class Page;
class PagePopup;
class PagePopupClient;
class PagePopupDriver;
class PopupMenuClient;
......@@ -159,7 +157,7 @@ public:
virtual bool paintCustomOverhangArea(GraphicsContext*, const IntRect&, const IntRect&, const IntRect&) = 0;
virtual PassOwnPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color&) = 0;
virtual PassOwnPtrWillBeRawPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color&) = 0;
// This function is used for:
// - Mandatory date/time choosers if !ENABLE(INPUT_MULTIPLE_FIELDS_UI)
......@@ -239,5 +237,6 @@ protected:
virtual ~ChromeClient() { }
};
}
} // namespace blink
#endif // ChromeClient_h
......@@ -579,13 +579,13 @@ void ChromeClientImpl::print(LocalFrame* frame)
m_webView->client()->printPage(WebLocalFrameImpl::fromFrame(frame));
}
PassOwnPtr<ColorChooser> ChromeClientImpl::createColorChooser(LocalFrame* frame, ColorChooserClient* chooserClient, const Color&)
PassOwnPtrWillBeRawPtr<ColorChooser> ChromeClientImpl::createColorChooser(LocalFrame* frame, ColorChooserClient* chooserClient, const Color&)
{
OwnPtr<ColorChooserUIController> controller;
OwnPtrWillBeRawPtr<ColorChooserUIController> controller = nullptr;
if (RuntimeEnabledFeatures::pagePopupEnabled())
controller = adoptPtr(new ColorChooserPopupUIController(frame, this, chooserClient));
controller = ColorChooserPopupUIController::create(frame, this, chooserClient);
else
controller = adoptPtr(new ColorChooserUIController(frame, chooserClient));
controller = ColorChooserUIController::create(frame, chooserClient);
controller->openUI();
return controller.release();
}
......
......@@ -51,13 +51,13 @@ class GraphicsLayerFactory;
class HTMLFormControlElement;
class HTMLInputElement;
class KeyboardEvent;
class PagePopup;
class PagePopupClient;
class PopupMenuClient;
class RenderBox;
class SecurityOrigin;
class DateTimeChooser;
class DateTimeChooserClient;
class WebColorChooser;
class WebColorChooserClient;
class WebViewImpl;
struct WebCursorInfo;
struct WebPopupMenuInfo;
......@@ -127,7 +127,7 @@ public:
virtual void print(LocalFrame*) override;
virtual void annotatedRegionsChanged() override;
virtual bool paintCustomOverhangArea(GraphicsContext*, const IntRect&, const IntRect&, const IntRect&) override;
virtual PassOwnPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color&) override;
virtual PassOwnPtrWillBeRawPtr<ColorChooser> createColorChooser(LocalFrame*, ColorChooserClient*, const Color&) override;
virtual PassRefPtr<DateTimeChooser> openDateTimeChooser(DateTimeChooserClient*, const DateTimeChooserParameters&) override;
virtual void openTextDataListChooser(HTMLInputElement&) override;
virtual void runOpenPanel(LocalFrame*, PassRefPtr<FileChooser>) override;
......
......@@ -47,7 +47,6 @@ enum ColorPickerPopupAction {
ColorChooserPopupUIController::ColorChooserPopupUIController(LocalFrame* frame, ChromeClientImpl* chromeClient, ColorChooserClient* client)
: ColorChooserUIController(frame, client)
, m_chromeClient(chromeClient)
, m_client(client)
, m_popup(0)
, m_locale(Locale::defaultLocale())
{
......@@ -55,6 +54,8 @@ ColorChooserPopupUIController::ColorChooserPopupUIController(LocalFrame* frame,
ColorChooserPopupUIController::~ColorChooserPopupUIController()
{
closePopup();
// ~ColorChooserUIController ends the ColorChooser.
}
void ColorChooserPopupUIController::openUI()
......@@ -69,8 +70,8 @@ void ColorChooserPopupUIController::endChooser()
{
if (m_chooser)
m_chooser->endChooser();
if (m_popup)
closePopup();
closePopup();
}
AXObject* ColorChooserPopupUIController::rootAXObject()
......
......@@ -39,7 +39,11 @@ class PagePopup;
class ColorChooserPopupUIController final : public ColorChooserUIController, public PagePopupClient {
public:
ColorChooserPopupUIController(LocalFrame*, ChromeClientImpl*, ColorChooserClient*);
static PassOwnPtrWillBeRawPtr<ColorChooserPopupUIController> create(LocalFrame* frame, ChromeClientImpl* chromeClient, ColorChooserClient* client)
{
return adoptPtrWillBeNoop(new ColorChooserPopupUIController(frame, chromeClient, client));
}
virtual ~ColorChooserPopupUIController();
// ColorChooserUIController functions:
......@@ -60,14 +64,15 @@ public:
virtual void didClosePopup() override;
private:
ColorChooserPopupUIController(LocalFrame*, ChromeClientImpl*, ColorChooserClient*);
void openPopup();
ChromeClientImpl* m_chromeClient;
ColorChooserClient* m_client;
PagePopup* m_popup;
Locale& m_locale;
};
}
} // namespace blink
#endif // ColorChooserPopupUIController_h
......@@ -38,13 +38,23 @@ namespace blink {
ColorChooserUIController::ColorChooserUIController(LocalFrame* frame, ColorChooserClient* client)
: m_frame(frame)
, m_client(client)
: m_client(client)
, m_frame(frame)
{
}
ColorChooserUIController::~ColorChooserUIController()
{
// The client cannot be accessed when finalizing.
m_client = nullptr;
endChooser();
}
void ColorChooserUIController::trace(Visitor* visitor)
{
visitor->trace(m_frame);
visitor->trace(m_client);
ColorChooser::trace(visitor);
}
void ColorChooserUIController::openUI()
......@@ -77,9 +87,9 @@ void ColorChooserUIController::didChooseColor(const WebColor& color)
void ColorChooserUIController::didEndChooser()
{
ASSERT(m_client);
m_chooser = nullptr;
m_client->didEndChooser();
if (m_client)
m_client->didEndChooser();
}
void ColorChooserUIController::openColorChooser()
......
......@@ -27,6 +27,7 @@
#define ColorChooserUIController_h
#include "core/html/forms/ColorChooser.h"
#include "platform/heap/Handle.h"
#include "platform/text/PlatformLocale.h"
#include "public/web/WebColorChooserClient.h"
#include "wtf/OwnPtr.h"
......@@ -37,10 +38,16 @@ class ColorChooserClient;
class LocalFrame;
class WebColorChooser;
class ColorChooserUIController : public WebColorChooserClient, public ColorChooser {
class ColorChooserUIController : public NoBaseWillBeGarbageCollectedFinalized<ColorChooserUIController>, public WebColorChooserClient, public ColorChooser {
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(ColorChooserUIController);
public:
ColorChooserUIController(LocalFrame*, ColorChooserClient*);
static PassOwnPtrWillBeRawPtr<ColorChooserUIController> create(LocalFrame* frame, ColorChooserClient* client)
{
return adoptPtrWillBeNoop(new ColorChooserUIController(frame, client));
}
virtual ~ColorChooserUIController();
virtual void trace(Visitor*) override;
virtual void openUI();
......@@ -54,14 +61,16 @@ public:
virtual void didEndChooser() override final;
protected:
ColorChooserUIController(LocalFrame*, ColorChooserClient*);
void openColorChooser();
OwnPtr<WebColorChooser> m_chooser;
RawPtrWillBeMember<ColorChooserClient> m_client;
private:
LocalFrame* m_frame;
ColorChooserClient* m_client;
RawPtrWillBeMember<LocalFrame> m_frame;
};
}
} // namespace blink
#endif // ColorChooserUIController_h
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