diff --git a/src/core/core_chromium.pri b/src/core/core_chromium.pri
index 08552800d465f7d5a78e83b034873b1fd02850e4..c81b661a6bcf0f5982cac95e99db4ea36341ffcc 100644
--- a/src/core/core_chromium.pri
+++ b/src/core/core_chromium.pri
@@ -78,7 +78,7 @@ SOURCES = \
         proxy_config_service_qt.cpp \
         qrc_protocol_handler_qt.cpp \
         quota_permission_context_qt.cpp \
-        quota_permission_controller.cpp \
+        quota_permission_controller_impl.cpp \
         render_view_context_menu_qt.cpp \
         render_view_observer_host_qt.cpp \
         render_widget_host_view_qt.cpp \
@@ -161,7 +161,7 @@ HEADERS = \
         qrc_protocol_handler_qt.h \
         quota_permission_context_qt.h \
         quota_permission_controller.h \
-        quota_permission_controller_p.h \
+        quota_permission_controller_impl.h \
         render_view_context_menu_qt.h \
         render_view_observer_host_qt.h \
         render_widget_host_view_qt.h \
diff --git a/src/core/quota_permission_context_qt.cpp b/src/core/quota_permission_context_qt.cpp
index 10249bbf0eb0936a4049ddb7acbc757b020c4e43..bb59512c087a9c01af01a1e993a5b4986abc8be2 100644
--- a/src/core/quota_permission_context_qt.cpp
+++ b/src/core/quota_permission_context_qt.cpp
@@ -42,8 +42,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "quota_permission_controller.h"
-#include "quota_permission_controller_p.h"
+#include "quota_permission_controller_impl.h"
 #include "web_contents_delegate_qt.h"
 #include "web_contents_view_qt.h"
 
@@ -83,8 +82,8 @@ void QuotaPermissionContextQt::RequestQuotaPermission(const StorageQuotaParams &
     if (!client)
         return;
 
-    QSharedPointer<QuotaPermissionController> controller(new QuotaPermissionController(new QuotaPermissionControllerPrivate(this, params, callback)));
-    client->runQuotaPermissionRequest(controller);
+    QSharedPointer<QuotaPermissionController> request(new QuotaPermissionControllerImpl(this, params, callback));
+    client->runQuotaPermissionRequest(request);
 }
 
 void QuotaPermissionContextQt::dispatchCallbackOnIOThread(const PermissionCallback &callback,
diff --git a/src/core/quota_permission_controller.h b/src/core/quota_permission_controller.h
index e584d7b52bc4e11254e695bdcf146a57f337c422..cdd5e226a82689ef086a8f615c55d47f1f507d61 100644
--- a/src/core/quota_permission_controller.h
+++ b/src/core/quota_permission_controller.h
@@ -41,28 +41,45 @@
 #define QUOTA_PERMISSION_CONTROLLER_H
 
 #include "qtwebenginecoreglobal.h"
-#include <QtCore/qscopedpointer.h>
 #include <QtCore/qurl.h>
 
 namespace QtWebEngineCore {
 
-class QuotaPermissionContextQt;
-class QuotaPermissionControllerPrivate;
-
 class QWEBENGINE_EXPORT QuotaPermissionController {
 public:
-    QuotaPermissionController(QuotaPermissionControllerPrivate *controllerPrivate);
-    ~QuotaPermissionController();
+    QuotaPermissionController(QUrl origin, qint64 requestedSize)
+        : m_answered(false)
+        , m_origin(std::move(origin))
+        , m_requestedSize(requestedSize)
+    {}
+
+    QUrl origin() const { return m_origin; }
+    qint64 requestedSize() const { return m_requestedSize; }
+
+    void accept() {
+        if (!m_answered) {
+            m_answered = true;
+            accepted();
+        }
+    }
+
+    void reject() {
+        if (!m_answered) {
+            m_answered = true;
+            rejected();
+        }
+    }
 
-    void accept();
-    void reject();
+    virtual ~QuotaPermissionController() {}
 
-    QUrl origin();
-    qint64 requestedSize();
+protected:
+    virtual void accepted() = 0;
+    virtual void rejected() = 0;
 
 private:
-    QScopedPointer<QuotaPermissionControllerPrivate> d;
     bool m_answered;
+    QUrl m_origin;
+    qint64 m_requestedSize;
 };
 
 } // namespace QtWebEngineCore
diff --git a/src/core/quota_permission_controller.cpp b/src/core/quota_permission_controller_impl.cpp
similarity index 57%
rename from src/core/quota_permission_controller.cpp
rename to src/core/quota_permission_controller_impl.cpp
index b874c0449631cce2c599c19cf091de1c5bdc87ed..ebad4b2fbe48bfdd0b7cc5dbd3eeb2338210a69f 100644
--- a/src/core/quota_permission_controller.cpp
+++ b/src/core/quota_permission_controller_impl.cpp
@@ -37,62 +37,31 @@
 **
 ****************************************************************************/
 
-#include "quota_permission_controller.h"
-#include "quota_permission_controller_p.h"
+#include "quota_permission_controller_impl.h"
 
-#include "quota_permission_context_qt.h"
 #include "type_conversion.h"
 
 namespace QtWebEngineCore {
 
-QuotaPermissionControllerPrivate::QuotaPermissionControllerPrivate(QuotaPermissionContextQt *context,
-                                                                   const content::StorageQuotaParams &params,
-                                                                   const content::QuotaPermissionContext::PermissionCallback &callback)
-    : m_context(context),
-      m_originUrl(toQt(params.origin_url)),
-      m_requestedSize(params.requested_size),
-      m_callback(callback)
-{
-}
-
-QuotaPermissionControllerPrivate::~QuotaPermissionControllerPrivate()
-{
-}
-
-QuotaPermissionController::QuotaPermissionController(QuotaPermissionControllerPrivate *controllerPrivate)
-    : d(controllerPrivate)
-    , m_answered(false)
-{
-}
-
-QuotaPermissionController::~QuotaPermissionController()
-{
-}
-
-void QuotaPermissionController::accept()
-{
-    if (!m_answered) {
-        d->m_context->dispatchCallbackOnIOThread(d->m_callback, QuotaPermissionContextQt::QUOTA_PERMISSION_RESPONSE_ALLOW);
-        m_answered = true;
-    }
-}
-
-void QuotaPermissionController::reject()
-{
-    if (!m_answered) {
-        d->m_context->dispatchCallbackOnIOThread(d->m_callback, QuotaPermissionContextQt::QUOTA_PERMISSION_RESPONSE_DISALLOW);
-        m_answered = true;
-    }
-}
+QuotaPermissionControllerImpl::QuotaPermissionControllerImpl(
+    QuotaPermissionContextQt *context,
+    const content::StorageQuotaParams &params,
+    const content::QuotaPermissionContext::PermissionCallback &callback)
+    : QuotaPermissionController(
+        toQt(params.origin_url),
+        params.requested_size)
+    , m_context(context)
+    , m_callback(callback)
+{}
 
-QUrl QuotaPermissionController::origin()
+void QuotaPermissionControllerImpl::accepted()
 {
-    return d->m_originUrl;
+    m_context->dispatchCallbackOnIOThread(m_callback, QuotaPermissionContextQt::QUOTA_PERMISSION_RESPONSE_ALLOW);
 }
 
-qint64 QuotaPermissionController::requestedSize()
+void QuotaPermissionControllerImpl::rejected()
 {
-    return d->m_requestedSize;
+    m_context->dispatchCallbackOnIOThread(m_callback, QuotaPermissionContextQt::QUOTA_PERMISSION_RESPONSE_DISALLOW);
 }
 
 } // namespace QtWebEngineCore
diff --git a/src/core/quota_permission_controller_p.h b/src/core/quota_permission_controller_impl.h
similarity index 78%
rename from src/core/quota_permission_controller_p.h
rename to src/core/quota_permission_controller_impl.h
index c00ae42c9e0e1d61e6d2a6658c8c269c29b54905..297c6711ba2f7d2a22a0cb2ec723c2f772175132 100644
--- a/src/core/quota_permission_controller_p.h
+++ b/src/core/quota_permission_controller_impl.h
@@ -37,30 +37,30 @@
 **
 ****************************************************************************/
 
-#ifndef QUOTA_PERMISSION_CONTROLLER_P_H
-#define QUOTA_PERMISSION_CONTROLLER_P_H
+#ifndef QUOTA_PERMISSION_CONTROLLER_IMPL_H
+#define QUOTA_PERMISSION_CONTROLLER_IMPL_H
 
+#include "quota_permission_controller.h"
 #include "quota_permission_context_qt.h"
-#include <QtCore/qurl.h>
 
 namespace QtWebEngineCore {
 
-class QuotaPermissionControllerPrivate {
+class QuotaPermissionControllerImpl final : public QuotaPermissionController {
 public:
-    QuotaPermissionControllerPrivate(QuotaPermissionContextQt *context,
-                                     const content::StorageQuotaParams &params,
-                                     const content::QuotaPermissionContext::PermissionCallback &callback);
-    ~QuotaPermissionControllerPrivate();
+    QuotaPermissionControllerImpl(
+        QuotaPermissionContextQt *context,
+        const content::StorageQuotaParams &params,
+        const content::QuotaPermissionContext::PermissionCallback &callback);
+
+protected:
+    void accepted() override;
+    void rejected() override;
 
 private:
     scoped_refptr<QuotaPermissionContextQt> m_context;
-    QUrl m_originUrl;
-    qint64 m_requestedSize;
     content::QuotaPermissionContext::PermissionCallback m_callback;
-
-    friend class QuotaPermissionController;
 };
 
 } // namespace QtWebEngineCore
 
-#endif // QUOTA_PERMISSION_CONTROLLER_P_H
+#endif // QUOTA_PERMISSION_CONTROLLER_IMPL_H