Changeset 187338 in webkit


Ignore:
Timestamp:
Jul 24, 2015 5:06:34 AM (9 years ago)
Author:
Carlos Garcia Campos
Message:

[GStreamer] Crashes during plugin installation
https://bugs.webkit.org/show_bug.cgi?id=144099

Reviewed by Philippe Normand.

Source/WebCore:

Add new methods to MediaPlayerClient and ChromeClient to request
the API layer to start the installer when there are missing media
plugins.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::requestInstallMissingPlugins): Pass
the request to the ChromeClient.

  • html/HTMLMediaElement.h:
  • page/ChromeClient.h:
  • platform/graphics/MediaPlayer.h:

(WebCore::MediaPlayerClient::requestInstallMissingPlugins):

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:

(WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
Invalidate any pending request to install missing media plugins.
(WebCore::MediaPlayerPrivateGStreamer::handleMessage): In case of
missing plugins message, start a request to install them if
supported by GST.

  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:

(WebCore::MediaPlayerRequestInstallMissingPluginsCallback::create):
(WebCore::MediaPlayerRequestInstallMissingPluginsCallback::MediaPlayerRequestInstallMissingPluginsCallback):
(WebCore::MediaPlayerRequestInstallMissingPluginsCallback::invalidate):
(WebCore::MediaPlayerRequestInstallMissingPluginsCallback::complete):

Source/WebKit2:

Move the missing plugins installation to the UI process, ensuring
there's a single installer running and cancelling the request when
the page is closed or the media player is deleted.

  • PlatformEfl.cmake: Add new files to compilation.
  • PlatformGTK.cmake: Ditto.
  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in: Add

RequestInstallMissingMediaPlugins message.

  • UIProcess/gstreamer/WebPageProxyGStreamer.cpp: Added.

(WebKit::WebPageProxy::requestInstallMissingMediaPlugins): Call
gst_install_plugins_async() and send
DidEndRequestInstallMissingMediaPlugins message back to the web
process when done.

  • WebProcess/WebCoreSupport/WebChromeClient.cpp:

(WebKit::WebChromeClient::requestInstallMissingMediaPlugins): Call
WebPage::requestInstallMissingMediaPlugins().

  • WebProcess/WebCoreSupport/WebChromeClient.h:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::close): Invalidate the install missing plugins
request callback.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in: Add

DidEndRequestInstallMissingMediaPlugins message.

  • WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp: Added.

(WebKit::WebPage::requestInstallMissingMediaPlugins): Send
RequestInstallMissingMediaPlugins to the UI process or complete
the request early if there's already a request in progress.
(WebKit::WebPage::didEndRequestInstallMissingMediaPlugins):
Complete the request.

Location:
trunk/Source
Files:
5 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r187287 r187338  
     12015-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GStreamer] Crashes during plugin installation
     4        https://bugs.webkit.org/show_bug.cgi?id=144099
     5
     6        Reviewed by Philippe Normand.
     7
     8        Add new methods to MediaPlayerClient and ChromeClient to request
     9        the API layer to start the installer when there are missing media
     10        plugins.
     11
     12        * html/HTMLMediaElement.cpp:
     13        (WebCore::HTMLMediaElement::requestInstallMissingPlugins): Pass
     14        the request to the ChromeClient.
     15        * html/HTMLMediaElement.h:
     16        * page/ChromeClient.h:
     17        * platform/graphics/MediaPlayer.h:
     18        (WebCore::MediaPlayerClient::requestInstallMissingPlugins):
     19        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     20        (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
     21        Invalidate any pending request to install missing media plugins.
     22        (WebCore::MediaPlayerPrivateGStreamer::handleMessage): In case of
     23        missing plugins message, start a request to install them if
     24        supported by GST.
     25        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
     26        (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::create):
     27        (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::MediaPlayerRequestInstallMissingPluginsCallback):
     28        (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::invalidate):
     29        (WebCore::MediaPlayerRequestInstallMissingPluginsCallback::complete):
     30
    1312015-07-23  Alex Christensen  <achristensen@webkit.org>
    232
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r187272 r187338  
    60676067}
    60686068
     6069#if USE(GSTREAMER)
     6070void HTMLMediaElement::requestInstallMissingPlugins(const String& details, MediaPlayerRequestInstallMissingPluginsCallback& callback)
     6071{
     6072    if (!document().page())
     6073        return;
     6074
     6075    document().page()->chrome().client().requestInstallMissingMediaPlugins(details, callback);
     6076}
     6077#endif
     6078
    60696079void HTMLMediaElement::removeBehaviorsRestrictionsAfterFirstUserGesture()
    60706080{
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r187257 r187338  
    611611    virtual VideoFullscreenMode mediaPlayerFullscreenMode() const override final { return fullscreenMode(); }
    612612
     613#if USE(GSTREAMER)
     614    virtual void requestInstallMissingPlugins(const String&, MediaPlayerRequestInstallMissingPluginsCallback&) override final;
     615#endif
     616
    613617    void pendingActionTimerFired();
    614618    void progressEventTimerFired();
  • trunk/Source/WebCore/page/ChromeClient.h

    r187272 r187338  
    9292class Widget;
    9393
     94#if ENABLE(VIDEO) && USE(GSTREAMER)
     95class MediaPlayerRequestInstallMissingPluginsCallback;
     96#endif
     97
    9498struct DateTimeChooserParameters;
    9599struct FrameLoadRequest;
     
    452456#if ENABLE(VIDEO)
    453457    virtual void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&) { }
     458#if USE(GSTREAMER)
     459    virtual void requestInstallMissingMediaPlugins(const String& /*details*/, MediaPlayerRequestInstallMissingPluginsCallback&) { };
     460#endif
    454461#endif
    455462
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r186020 r187338  
    149149#endif
    150150
     151#if USE(GSTREAMER)
     152class MediaPlayerRequestInstallMissingPluginsCallback;
     153#endif
     154
    151155class MediaPlayerClient {
    152156public:
     
    279283    virtual MediaPlayerEnums::VideoFullscreenMode mediaPlayerFullscreenMode() const { return MediaPlayerEnums::VideoFullscreenModeNone; }
    280284    virtual Vector<String> mediaPlayerPreferredAudioCharacteristics() const { return Vector<String>(); }
     285
     286#if USE(GSTREAMER)
     287    virtual void requestInstallMissingPlugins(const String&, MediaPlayerRequestInstallMissingPluginsCallback&) { };
     288#endif
    281289};
    282290
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r186769 r187338  
    3232#include "MIMETypeRegistry.h"
    3333#include "MediaPlayer.h"
     34#include "MediaPlayerRequestInstallMissingPluginsCallback.h"
    3435#include "NotImplemented.h"
    3536#include "SecurityOrigin.h"
     
    123124}
    124125#endif
    125 
    126 static void mediaPlayerPrivatePluginInstallerResultFunction(GstInstallPluginsReturn result, gpointer userData)
    127 {
    128     MediaPlayerPrivateGStreamer* player = reinterpret_cast<MediaPlayerPrivateGStreamer*>(userData);
    129     player->handlePluginInstallerResult(result);
    130 }
    131126
    132127void MediaPlayerPrivateGStreamer::setAudioStreamProperties(GObject* object)
     
    217212#endif
    218213    , m_requestedState(GST_STATE_VOID_PENDING)
    219     , m_missingPlugins(false)
    220214{
    221215}
     
    246240
    247241    m_readyTimerHandler.cancel();
     242    if (m_missingPluginsCallback) {
     243        m_missingPluginsCallback->invalidate();
     244        m_missingPluginsCallback = nullptr;
     245    }
    248246
    249247    if (m_pipeline) {
     
    935933        if (m_resetPipeline)
    936934            break;
    937         if (m_missingPlugins)
     935        if (m_missingPluginsCallback)
    938936            break;
    939937        gst_message_parse_error(message, &err.outPtr(), &debug.outPtr());
     
    10301028    case GST_MESSAGE_ELEMENT:
    10311029        if (gst_is_missing_plugin_message(message)) {
    1032             gchar* detail = gst_missing_plugin_message_get_installer_detail(message);
    1033             gchar* detailArray[2] = {detail, 0};
    1034             GstInstallPluginsReturn result = gst_install_plugins_async(detailArray, 0, mediaPlayerPrivatePluginInstallerResultFunction, this);
    1035             m_missingPlugins = result == GST_INSTALL_PLUGINS_STARTED_OK;
    1036             g_free(detail);
     1030            GUniquePtr<char> detail(gst_missing_plugin_message_get_installer_detail(message));
     1031            if (gst_install_plugins_supported()) {
     1032                m_missingPluginsCallback = MediaPlayerRequestInstallMissingPluginsCallback::create([this](uint32_t result) {
     1033                    m_missingPluginsCallback = nullptr;
     1034                    if (result != GST_INSTALL_PLUGINS_SUCCESS)
     1035                        return;
     1036
     1037                    changePipelineState(GST_STATE_READY);
     1038                    changePipelineState(GST_STATE_PAUSED);
     1039                });
     1040                m_player->client().requestInstallMissingPlugins(String::fromUTF8(detail.get()), *m_missingPluginsCallback);
     1041            }
    10371042        }
    10381043#if ENABLE(VIDEO_TRACK) && USE(GSTREAMER_MPEGTS)
     
    10571062    }
    10581063    return TRUE;
    1059 }
    1060 
    1061 void MediaPlayerPrivateGStreamer::handlePluginInstallerResult(GstInstallPluginsReturn result)
    1062 {
    1063     m_missingPlugins = false;
    1064     if (result == GST_INSTALL_PLUGINS_SUCCESS) {
    1065         changePipelineState(GST_STATE_READY);
    1066         changePipelineState(GST_STATE_PAUSED);
    1067     }
    10681064}
    10691065
  • trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r186769 r187338  
    5959class InbandMetadataTextTrackPrivateGStreamer;
    6060class InbandTextTrackPrivateGStreamer;
     61class MediaPlayerRequestInstallMissingPluginsCallback;
    6162class VideoTrackPrivateGStreamer;
    6263
     
    235236    GstState m_requestedState;
    236237    GRefPtr<GstElement> m_autoAudioSink;
    237     bool m_missingPlugins;
     238    RefPtr<MediaPlayerRequestInstallMissingPluginsCallback> m_missingPluginsCallback;
    238239#if ENABLE(VIDEO_TRACK)
    239240    Vector<RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
  • trunk/Source/WebKit2/ChangeLog

    r187337 r187338  
     12015-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GStreamer] Crashes during plugin installation
     4        https://bugs.webkit.org/show_bug.cgi?id=144099
     5
     6        Reviewed by Philippe Normand.
     7
     8        Move the missing plugins installation to the UI process, ensuring
     9        there's a single installer running and cancelling the request when
     10        the page is closed or the media player is deleted.
     11
     12        * PlatformEfl.cmake: Add new files to compilation.
     13        * PlatformGTK.cmake: Ditto.
     14        * UIProcess/WebPageProxy.h:
     15        * UIProcess/WebPageProxy.messages.in: Add
     16        RequestInstallMissingMediaPlugins message.
     17        * UIProcess/gstreamer/WebPageProxyGStreamer.cpp: Added.
     18        (WebKit::WebPageProxy::requestInstallMissingMediaPlugins): Call
     19        gst_install_plugins_async() and send
     20        DidEndRequestInstallMissingMediaPlugins message back to the web
     21        process when done.
     22        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
     23        (WebKit::WebChromeClient::requestInstallMissingMediaPlugins): Call
     24        WebPage::requestInstallMissingMediaPlugins().
     25        * WebProcess/WebCoreSupport/WebChromeClient.h:
     26        * WebProcess/WebPage/WebPage.cpp:
     27        (WebKit::WebPage::close): Invalidate the install missing plugins
     28        request callback.
     29        * WebProcess/WebPage/WebPage.h:
     30        * WebProcess/WebPage/WebPage.messages.in: Add
     31        DidEndRequestInstallMissingMediaPlugins message.
     32        * WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp: Added.
     33        (WebKit::WebPage::requestInstallMissingMediaPlugins): Send
     34        RequestInstallMissingMediaPlugins to the UI process or complete
     35        the request early if there's already a request in progress.
     36        (WebKit::WebPage::didEndRequestInstallMissingMediaPlugins):
     37        Complete the request.
     38
    1392015-07-24  Carlos Garcia Campos  <cgarcia@igalia.com>
    240
  • trunk/Source/WebKit2/PlatformEfl.cmake

    r187191 r187338  
    184184    UIProcess/efl/WebViewEfl.cpp
    185185
     186    UIProcess/gstreamer/WebPageProxyGStreamer.cpp
     187
    186188    UIProcess/soup/WebCookieManagerProxySoup.cpp
    187189    UIProcess/soup/WebProcessPoolSoup.cpp
     
    216218    WebProcess/WebPage/efl/WebInspectorUIEfl.cpp
    217219    WebProcess/WebPage/efl/WebPageEfl.cpp
     220
     221    WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp
    218222
    219223    WebProcess/efl/ExtensionManagerEfl.cpp
     
    287291    ${EVAS_INCLUDE_DIRS}
    288292    ${GLIB_INCLUDE_DIRS}
     293    ${GSTREAMER_INCLUDE_DIRS}
    289294    ${HARFBUZZ_INCLUDE_DIRS}
    290295    ${LIBSOUP_INCLUDE_DIRS}
  • trunk/Source/WebKit2/PlatformGTK.cmake

    r187191 r187338  
    291291    UIProcess/cairo/BackingStoreCairo.cpp
    292292
     293    UIProcess/gstreamer/WebPageProxyGStreamer.cpp
     294
    293295    UIProcess/gtk/DragAndDropHandler.cpp
    294296    UIProcess/gtk/ExperimentalFeatures.cpp
     
    341343
    342344    WebProcess/WebPage/atk/WebPageAccessibilityObjectAtk.cpp
     345
     346    WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp
    343347
    344348    WebProcess/WebPage/gtk/PrinterListGtk.cpp
     
    516520    ${ENCHANT_INCLUDE_DIRS}
    517521    ${GEOCLUE_INCLUDE_DIRS}
     522    ${GSTREAMER_INCLUDE_DIRS}
    518523    ${HARFBUZZ_INCLUDE_DIRS}
    519524    ${LIBSOUP_INCLUDE_DIRS}
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r187272 r187338  
    14801480#if ENABLE(VIDEO)
    14811481    void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&);
     1482#if USE(GSTREAMER)
     1483    void requestInstallMissingMediaPlugins(const String& details);
     1484#endif
    14821485#endif
    14831486
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r187272 r187338  
    451451    UseFixedLayoutDidChange(bool useFixedLayout)
    452452    FixedLayoutSizeDidChange(WebCore::IntSize fixedLayoutSize)
     453
     454#if ENABLE(VIDEO) && USE(GSTREAMER)
     455    RequestInstallMissingMediaPlugins(String details)
     456#endif
    453457}
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp

    r187272 r187338  
    11641164    m_page->mediaDocumentNaturalSizeChanged(newSize);
    11651165}
    1166 #endif
     1166
     1167#if USE(GSTREAMER)
     1168void WebChromeClient::requestInstallMissingMediaPlugins(const String& details, WebCore::MediaPlayerRequestInstallMissingPluginsCallback& callback)
     1169{
     1170    m_page->requestInstallMissingMediaPlugins(details, callback);
     1171}
     1172#endif
     1173#endif // ENABLE(VIDEO)
    11671174
    11681175} // namespace WebKit
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h

    r187272 r187338  
    326326#if ENABLE(VIDEO)
    327327    virtual void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&) override;
     328#if USE(GSTREAMER)
     329    virtual void requestInstallMissingMediaPlugins(const String&, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&) override;
     330#endif
    328331#endif
    329332
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r187272 r187338  
    217217#endif
    218218
     219#if ENABLE(VIDEO) && USE(GSTREAMER)
     220#include <WebCore/MediaPlayerRequestInstallMissingPluginsCallback.h>
     221#endif
     222
    219223using namespace JSC;
    220224using namespace WebCore;
     
    962966        m_printOperation->disconnectFromPage();
    963967        m_printOperation = nullptr;
     968    }
     969#endif
     970
     971#if ENABLE(VIDEO) && USE(GSTREAMER)
     972    if (m_installMediaPluginsCallback) {
     973        m_installMediaPluginsCallback->invalidate();
     974        m_installMediaPluginsCallback = nullptr;
    964975    }
    965976#endif
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h

    r187272 r187338  
    140140struct MediaPlaybackTargetContext;
    141141struct TextCheckingResult;
     142
     143#if ENABLE(VIDEO) && USE(GSTREAMER)
     144class MediaPlayerRequestInstallMissingPluginsCallback;
     145#endif
    142146}
    143147
     
    905909#if ENABLE(VIDEO)
    906910    void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&);
     911#if USE(GSTREAMER)
     912    void requestInstallMissingMediaPlugins(const String& details, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&);
     913#endif
    907914#endif
    908915
     
    11531160
    11541161    void pageStoppedScrolling();
     1162
     1163#if ENABLE(VIDEO) && USE(GSTREAMER)
     1164    void didEndRequestInstallMissingMediaPlugins(uint32_t result);
     1165#endif
    11551166
    11561167    uint64_t m_pageID;
     
    14031414    bool m_inputMethodEnabled { false };
    14041415#endif
     1416
     1417#if ENABLE(VIDEO) && USE(GSTREAMER)
     1418    RefPtr<WebCore::MediaPlayerRequestInstallMissingPluginsCallback> m_installMediaPluginsCallback;
     1419#endif
    14051420};
    14061421
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in

    r187258 r187338  
    436436    SetShouldScaleViewToFitDocument(bool shouldScaleViewToFitDocument)
    437437    SetUserContentExtensionsEnabled(bool userContentExtensionsEnabled)
     438
     439#if ENABLE(VIDEO) && USE(GSTREAMER)
     440    DidEndRequestInstallMissingMediaPlugins(uint32_t result)
     441#endif
    438442}
Note: See TracChangeset for help on using the changeset viewer.