<AWT Dev> com.apple.eawt.Application.setOpenURIHandler does not deliver initial launch URI

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Wed May 29 08:29:28 PDT 2013


Hi, James.
Fix looks fine to me as well.
On 24.05.2013 22:39, James Tomson wrote:
> Hi Anthony,
>
> Thanks for taking a look. To answer your questions, the 
> application:openFiles and application:printFiles methods should not 
> need similar special treatment - the passed instances should be 
> getting implicitly retained and released by the block from my 
> understanding, and can be queued for later processing without a 
> problem. Testing locally with those handlers, the OpenFilesEvent and 
> PrintFilesEvent events on the java-side are delivered without issue 
> when the app is launched from an open file or print file event from 
> the Finder.
>
> The issue with the passed NSAppleEventDescriptors is that while the 
> objects are properly retained and released by the block, the Apple 
> Event Handling system seems to be marking the instance's internal 
> state as otherwise invalid/expired even though the instance itself is 
> still retained. I'm unable to find any specific documentation or 
> discussion about the lifecycle of these event descriptor objects though.
>
> -James
>
>
> On Fri, May 24, 2013 at 12:13 PM, Anthony Petrov 
> <anthony.petrov at oracle.com <mailto:anthony.petrov at oracle.com>> wrote:
>
>     Hi James,
>
>     I like your patch.
>
>     Do you know if other handlers are affected by a similar issue? In
>     particular, the application:openFiles and application:printFiles
>     also take references to NSObjects as their arguments. Could you
>     please test if these handlers are affected or not?
>
>     --
>     best regards,
>     Anthony
>
>
>     On 05/23/2013 10:56 PM, James Tomson wrote:
>
>         Hi - this issue was originally discussed on the jdk7u-dev list
>         here:
>         http://mail.openjdk.java.net/pipermail/jdk7u-dev/2013-May/006446.html
>
>         Additionally a report should be available soon in the bug
>         database as
>         (JDK-8015302)
>         http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8015302
>
>         To summarize, a bundled mac application which registers custom url
>         schemes via the CFBundleURLSchemes entry in its Info.plist,
>         and listens
>         for uri events using
>         com.apple.eawt.Application.setOpenURIHandler, will
>         not receive the URI used to launch the application.
>
>         Once the application is running however, subsequent openURI
>         events will
>         be delivered without issue. The problem only manifests with
>         the URI is
>         used to launch the App initially.
>
>         When the app is opened via URI, the following appears in the
>         system log:
>
>         ----------
>         JavaAppLauncher[74278]: -[NSAppleEventDescriptor
>         paramDescriptorForKeyword:] called on invalid
>         NSAppleEventDescriptor
>         ----------
>
>         It appears that since the QueueingApplicationDelegate is only
>         keeping
>         references to those descriptor objects instead of making deep
>         copies of
>         them,
>         the event descriptor for the initial URI that launches the app is
>         invalidated by the time the app actually gets around to
>         processing it.
>
>         The following patch (same for both jdk8 and jdk7u sources)
>         seems to
>         resolve the issue:
>
>         ----
>         diff --git
>         a/src/macosx/native/sun/osxapp/QueuingApplicationDelegate.m
>         b/src/macosx/native/sun/osxapp/QueuingApplicationDelegate.m
>         --- a/src/macosx/native/sun/osxapp/QueuingApplicationDelegate.m
>         +++ b/src/macosx/native/sun/osxapp/QueuingApplicationDelegate.m
>         @@ -110,8 +110,14 @@
>
>           - (void)_handleOpenURLEvent:(NSAppleEventDescriptor
>         *)openURLEvent
>         withReplyEvent:(NSAppleEventDescriptor *)replyEvent
>           {
>         +    // Make an explicit copy of the passed events as they may be
>         invalidated by the time they're processed
>         +    NSAppleEventDescriptor *openURLEventCopy = [openURLEvent
>         copy];
>         +    NSAppleEventDescriptor *replyEventCopy = [replyEvent copy];
>         +
>               [self.queue addObject:[^(){
>         -        [self.realDelegate _handleOpenURLEvent:openURLEvent
>         withReplyEvent:replyEvent];
>         +        [self.realDelegate _handleOpenURLEvent:openURLEventCopy
>         withReplyEvent:replyEventCopy];
>         +        [openURLEventCopy release];
>         +        [replyEventCopy release];
>               } copy]];
>           }
>         -----
>
>         Please let me know if there is additional information that I
>         can provide
>         - thanks!
>
>         -James
>
>


-- 
Best regards, Sergey.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/awt-dev/attachments/20130529/014946a5/attachment-0001.html 


More information about the awt-dev mailing list