WebCore:
authortomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Aug 2006 23:18:36 +0000 (23:18 +0000)
committertomernic <tomernic@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Aug 2006 23:18:36 +0000 (23:18 +0000)
commitb7a8006c455755035ec010c6fa842cfabb799d76
tree36d6ec79455601d053cdc465e738ba4cfe892be4
parent6c0fa375fd95c07ef9cd063118498fd2bfcacedc
WebCore:

        Reviewed by John Sullivan.

        Part of <rdar://problem/4481553> NetscapeMoviePlugIn example code scripting doesn't work in Firefox (4319)
        <http://bugzilla.opendarwin.org/show_bug.cgi?id=4319>: NetscapeMoviePlugIn example code scripting doesn't work
        in Firefox

        No test cases added, since this is essentially a leak fix.

        A brief history of NPP_GetValue(), NPObjects, and reference counting.

        Earlier versions of WebKit incorrectly interpreted the NPRuntime reference counting rules.  We failed to take
        into account the fact that plug-ins are required to retain NPObjects before returning them.  This creates several
        classes of interesting plug-ins:

        1) Plug-ins tested in WebKit and other browsers.  These plug-ins may have WebKit-specific workarounds to not retain
           the returned NPObject, thus avoiding the memory leak in WebKit.

        2) Plug-ins tested only in other browsers.  These plug-ins must already retain their NPObjects, since other browsers
           implemented the NPRuntime retain/release rules correctly.  These plug-ins likely work in WebKit, but probably leak
           NPObjects since WebKit adds its own retain in addition to the plug-in's retain.

        3) Plug-ins tested only in WebKit, that fail to retain their NPObjects before returning them.
           Such plug-ins are guaranteed to crash in other browsers due to the missing expected retain.  These plug-ins
           work in older WebKits because WebKit did not expect the plug-in to retain the NPObject.  Now that our retain
           rules match other browsers, these plug-ins may crash due to the difference in retain/release behavior.  We could
           potentially detect that situation and correct it here, but I consider it a bug that the plug-in did not follow the
           documented NPRuntime reference counting rules.  Furthermore, it is extremely unlikely that someone would develop
           a Netscape plug-in and test it *only* in WebKit.  The entire purpose of creating a Netscape plugin is so that it
           works in all browsers!

        4) Plug-ins tested only in WebKit, that properly retain their NPObjects before returning them.
           These plug-ins probably work in other browsers, and leak their NPObjects in older WebKits because of WebKit's
           extra retain.  A developer of this type of plug-in is probably unaware of the NPObject leak.  A more savvy developer
           would create a plug-in that fits into category #1.

        I am changing our NPP_GetValue() behavior to match Firefox and other browsers -- the plug-in is now expected to retain the
        returned NPObject, and the browser is expected to release it when done.  This means that plug-ins in category #3 need to be
        changed so that they don't crash in Safari.  However, such plug-ins already crash in every other browser, so I do not feel that
        this needs to be handled specifically by WebKit.

        * bridge/mac/FrameMac.mm:
        Changed -pluginScriptableObject to -createPluginScriptableObject to make clearer the contract that the method must return a
        retained NPObject.  Also changed it to return an actual NPObject* instead of a void*.  There is only one caller of this method,
        and only one implementor.  Using void* here is a needless abstraction.  It's an NPObject*!  Admit it!
        (WebCore::getInstanceForView):
        Release the NPObject after creating the bindings instance.  This is the actual bug fix.

WebKit:

        Reviewed by John Sullivan.

        Part of <rdar://problem/4481553> NetscapeMoviePlugIn example code scripting doesn't work in Firefox (4319)
        <http://bugzilla.opendarwin.org/show_bug.cgi?id=4319>: NetscapeMoviePlugIn example code scripting doesn't work
        in Firefox

        * Plugins/WebBaseNetscapePluginView.h:
        * Plugins/WebBaseNetscapePluginView.m:
        (-[WebBaseNetscapePluginView createPluginScriptableObject]):
        Renamed this method (see corresponding WebCore ChangeLog entry for an explanation).
        Style changes.

WebKitTools:

        Reviewed by John Sullivan.

        Part of <rdar://problem/4481553> NetscapeMoviePlugIn example code scripting doesn't work in Firefox (4319)
        <http://bugzilla.opendarwin.org/show_bug.cgi?id=4319>: NetscapeMoviePlugIn example code scripting doesn't work
        in Firefox

        * DumpRenderTree/TestNetscapePlugIn.subproj/main.c:
        (NPP_GetValue):
        WebKit's NPP_GetValue() reference counting behavior has been changed to match Firefox.  NPObject return values
        are expected to be retained by the plug-in, and released by the caller.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16086 268f45cc-cd09-0410-ab3c-d52691b4dbfc
WebCore/ChangeLog
WebCore/bridge/mac/FrameMac.mm
WebKit/ChangeLog
WebKit/Plugins/WebBaseNetscapePluginView.h
WebKit/Plugins/WebBaseNetscapePluginView.m
WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/TestNetscapePlugIn.subproj/main.c