Closed Bug 362685 Opened 18 years ago Closed 18 years ago

Growl Integration for Mac OS X (nsIAlertsService)

Categories

(Firefox :: Shell Integration, defect)

PowerPC
macOS
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: sdwilsh, Assigned: sdwilsh)

References

()

Details

Attachments

(2 files, 18 obsolete files)

37.97 KB, patch
Details | Diff | Splinter Review
127.82 KB, patch
Details | Diff | Splinter Review
Implement nsIAlertsService for Mac OS X using Growl, a third-party notification system for Mac OS X. This will be using the sdk without the installer (as per discussions with mconnor).
nsIAlertsService sounds like something that has to do with dialogs. How about nsINotificationService or something like that? Also, is it supposed to be eventually implemented by other platforms or will stay strictly OS X?
Grr, right after comitting the comment, I saw the the service already exists. Ignore me...
Blocks: 282185
So, I need to convert an nsAString to an NSString, and I found a nice file that provides a function to do that for me, but I have no idea how to include it for building purposes. The file is here: http://landfill.mozilla.org/mxr-test/seamonkey/source/embedding/browser/cocoa/src/NSString+Utils.h Suggestions? (either how to not use the file, or how to include it in the build process)
(In reply to comment #3) Until we have helper methods for this in xpcom (there's a bug filed, though I can't find it), you can simply do [NSString stringWithCharacters:aString.BeginReading() length:aString.Length()]
(In reply to comment #4) > (In reply to comment #3) > > Until we have helper methods for this in xpcom (there's a bug filed, though I > can't find it), you can simply do [NSString > stringWithCharacters:aString.BeginReading() length:aString.Length()] That was the first thing I tried actually, but BeginReading() and/or (can't recall) .Length don't seem to be defined for nsAString. I saw your code in which you used nsAutoString and it worked though. Perhaps I'm missing a header or something.
Attached patch v0.1 (obsolete) — Splinter Review
Initial work. This only uses the title and text of the alert, but it shows it can work. The best way to test this is to make sure "browser.download.manager.showAlertOnComplete" is set to true, then download a file that takes a little while to complete. Requirements: You must have the growl framework installed, and located in "/Library/Frameworks/Growl.framework". You can get it here: http://growl.info/downloads_developers.php I can only test this on 10.4. Comments are welcomed.
Attached patch v0.2 (obsolete) — Splinter Review
Alright, so this adds support for images, but it crashes the browser. I'm not really sure why at the moment, but I threw in some printf statements (in patch), and I get the following output before the crash: Registered with Growl Send to the Loader Dispatching With Image So, it looks to me like I might not be doing something correct with Growl, but I'm not really sure. Any thoughts?
Attachment #247921 - Attachment is obsolete: true
Comment on attachment 248178 [details] [diff] [review] v0.2 >+- (id) initWithTitle:(NSString*)aTitle >+ text:(NSString*)aText >+ clickable:(BOOL)aClickable >+ cookie:(NSString*)aCookie >+ observer:(nsIObserver*)aListener >+{ >+ mAlertTitle = aTitle; >+ mAlertText = aText; >+ mAlertClickable = aClickable; >+ mAlertCookie = aCookie; >+ mAlertListener = aClickable ? aListener : nil; You're most likely crashing because you're not retaining these. The objects are since long gone (and the pointers are bogus) when they are passed to Growl. Also, while I'm commenting this method, I'd advice to use the standard init pattern: if ((self = [super init])) { // init stuff here } return self;
Attached patch v0.3 (obsolete) — Splinter Review
...almost I've got an issue with the observers still not working. I'm discussing this on the growl discussion list (the functions are not being called for some strange reason). I also know I should be weak_linking the framework, which I don't do and I'm not really sure how to go about doing that with our build system. My include hack probably isn't correct though. Other that those issues, this patch is basically done, so if someone wants to do a pseudo-review, that'd be greatly appreciated.
Attachment #248178 - Attachment is obsolete: true
Attached patch v0.4 (obsolete) — Splinter Review
h'ok So, this now adds the framework (which you have to supply for now in toolkit/components/alerts/src/mac/) into the application bundle like we have to. Still have an issue with growl telling me I don't supply a registration dictionary, even though I do. I'm still working on resolving that with the growl people. We'll also be building a custom framework of growl that only includes the stuff we need to reduce file size. I've already discussed this with the Growl people, and we'll be keeping a repository over there for it (which I think I volunteered myself to maintain). I would really like to start getting some review-like feedback on what I have, as I'm sure what I'm doing isn't quite ideal everywhere.
Attachment #248670 - Attachment is obsolete: true
Attached patch v0.5 (obsolete) — Splinter Review
Hey, it works! Well, click and timed out listeners don't, but I'm not really sure why. Looking into with the Growl people (looks like my code is right, they just aren't being called). Turns out GrowlDelegate is used inside the framework, so I changed my class to mozGrowlDelegate.
Attachment #250538 - Attachment is obsolete: true
Attached patch 1.0 (obsolete) — Splinter Review
mconnor told me to get a review from josh for this, and bsmedberg for the build stuff. bsmedberg - I'm fairly certain you won't like how I did some of the build stuff (notably the Frameworks directory in the application package). Please provide a suggestion if you don't like how I did it, because that was my best guess at what to do :) This registers itself with growl, and dispatches the notification like it should. It will also does what nsAlertsService does on windows/linux with the observers passed to it.
Attachment #250551 - Attachment is obsolete: true
Attachment #250647 - Flags: review?(joshmoz)
Attachment #250647 - Flags: review?(benjamin)
Comment on attachment 250647 [details] [diff] [review] 1.0 Does this involve putting the growl framework into our tree and shipping it in our app bundle?
(In reply to comment #13) > (From update of attachment 250647 [details] [diff] [review]) > Does this involve putting the growl framework into our tree and shipping it in > our app bundle? yes, and sadly we do not have a choice currently (long winded discussion on irc).
Status: NEW → ASSIGNED
(In reply to comment #14) > (In reply to comment #13) > > (From update of attachment 250647 [details] [diff] [review] [details]) > > Does this involve putting the growl framework into our tree and shipping it in > > our app bundle? > > yes, and sadly we do not have a choice currently (long winded discussion on > irc). > The question (that hopefully has been asked before) is, is that possible to do without growl being tri-licensed?
(In reply to comment #15) > The question (that hopefully has been asked before) is, is that possible to do > without growl being tri-licensed? Type in 'about:license' into the URL bar and you'll see we ship stuff that isn't tri-licensed already.
So, I was lying in bed last night, and I realized that I leak observers if Growl isn't installed. :( That's a known issue with the current patch, but I'd like the rest of the code reviewed still.
Attachment #250647 - Flags: review?(joshmoz)
Attachment #250647 - Flags: review?(benjamin)
Blocks: 308552
Attached patch v1.1 (obsolete) — Splinter Review
Ok, fixes leak and we are back to the framework. My efforts of using a statically linked version of the growl application bridge resulted in a the browser crashing, and since nobody could determine what was going on, I went back with this. This fixes that memory leak I talked about too.
Attachment #250647 - Attachment is obsolete: true
Attachment #253799 - Flags: review?(joshmoz)
Attachment #253799 - Flags: review?(benjamin)
Comment on attachment 253799 [details] [diff] [review] v1.1 I am firmly against supporting growl via this approach. I do not want another third-party bundle in our tree/apps (the other being JEP). I don't think supporting growl is important enough to warrant the pain that this is going to cause. If I am told that we must support growl somehow then I will review with an eye towards alternative solutions first. Sorry!
Attachment #253799 - Flags: review?(joshmoz)
(In reply to comment #19) > (From update of attachment 253799 [details] [diff] [review]) > the pain that this is going to cause. What pain?
- we have to drop new code every time growl updates - we have to coordinate with your OS support schedule (what happens when growl drops 10.3 support and we don't?) - we have to release updates every time something goes majorly wrong in the third party code - we have no idea what the growl project's standards are for code quality and support The Mozilla project and the Growl project basically have nothing in common in terms of our needs, desires, or organization. I see this potentially becoming a problem in the future when we need the growl project to do things to keep our story clean and straight and growl doesn't want to do it. This is less of a problem with JEP since we are the only major consumer of JEP and we work closely with the sole developer. Also, JEP is absolutely necessary while the need for growl is very debatable.
Forgive me if my question is naive, but couldn't you add all the necessary hooks to just utilize Growl without including Growl in your distribution? If Growl isn't installed just pop up a window and say "You need to download and install Growl first, go here and get it." This wouldn't be terribly different from most of the other apps that use Growl (e.g. Adium). Adium ships Growl with its distribution (or so I recall) but doesn't actually install it, that requires user intervention. Growl notifications in Adium are also not enabled by default. The GUI just tells you to install it when you go to enable a feature that requires it, if you don't already have it installed. You could even just link to the website instead of shipping their image. "The Mozilla project and the Growl project basically have nothing in common in terms of our needs, desires, or organization." Only the large (and growing) number of Mac users who would really like to see the two interoperate. You have those in common, they should count for something. Personally, I would really, really like to see Growl support in Fx and Tb. There are probably tons of other Mac users who love Growl and Mozilla and want to see the two play nice also. This sounds like more of a policy problem than a technological one. Please (pretty please?) find a way to implement this that works for you, don't just give up on it.
Attachment #253799 - Flags: review?(benjamin)
Attached patch v2.0 (obsolete) — Splinter Review
static build - this crashes however, but sayrer is going to take a look.
Attachment #253799 - Attachment is obsolete: true
Attached file v2.0 backtrace (obsolete) —
Attached patch v2.1 (obsolete) — Splinter Review
whoops, bad patch
Attachment #256861 - Attachment is obsolete: true
looks like something in growl misbehaving to me... in this stack the JS frame's script name was overwritten as "NSModalPanelRunLoopMode". Date/Time: 2007-03-01 20:53:40.077 -0500 OS Version: 10.4.8 (Build 8L2127) Report Version: 4 Command: firefox-bin Path: /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/firefox-bin Parent: launchd [1] Version: 3.0a3pre (3.0a3pre) PID: 9157 Thread: 0 Exception: EXC_BREAKPOINT (0x0006) Code[0]: 0x00000002 Code[1]: 0x00000000 Thread 0 Crashed: 0 libmozjs.dylib 0x010d2cd3 JS_Assert + 66 (jsutil.c:63) 1 libmozjs.dylib 0x0105ba7a js_AllocStack + 354 (jsinterp.c:346) 2 libxpconnect.dylib 0x2c981fd9 nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS*, unsigned short, XPTMethodDescriptor const*, nsXPTCMiniVariant*) + 1905 (xpcwrappedjsclass.cpp:1176) 3 libxpconnect.dylib 0x2c97b809 nsXPCWrappedJS::CallMethod(unsigned short, XPTMethodDescriptor const*, nsXPTCMiniVariant*) + 97 (xpcwrappedjs.cpp:571) 4 libxpcom_core.dylib 0x0135c2a0 PrepareAndDispatch(nsXPTCStubBase*, unsigned, unsigned*) + 662 (xptcstubs_unixish_x86.cpp:93) 5 libxpcom_core.dylib 0x0135c2fe nsXPTCStubBase::Stub3() + 52 (xptcstubsdef.inc:5) 6 libxpcom_core.dylib 0x0134e813 nsTimerImpl::Fire() + 925 (nsTimerImpl.cpp:387) 7 libxpcom_core.dylib 0x0134e99f nsTimerEvent::Run() + 191 (nsTimerImpl.cpp:458) 8 libxpcom_core.dylib 0x0134aa56 nsThread::ProcessNextEvent(int, int*) + 556 (nsThread.cpp:483) 9 libxpcom_core.dylib 0x012f34ef NS_ProcessPendingEvents_P(nsIThread*, unsigned) + 145 (nsThreadUtils.cpp:179) 10 libwidget_mac.dylib 0x2be57ae9 nsBaseAppShell::NativeEventCallback() + 83 (nsBaseAppShell.cpp:115) 11 libwidget_mac.dylib 0x2be3c6bf nsAppShell::ProcessGeckoEvents() + 253 (nsAppShell.mm:209) 12 libwidget_mac.dylib 0x2be3c801 -[AppShellDelegate handlePortMessage:] + 107 (nsAppShell.mm:420) 13 com.apple.Foundation 0x92646a4c __NSFireMachPort + 307 14 com.apple.CoreFoundation 0x90839773 __CFMachPortPerform + 136 15 com.apple.CoreFoundation 0x90829a14 CFRunLoopRunSpecific + 2904 16 com.apple.CoreFoundation 0x90828eb5 CFRunLoopRunInMode + 61 17 com.apple.HIToolbox 0x92dcdb90 RunCurrentEventLoopInMode + 285 18 com.apple.HIToolbox 0x92dcd1ce ReceiveNextEventCommon + 184 19 com.apple.HIToolbox 0x92dcd0ee BlockUntilNextEventMatchingListInMode + 81 20 com.apple.AppKit 0x9326f465 _DPSNextEvent + 572 21 com.apple.AppKit 0x9326f056 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 137 22 com.apple.AppKit 0x93268ddb -[NSApplication run] + 512 23 libwidget_mac.dylib 0x2be3bd2e nsAppShell::Run() + 146 (nsAppShell.mm:327) 24 libtoolkitcomps.dylib 0x2a62f709 nsAppStartup::Run() + 147 (nsAppStartup.cpp:171) 25 XUL 0x0020fe68 XRE_main + 9632 (nsAppRunner.cpp:2846) 26 org.mozilla.firefox 0x00002eec main + 40 (nsBrowserApp.cpp:62) 27 org.mozilla.firefox 0x00002852 _start + 216 28 org.mozilla.firefox 0x00002779 start + 41 Thread 1: 0 libSystem.B.dylib 0x90019d3c select + 12 1 libnspr4.dylib 0x005cd154 _pr_poll_with_poll + 1333 (ptio.c:3882) 2 libnspr4.dylib 0x005cd3c2 PR_Poll + 31 (ptio.c:4286) 3 libnecko.dylib 0x26274877 nsSocketTransportService::Poll(int, unsigned*) + 223 (nsSocketTransportService2.cpp:329) 4 libnecko.dylib 0x26275669 nsSocketTransportService::DoPollIteration(int) + 803 (nsSocketTransportService2.cpp:604) 5 libnecko.dylib 0x262758b5 nsSocketTransportService::OnProcessNextEvent(nsIThreadInternal*, int, unsigned) + 61 (nsSocketTransportService2.cpp:483) 6 libxpcom_core.dylib 0x0134a952 nsThread::ProcessNextEvent(int, int*) + 296 (nsThread.cpp:472) 7 libxpcom_core.dylib 0x012f338e NS_ProcessNextEvent_P(nsIThread*, int) + 130 (nsThreadUtils.cpp:225) 8 libnecko.dylib 0x262751bf nsSocketTransportService::Run() + 281 (nsSocketTransportService2.cpp:513) 9 libxpcom_core.dylib 0x0134aa56 nsThread::ProcessNextEvent(int, int*) + 556 (nsThread.cpp:483) 10 libxpcom_core.dylib 0x012f338e NS_ProcessNextEvent_P(nsIThread*, int) + 130 (nsThreadUtils.cpp:225) 11 libxpcom_core.dylib 0x0134ac24 nsThread::ThreadFunc(void*) + 262 (nsThread.cpp:250) 12 libnspr4.dylib 0x005ce943 _pt_root + 313 (ptthread.c:223) 13 libSystem.B.dylib 0x90023d87 _pthread_body + 84 Thread 2: 0 libSystem.B.dylib 0x90048a47 semaphore_timedwait_signal_trap + 7 1 libnspr4.dylib 0x005c78f2 pt_TimedWait + 338 (ptsynch.c:280) 2 libnspr4.dylib 0x005c7e0a PR_WaitCondVar + 369 (ptsynch.c:407) 3 libxpcom_core.dylib 0x0134f8e2 TimerThread::Run() + 616 (TimerThread.cpp:322) 4 libxpcom_core.dylib 0x0134aa56 nsThread::ProcessNextEvent(int, int*) + 556 (nsThread.cpp:483) 5 libxpcom_core.dylib 0x012f338e NS_ProcessNextEvent_P(nsIThread*, int) + 130 (nsThreadUtils.cpp:225) 6 libxpcom_core.dylib 0x0134ac24 nsThread::ThreadFunc(void*) + 262 (nsThread.cpp:250) 7 libnspr4.dylib 0x005ce943 _pt_root + 313 (ptthread.c:223) 8 libSystem.B.dylib 0x90023d87 _pthread_body + 84 Thread 3: 0 libSystem.B.dylib 0x90024427 semaphore_wait_signal_trap + 7 1 libnspr4.dylib 0x005c7de5 PR_WaitCondVar + 332 (ptsynch.c:405) 2 libstoragecomps.dylib 0x2a2904a4 ProcessAsyncMessages() + 172 (mozStorageAsyncIO.cpp:1513) 3 libstoragecomps.dylib 0x2a2f0182 AsyncWriteThread::Run() + 80 (mozStorageAsyncIO.cpp:475) 4 libxpcom_core.dylib 0x0134aa56 nsThread::ProcessNextEvent(int, int*) + 556 (nsThread.cpp:483) 5 libxpcom_core.dylib 0x012f338e NS_ProcessNextEvent_P(nsIThread*, int) + 130 (nsThreadUtils.cpp:225) 6 libxpcom_core.dylib 0x0134ac24 nsThread::ThreadFunc(void*) + 262 (nsThread.cpp:250) 7 libnspr4.dylib 0x005ce943 _pt_root + 313 (ptthread.c:223) 8 libSystem.B.dylib 0x90023d87 _pthread_body + 84 Thread 4: 0 libSystem.B.dylib 0x90048a47 semaphore_timedwait_signal_trap + 7 1 libnspr4.dylib 0x005c78f2 pt_TimedWait + 338 (ptsynch.c:280) 2 libnspr4.dylib 0x005c7e0a PR_WaitCondVar + 369 (ptsynch.c:407) 3 libpipnss.dylib 0x281ccd57 nsSSLThread::Run() + 293 (nsSSLThread.cpp:925) 4 libpipnss.dylib 0x281cb17f nsPSMBackgroundThread::nsThreadRunner(void*) + 27 (nsPSMBackgroundThread.cpp:45) 5 libnspr4.dylib 0x005ce943 _pt_root + 313 (ptthread.c:223) 6 libSystem.B.dylib 0x90023d87 _pthread_body + 84 Thread 5: 0 libSystem.B.dylib 0x90048a47 semaphore_timedwait_signal_trap + 7 1 libnspr4.dylib 0x005c78f2 pt_TimedWait + 338 (ptsynch.c:280) 2 libnspr4.dylib 0x005c7e0a PR_WaitCondVar + 369 (ptsynch.c:407) 3 libpipnss.dylib 0x281cd68b nsCertVerificationThread::Run() + 81 (nsCertVerificationThread.cpp:139) 4 libpipnss.dylib 0x281cb17f nsPSMBackgroundThread::nsThreadRunner(void*) + 27 (nsPSMBackgroundThread.cpp:45) 5 libnspr4.dylib 0x005ce943 _pt_root + 313 (ptthread.c:223) 6 libSystem.B.dylib 0x90023d87 _pthread_body + 84 Thread 6: 0 libSystem.B.dylib 0x90024427 semaphore_wait_signal_trap + 7 1 libnspr4.dylib 0x005c7de5 PR_WaitCondVar + 332 (ptsynch.c:405) 2 libnspr4.dylib 0x005c851f PR_Wait + 264 (ptsynch.c:584) 3 libxpcom_core.dylib 0x013a5aaf nsAutoMonitor::Wait(unsigned) + 27 (nsAutoLock.h:322) 4 libxpcom_core.dylib 0x01349189 nsEventQueue::GetEvent(int, nsIRunnable**) + 133 (nsEventQueue.cpp:86) 5 libxpcom_core.dylib 0x013b36d2 nsThread::nsChainedEventQueue::GetEvent(int, nsIRunnable**) + 34 (nsThread.h:110) 6 libxpcom_core.dylib 0x0134a9bc nsThread::ProcessNextEvent(int, int*) + 402 (nsThread.cpp:473) 7 libxpcom_core.dylib 0x012f338e NS_ProcessNextEvent_P(nsIThread*, int) + 130 (nsThreadUtils.cpp:225) 8 libxpcom_core.dylib 0x0134ac24 nsThread::ThreadFunc(void*) + 262 (nsThread.cpp:250) 9 libnspr4.dylib 0x005ce943 _pt_root + 313 (ptthread.c:223) 10 libSystem.B.dylib 0x90023d87 _pthread_body + 84 Thread 0 crashed with X86 Thread State (32-bit): eax: 0x00000078 ebx: 0x010d2c9d ecx: 0xa0001e60 edx: 0x00000000 edi: 0x2c97b7a8 esi: 0x2c981868 ebp: 0xbfffd558 esp: 0xbfffd530 ss: 0x0000001f efl: 0x00000282 eip: 0x010d2cd3 cs: 0x00000017 ds: 0x0000001f es: 0x0000001f fs: 0x00000000 gs: 0x00000037 Binary Images Description: 0x1000 - 0x2fff org.mozilla.firefox 3.0a3pre /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/firefox-bin 0x6000 - 0x7fff libxpcom.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libxpcom.dylib 0x10000 - 0x15fff libplds4.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libplds4.dylib 0x1f000 - 0x25fff libplc4.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libplc4.dylib 0x205000 - 0x253fff XUL /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/XUL 0x5a6000 - 0x5ddfff libnspr4.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libnspr4.dylib 0x6ee000 - 0x6f3fff libauth.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libauth.dylib 0x769000 - 0x77cfff libmozz.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libmozz.dylib 0x798000 - 0x79dfff libcommandlines.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libcommandlines.dylib 0x1008000 - 0x10fdfff libmozjs.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libmozjs.dylib 0x12e6000 - 0x13c4fff libxpcom_core.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libxpcom_core.dylib 0x204d000 - 0x205dfff libbrowserdirprovider.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libbrowserdirprovider.dylib 0x2205000 - 0x2218fff libappcomps.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libappcomps.dylib 0x2380000 - 0x238bfff libautoconfig.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libautoconfig.dylib 0x246f000 - 0x248cfff libcaps.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libcaps.dylib 0x2637000 - 0x2648fff libchardet.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libchardet.dylib 0x275e000 - 0x276bfff libintlapp.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libintlapp.dylib 0xb008000 - 0xb04bfff libbrowsercomps.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libbrowsercomps.dylib 0xb3cd000 - 0xb3e6fff libchrome.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libchrome.dylib 0xb55d000 - 0xb57afff libcomposer.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libcomposer.dylib 0xb811000 - 0xb81efff libcookie.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libcookie.dylib 0xb90b000 - 0xb98cfff libdocshell.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libdocshell.dylib 0xc2a0000 - 0xc38cfff libeditor.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libeditor.dylib 0xd91e000 - 0xd930fff libgkgfx.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libgkgfx.dylib 0xda1b000 - 0xda6bfff libembedcomponents.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libembedcomponents.dylib 0xe07a000 - 0xe093fff libgkgfxthebes.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libgkgfxthebes.dylib 0xe340000 - 0xe3aafff libthebes.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libthebes.dylib 0xe63a000 - 0xee5bfff libgklayout.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libgklayout.dylib 0x24f08000 - 0x24f45fff libgkplugin.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libgkplugin.dylib 0x25348000 - 0x253b1fff libhtmlpars.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libhtmlpars.dylib 0x25837000 - 0x2586afff libi18n.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libi18n.dylib 0x25ae0000 - 0x25aeafff libimgicon.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libimgicon.dylib 0x25bb4000 - 0x25c04fff libimglib2.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libimglib2.dylib 0x25f58000 - 0x25f71fff libjar50.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libjar50.dylib 0x26114000 - 0x2612cfff libjsd.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libjsd.dylib 0x261e1000 - 0x261e2fff libmozfind.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libmozfind.dylib 0x2620d000 - 0x26212fff libMyService.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libMyService.dylib 0x26242000 - 0x26357fff libnecko.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libnecko.dylib 0x2787a000 - 0x278a3fff libnsappshell.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libnsappshell.dylib 0x27caf000 - 0x27cc8fff liboji.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/liboji.dylib 0x27f65000 - 0x27f7efff libjsj.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libjsj.dylib 0x28056000 - 0x2805afff libpermissions.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libpermissions.dylib 0x280d8000 - 0x280e4fff libpipboot.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libpipboot.dylib 0x281c9000 - 0x28245fff libpipnss.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libpipnss.dylib 0x289b3000 - 0x289d7fff libsmime3.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libsmime3.dylib 0x28aeb000 - 0x28b21fff libssl3.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libssl3.dylib 0x28bef000 - 0x28c72fff libnss3.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libnss3.dylib 0x28e6a000 - 0x28eccfff libsoftokn3.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libsoftokn3.dylib 0x28fcf000 - 0x28fd8fff libpippki.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libpippki.dylib 0x29099000 - 0x29109fff libplaces.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libplaces.dylib 0x29897000 - 0x298aafff libpref.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libpref.dylib 0x299c4000 - 0x299fefff librdf.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/librdf.dylib 0x29d73000 - 0x29d9bfff libsatchel.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libsatchel.dylib 0x2a073000 - 0x2a08ffff libspellchecker.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libspellchecker.dylib 0x2a28d000 - 0x2a2f4fff libstoragecomps.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libstoragecomps.dylib 0x2a505000 - 0x2a50afff libtestdynamic.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libtestdynamic.dylib 0x2a53a000 - 0x2a545fff libtkautocomplete.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libtkautocomplete.dylib 0x2a62d000 - 0x2a667fff libtoolkitcomps.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libtoolkitcomps.dylib 0x2aa98000 - 0x2aa9efff libtxmgr.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libtxmgr.dylib 0x2aad4000 - 0x2ab97fff libuconv.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libuconv.dylib 0x2ae80000 - 0x2ae8afff libucvmath.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libucvmath.dylib 0x2af21000 - 0x2af33fff libuniversalchardet.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libuniversalchardet.dylib 0x2af86000 - 0x2afacfff libwebbrwsr.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libwebbrwsr.dylib 0x2b39f000 - 0x2b444fff libwebsrvcs.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libwebsrvcs.dylib 0x2be28000 - 0x2be8cfff libwidget_mac.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libwidget_mac.dylib 0x2c75a000 - 0x2c760fff libwindowds.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libwindowds.dylib 0x2c7bd000 - 0x2c7d1fff libwsproxytest.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libwsproxytest.dylib 0x2c86c000 - 0x2c874fff libxmlextras.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libxmlextras.dylib 0x2c8fc000 - 0x2c903fff libxpcomsample.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libxpcomsample.dylib 0x2c949000 - 0x2c9c1fff libxpconnect.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libxpconnect.dylib 0x2d481000 - 0x2d492fff libxpctest.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libxpctest.dylib 0x2d576000 - 0x2d5c6fff libxpinstall.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/components/libxpinstall.dylib 0x31cd3000 - 0x31cd4fff com.apple.textencoding.unicode 2.1 /System/Library/TextEncodings/Unicode Encodings.bundle/Contents/MacOS/Unicode Encodings 0x3448e000 - 0x344c2fff libnssckbi.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libnssckbi.dylib 0x34895000 - 0x348fefff libfreebl3.dylib /Users/sayrer/firefox/mozilla/fb-debug/dist/MinefieldDebug.app/Contents/MacOS/libfreebl3.dylib 0x8fe00000 - 0x8fe49fff dyld 46.9 /usr/lib/dyld 0x90000000 - 0x9016ffff libSystem.B.dylib /usr/lib/libSystem.B.dylib 0x901bf000 - 0x901c1fff libmathCommon.A.dylib /usr/lib/system/libmathCommon.A.dylib 0x901c3000 - 0x901fffff com.apple.CoreText 1.1.1 (???) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreText.framework/Versions/A/CoreText 0x90226000 - 0x902fcfff ATS /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS 0x9031c000 - 0x90770fff com.apple.CoreGraphics 1.258.38 (???) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics 0x90807000 - 0x908cffff com.apple.CoreFoundation 6.4.6 (368.27) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation 0x9090d000 - 0x9090dfff com.apple.CoreServices 10.4 (???) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices 0x9090f000 - 0x90a02fff libicucore.A.dylib /usr/lib/libicucore.A.dylib 0x90a52000 - 0x90ad1fff libobjc.A.dylib /usr/lib/libobjc.A.dylib 0x90afa000 - 0x90b5efff libstdc++.6.dylib /usr/lib/libstdc++.6.dylib 0x90bcd000 - 0x90bd4fff libgcc_s.1.dylib /usr/lib/libgcc_s.1.dylib 0x90bd9000 - 0x90c4cfff com.apple.framework.IOKit 1.4.6 (???) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit 0x90c61000 - 0x90c73fff libauto.dylib /usr/lib/libauto.dylib 0x90c79000 - 0x90f1ffff com.apple.CoreServices.CarbonCore 682.15 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore 0x90f62000 - 0x90fcafff com.apple.CoreServices.OSServices 4.1 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices 0x91002000 - 0x91040fff com.apple.CFNetwork 129.19 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CFNetwork.framework/Versions/A/CFNetwork 0x91053000 - 0x91063fff com.apple.WebServices 1.1.3 (1.1.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/WebServicesCore.framework/Versions/A/WebServicesCore 0x9106e000 - 0x910ecfff com.apple.SearchKit 1.0.5 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit 0x91121000 - 0x9113ffff com.apple.Metadata 10.4.4 (121.36) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata 0x9114b000 - 0x91159fff libz.1.dylib /usr/lib/libz.1.dylib 0x9115c000 - 0x912fbfff com.apple.security 4.5.2 (29774) /System/Library/Frameworks/Security.framework/Versions/A/Security 0x913f9000 - 0x91401fff com.apple.DiskArbitration 2.1.1 /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration 0x91408000 - 0x9142efff com.apple.SystemConfiguration 1.8.6 /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration 0x91440000 - 0x91447fff libbsm.dylib /usr/lib/libbsm.dylib 0x9144b000 - 0x914c4fff com.apple.audio.CoreAudio 3.0.4 /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio 0x91512000 - 0x91512fff com.apple.ApplicationServices 10.4 (???) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices 0x91514000 - 0x9153ffff com.apple.AE 314 (313) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE 0x91552000 - 0x91626fff com.apple.ColorSync 4.4.8 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync 0x91661000 - 0x916defff com.apple.print.framework.PrintCore 4.6 (177.13) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore 0x9170b000 - 0x917b4fff com.apple.QD 3.10.21 (???) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD 0x917da000 - 0x91825fff com.apple.HIServices 1.5.2 (???) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices 0x91844000 - 0x9185afff com.apple.LangAnalysis 1.6.3 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis 0x91866000 - 0x91880fff com.apple.FindByContent 1.5 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/FindByContent.framework/Versions/A/FindByContent 0x9188a000 - 0x918c7fff com.apple.LaunchServices 181 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices 0x918db000 - 0x918e7fff com.apple.speech.synthesis.framework 3.5 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis 0x918ee000 - 0x91929fff com.apple.ImageIO.framework 1.5.0 /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/ImageIO 0x9193b000 - 0x919edfff libcrypto.0.9.7.dylib /usr/lib/libcrypto.0.9.7.dylib 0x91a33000 - 0x91a49fff libcups.2.dylib /usr/lib/libcups.2.dylib 0x91a4e000 - 0x91a6cfff libJPEG.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib 0x91a71000 - 0x91acffff libJP2.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib 0x91ae1000 - 0x91ae5fff libGIF.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib 0x91ae7000 - 0x91b64fff libRaw.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libRaw.dylib 0x91b68000 - 0x91ba5fff libTIFF.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib 0x91bab000 - 0x91bc5fff libPng.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib 0x91bca000 - 0x91bccfff libRadiance.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib 0x91bce000 - 0x91bcefff com.apple.Accelerate 1.3.1 (Accelerate 1.3.1) /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate 0x91bd0000 - 0x91c5efff com.apple.vImage 2.5 /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage 0x91c65000 - 0x91c65fff com.apple.Accelerate.vecLib 3.3.1 (vecLib 3.3.1) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib 0x91c67000 - 0x91cc0fff libvMisc.dylib /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib 0x91cc9000 - 0x91cedfff libvDSP.dylib /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib 0x91cf5000 - 0x920fefff libBLAS.dylib /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 0x92138000 - 0x924ecfff libLAPACK.dylib /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib 0x92519000 - 0x92597fff com.apple.DesktopServices 1.3.5 /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv 0x925d8000 - 0x92808fff com.apple.Foundation 6.4.7 (567.28) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation 0x92914000 - 0x929f2fff libxml2.2.dylib /usr/lib/libxml2.2.dylib 0x92a0f000 - 0x92afcfff libiconv.2.dylib /usr/lib/libiconv.2.dylib 0x92b0c000 - 0x92b23fff libGL.dylib /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib 0x92b2e000 - 0x92b86fff libGLU.dylib /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib 0x92b9a000 - 0x92b9afff com.apple.Carbon 10.4 (???) /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon 0x92b9c000 - 0x92bacfff com.apple.ImageCapture 3.0.4 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/ImageCapture.framework/Versions/A/ImageCapture 0x92bba000 - 0x92bc2fff com.apple.speech.recognition.framework 3.6 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition 0x92bc8000 - 0x92bcdfff com.apple.securityhi 2.0.1 (24742) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SecurityHI.framework/Versions/A/SecurityHI 0x92bd3000 - 0x92c64fff com.apple.ink.framework 101.2.1 (71) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink 0x92c78000 - 0x92c7bfff com.apple.help 1.0.3 (32.1) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Help.framework/Versions/A/Help 0x92c7e000 - 0x92c9bfff com.apple.openscripting 1.2.5 (???) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/OpenScripting.framework/Versions/A/OpenScripting 0x92cab000 - 0x92cb1fff com.apple.print.framework.Print 5.2 (192.4) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Print.framework/Versions/A/Print 0x92cb7000 - 0x92d1afff com.apple.htmlrendering 66.1 (1.1.3) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HTMLRendering.framework/Versions/A/HTMLRendering 0x92d3e000 - 0x92d7ffff com.apple.NavigationServices 3.4.4 (3.4.3) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/NavigationServices.framework/Versions/A/NavigationServices 0x92da6000 - 0x92db3fff com.apple.audio.SoundManager 3.9.1 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/CarbonSound.framework/Versions/A/CarbonSound 0x92dba000 - 0x92dbffff com.apple.CommonPanels 1.2.3 (73) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/CommonPanels.framework/Versions/A/CommonPanels 0x92dc4000 - 0x930b6fff com.apple.HIToolbox 1.4.8 (???) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox 0x931bb000 - 0x931c6fff com.apple.opengl 1.4.12 /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL 0x93256000 - 0x93256fff com.apple.Cocoa 6.4 (???) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa 0x93258000 - 0x9390efff com.apple.AppKit 6.4.8 (824.42) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit 0x93c8f000 - 0x93d09fff com.apple.CoreData 90 /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData 0x93d42000 - 0x93e03fff com.apple.audio.toolbox.AudioToolbox 1.4.3 /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox 0x93e43000 - 0x93e43fff com.apple.audio.units.AudioUnit 1.4.2 /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit 0x93e45000 - 0x94017fff com.apple.QuartzCore 1.4.9 /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore 0x94068000 - 0x940a9fff libsqlite3.0.dylib /usr/lib/libsqlite3.0.dylib 0x940b1000 - 0x940ebfff libGLImage.dylib /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib 0x94271000 - 0x94280fff libCGATS.A.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Resources/libCGATS.A.dylib 0x94287000 - 0x94292fff libCSync.A.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Resources/libCSync.A.dylib 0x942de000 - 0x942f8fff libRIP.A.dylib /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/Resources/libRIP.A.dylib 0x942fe000 - 0x945b7fff com.apple.QuickTime 7.1.3 /System/Library/Frameworks/QuickTime.framework/Versions/A/QuickTime 0x9707b000 - 0x97080fff com.apple.agl 2.5.9 (AGL-2.5.9) /System/Library/Frameworks/AGL.framework/Versions/A/AGL 0x9aaee000 - 0x9aaf0fff libgmalloc.B.dylib /usr/lib/libgmalloc.B.dylib Model: MacBookPro1,1, BootROM MBP11.0055.B08, 2 processors, Intel Core Duo, 2 GHz, 2 GB Graphics: ATI Radeon X1600, ATY,RadeonX1600, PCIe, 128 MB Memory Module: BANK 0/DIMM0, 1 GB, DDR2 SDRAM, 667 MHz Memory Module: BANK 1/DIMM1, 1 GB, DDR2 SDRAM, 667 MHz AirPort: spairport_wireless_card_type_airport_extreme (0x168C, 0x86), 0.1.27 Bluetooth: Version 1.7.9f12, 2 service, 0 devices, 1 incoming serial ports Network Service: Built-in Ethernet, Ethernet, en0 Serial ATA Device: ST910021AS, 93.16 GB USB Device: Built-in iSight, Micron, Up to 480 Mb/sec, 500 mA USB Device: Apple Internal Keyboard / Trackpad, Apple Computer, Up to 12 Mb/sec, 500 mA USB Device: Bluetooth HCI, Up to 12 Mb/sec, 500 mA USB Device: IR Receiver, Apple Computer, Inc., Up to 12 Mb/sec, 500 mA
Attached patch v2.2 (obsolete) — Splinter Review
Alright, turns out I wasn't compiling a .m file that I should have been compiling. I also realized that I didn't handle a case where the uri fails to resolve. That's taken care of in this code, but I'm not sure if I quite like how I do it (I have very similar code in two different places - problem being I'm not sure where I could stick it to have both places use it). Suggestions welcome on that.
Attachment #256867 - Attachment is obsolete: true
Attachment #256875 - Attachment is obsolete: true
Attachment #257037 - Flags: review?(joshmoz)
(In reply to comment #27) oh yeah - I didn't include any of the growl code in this patch - just my code. The growl code that we build is taken directly to their repo, and once this gets r+ and sr+, I'll attach a patch with the growl code as well.
Attachment #257037 - Flags: review?(cbarrett)
Attachment #257037 - Flags: review?(joshmoz)
Attachment #257037 - Flags: review?(cbarrett)
Attached patch v2.3 (obsolete) — Splinter Review
After talking with Mano a bit today, I decided I wanted to refactor a small part of this code. I've added a static method to mozGrowlDelegate that dispatches the notification to Growl.
Attachment #257037 - Attachment is obsolete: true
Attachment #258063 - Flags: review?(cbarrett)
Comment on attachment 258063 [details] [diff] [review] v2.3 There are at least two things I don't like in this patch that I want to change before getting this reviewed. I might get to that today, but that's iffy. This weekend for sure.
Attachment #258063 - Flags: review?(cbarrett)
Attached patch v2.4 (obsolete) — Splinter Review
Ok, I'm pretty happy with this. I do not have the notification name localized yet, but I'd like to do that in a follow up bug if possible (or after this lands, but in this bug).
Attachment #258063 - Attachment is obsolete: true
Attachment #259473 - Flags: review?(cbarrett)
Comment on attachment 259473 [details] [diff] [review] v2.4 >++ (void) title:(const nsAString&)aTitle >+ text:(const nsAString&)aText >+ image:(NSData*)aImage >+ key:(PRUint32)aKey >+ cookie:(const nsAString&)aCookie; >+ Can you change this, and it's callers, to notifyWithTitle:description:iconData:key:cookie:, to keep as many of the Growl terms around as possible? No need to invent our own vocabulary. >+ if (aKey) You should also check the value of aCookie here. I'd suggest using assertions instead, but that's up to the actual toolkit reviewer. >+- (PRUint32) addObserver:(nsIObserver*)aObserver >+{ >+ NS_ADDREF(aObserver); // We now own a reference to this! >+ >+ mKey++; >+ [mDict setObject: [NSValue valueWithPointer: aObserver] >+ forKey: [NSNumber numberWithUnsignedInt: mKey]]; >+ return mKey; >+} >+ >+- (NSDictionary *) registrationDictionaryForGrowl >+{ >+ return [NSDictionary dictionaryWaithObjectsAndKeys: >+ [NSArray arrayWithObjects: NOTIFICATION_NAME, nil], >+ GROWL_NOTIFICATIONS_ALL, >+ [NSArray arrayWithObjects: NOTIFICATION_NAME, nil], >+ GROWL_NOTIFICATIONS_DEFAULT, >+ nil]; >+} >+ >+- (NSString*) applicationNameForGrowl >+{ >+ if (NS_FAILED(rv)) return nil; How does Growl react to getting a nil from applicationNameForGrowl? I'd expect gracefully, but it'd be nice to make sure. >+- (void) growlNotificationTimedOut:(id)clickContext >+ if (observer) { >+ nsString tmp; >+ tmp.SetLength([cookie length]); >+ [cookie getCharacters:tmp.BeginWriting()]; >+ >+ observer->Observe(nsnull, "alertfinished", tmp.get()); What happens if cookie is a 0 length string? I'm not sure this addresses the issue that was brought up earlier, that we don't register with Growl until we send a notification. This is incorrect -- Growl-supporting apps are supposed to register when they start up. I think observing XPCOM startup would be a good place to do this? I know the WebLock example component has code that loads on startup. Looks good so far! This is getting closer and closer.
maybe you could take a shortcut by basing your code of of the firefox extension on mozilla addons that adds growl support
Attached patch v2.5 (obsolete) — Splinter Review
Addresses your concerns - some of the stuff you asked about we talked about on irc.
Attachment #259473 - Attachment is obsolete: true
Attachment #260712 - Flags: review?(cbarrett)
Attachment #259473 - Flags: review?(cbarrett)
(In reply to comment #32) > >+ if (aKey) > > You should also check the value of aCookie here. I'd suggest using assertions > instead, but that's up to the actual toolkit reviewer. Actually, that last patch doesn't address this. I need to test for this because it indicates if we have an observer stored or not. I do need to check for aCookie though, and I will use an assertion for that. I'll do that after your review however.
Finally got around to finishing looking at it. r=me with the aCookie assertion.
Attachment #260712 - Flags: review?(cbarrett) → review+
Attachment #260712 - Flags: review?(mano)
Attached patch v2.6 (obsolete) — Splinter Review
Addressed concerns by Mano on irc. No need for assertion checking on aCookie as per conversation with cbarrett on irc.
Attachment #260712 - Attachment is obsolete: true
Attachment #262541 - Flags: review?(mano)
Attachment #260712 - Flags: review?(mano)
Comment on attachment 262541 [details] [diff] [review] v2.6 >Index: toolkit/components/build/Makefile.in >=================================================================== >RCS file: /cvsroot/mozilla/toolkit/components/build/Makefile.in,v >retrieving revision 1.41 >diff -u -8 -p -r1.41 Makefile.in >--- toolkit/components/build/Makefile.in 8 Feb 2007 19:23:25 -0000 1.41 >+++ toolkit/components/build/Makefile.in 23 Apr 2007 19:56:45 -0000 >@@ -49,16 +49,20 @@ EXPORT_LIBRARY = 1 > IS_COMPONENT = 1 > MODULE_NAME = nsToolkitCompsModule > LIBXUL_LIBRARY = 1 > > ifneq (,$(filter $(MOZ_WIDGET_TOOLKIT),windows gtk gtk2)) > ALERTS_SERVICE=1 > DEFINES += -DALERTS_SERVICE > endif >+ifneq (,$(filter mac cocoa, $(MOZ_WIDGET_TOOLKIT))) mac widget is deprecated for real by now. > $(NULL) > >+ifdef ALERTS_SERVICE hrm, maybe rename this to XP_ALERTS_SERVICE or such? >Index: toolkit/components/build/nsToolkitCompsModule.cpp >=================================================================== > #ifdef ALERTS_SERVICE > NS_GENERIC_FACTORY_CONSTRUCTOR(nsAlertsService) > #endif > >+#ifdef ALERTS_SERVICE_MAC nit: else if. >Index: toolkit/components/alerts/src/mac/nsAlertsService.h >=================================================================== >+#include "nsToolkitCompsCID.h" what's this for? >+#include "nsCOMPtr.h" >+#include "nsIServiceManager.h" >+#include "nsICategoryManager.h" >+#include "nsMemory.h" those should go to the .mm file. >Index: toolkit/components/alerts/src/mac/nsAlertsService.mm >=================================================================== >+#include "nsAlertsService.h" >+#include "nsStringGlue.h" nsStringAPI.h >+ >+NS_IMETHODIMP >+nsAlertsService::ShowAlertNotification(const nsAString &aImageUrl, >+ const nsAString &aAlertTitle, >+ const nsAString &aAlertText, general nit: s/const nsAString &/const nsAString& / >+ NS_ASSERTION(mDelegate->delegate == [GrowlApplicationBridge growlDelegate], >+ "Growl Delegate was not registered properly."); >+ >+ nsresult rv; >+ >+ PRUint32 ind = 0; >+ if (aAlertListener) >+ ind = [mDelegate->delegate addObserver: aAlertListener]; >+ >+ nsCOMPtr<nsIURI> uri; >+ rv = NS_NewURI(getter_AddRefs(uri), aImageUrl, nsnull, nsnull); the second and third arguments are optional. >+ if (NS_FAILED(rv)) { >+ // image uri failed to resolve, so dispatch to growl with no image >+ [mozGrowlDelegate notifyWithTitle: aAlertTitle >+ description: aAlertText >+ iconData: [NSData data] >+ key: ind >+ cookie: aAlertCookie]; >+ >+ return NS_OK; >+ } >+ >+ nsCOMPtr<nsAlertsImageLoadListener> listener = >+ new nsAlertsImageLoadListener(aAlertTitle, aAlertText, aAlertClickable, >+ aAlertCookie, ind); >+ >+ nsCOMPtr<nsIStreamLoader> loader; >+ rv = NS_NewStreamLoader(getter_AddRefs(loader), uri, listener); rather declare rv here. >+ >+NS_IMETHODIMP >+nsAlertsService::Observe(nsISupports* aSubject, const char* aTopic, >+ const PRUnichar* aData) >+{ >+ if ([GrowlApplicationBridge isGrowlInstalled] == YES && >+ nsCRT::strcmp(aTopic, "app-startup") == 0) >+ [GrowlApplicationBridge setGrowlDelegate: mDelegate->delegate]; >+ >+ return NS_OK; >+} >+ >+NS_METHOD >+nsAlertsServiceRegister(nsIComponentManager* aCompMgr, >+ nsIFile* aPath, >+ const char* registryLocation, >+ const char* componentType, >+ const nsModuleComponentInfo* info) >+{ >+ nsresult rv; >+ >+ nsCOMPtr<nsICategoryManager> catman = >+ do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv); >+ if (NS_FAILED(rv)) return rv; prefer NS_ENSURE_SUCCESS >Index: toolkit/components/alerts/src/mac/mozGrowlDelegate.h >=================================================================== >+// XXX should this be localized? probably :( >+#define NOTIFICATION_NAME @"Application Notice" File a bug? >+ >+/** >+ * Informs us that a Growl notification was clicked. It is only called when >+ * Growl when the notification sent to Growl is sent with a non-nil you may want to rephrase that. >Index: toolkit/components/alerts/src/mac/mozGrowlDelegate.mm >=================================================================== >+ >+ nsCOMPtr<nsIXULAppInfo> appInfo = >+ do_GetService("@mozilla.org/xre/app-info;1", &rv); >+ if (NS_FAILED(rv)) return nil; >+ >+ nsCString appName; >+ rv = appInfo->GetName(appName); >+ if (NS_FAILED(rv)) return nil; >+ NS_ENSURE_SUCCESS(rv, nil); >+ >+ if (observer) { >+ nsString tmp; here you want nsAutoString. looks good otherwise, r=mano.
Attachment #262541 - Flags: review?(mano) → review+
(And I don't think you need to check whether growl is installed in the Observe method, as discussed).
Blocks: 378527
Attached patch v2.7 (obsolete) — Splinter Review
I do believe I've addressed everything insofar as much as I can. I just recently filed Bug 378527 regarding the localization issue, and I updated the comment in mozGrowlDelegate.h accordingly. The growl code will be attached in a bit.
Attachment #262541 - Attachment is obsolete: true
Attached patch Growl Code v1.0 (obsolete) — Splinter Review
Pending license header discussion, this is the code that needs to be checked in for everything to compile and be happy. This is exactly what is part of the Growl 0.7 branch - no modifications on my end.
Attached patch Growl Code v1.1 (obsolete) — Splinter Review
This adds the license.txt to the toolkit/components/alerts/src/mac/growl/ folder, as well as the changes necessary in toolkit/content/license.html
Attachment #262572 - Attachment is obsolete: true
Attached patch v2.8Splinter Review
I managed to miss an ns[C]String->ns[C]AutoString. All fixed.
Attachment #262570 - Attachment is obsolete: true
A couple of comments on the licensing changes: "BSD License" is the wrong title for this license; this is not code from the BSD Unix distribution. Almost every license in that list is a "BSD License" in the same sense that this one is. Please change the title to "Growl License", and move it to the appropriate new place in the alphabetical order. Please also change the text after that to the following (assuming it's factually correct): <p class="correctme">This license applies to certain files in the directory <span class="path">toolkit/components/alers/src/mac/growl/</span>. (This code only ships in the Mac OS X version of this product.) </p> (This matches the line for the Java Embedding Plugin License, which is also Mac-only.) If you need me again, please CC me and I will appear like the proverbial genie :-) Thanks, Gerv
Attached patch Growl Code v1.2Splinter Review
Alright, this should make everyone happy.
Attachment #262575 - Attachment is obsolete: true
Whiteboard: [checkin needed]
Checking in toolkit/components/build/Makefile.in; /cvsroot/mozilla/toolkit/components/build/Makefile.in,v <-- Makefile.in new revision: 1.42; previous revision: 1.41 done Checking in toolkit/components/build/nsToolkitCompsModule.cpp; /cvsroot/mozilla/toolkit/components/build/nsToolkitCompsModule.cpp,v <-- nsToolkitCompsModule.cpp new revision: 1.40; previous revision: 1.39 done Checking in toolkit/components/alerts/Makefile.in; /cvsroot/mozilla/toolkit/components/alerts/Makefile.in,v <-- Makefile.in new revision: 1.6; previous revision: 1.5 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/Makefile.in,v done Checking in toolkit/components/alerts/src/mac/Makefile.in; /cvsroot/mozilla/toolkit/components/alerts/src/mac/Makefile.in,v <-- Makefile.in initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/mozGrowlDelegate.h,v done Checking in toolkit/components/alerts/src/mac/mozGrowlDelegate.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/mozGrowlDelegate.h,v <-- mozGrowlDelegate.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/mozGrowlDelegate.mm,v done Checking in toolkit/components/alerts/src/mac/mozGrowlDelegate.mm; /cvsroot/mozilla/toolkit/components/alerts/src/mac/mozGrowlDelegate.mm,v <-- mozGrowlDelegate.mm initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h,v done Checking in toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.h,v <-- nsAlertsImageLoadListener.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm,v done Checking in toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm; /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsImageLoadListener.mm,v <-- nsAlertsImageLoadListener.mm initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsService.h,v done Checking in toolkit/components/alerts/src/mac/nsAlertsService.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsService.h,v <-- nsAlertsService.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsService.mm,v done Checking in toolkit/components/alerts/src/mac/nsAlertsService.mm; /cvsroot/mozilla/toolkit/components/alerts/src/mac/nsAlertsService.mm,v <-- nsAlertsService.mm initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/CFGrowlAdditions.c,v done Checking in toolkit/components/alerts/src/mac/growl/CFGrowlAdditions.c; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/CFGrowlAdditions.c,v <-- CFGrowlAdditions.c initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/CFGrowlAdditions.h,v done Checking in toolkit/components/alerts/src/mac/growl/CFGrowlAdditions.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/CFGrowlAdditions.h,v <-- CFGrowlAdditions.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlApplicationBridge.h,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlApplicationBridge.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlApplicationBridge.h,v <-- GrowlApplicationBridge.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlApplicationBridge.m,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlApplicationBridge.m; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlApplicationBridge.m,v <-- GrowlApplicationBridge.m initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlDefines.h,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlDefines.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlDefines.h,v <-- GrowlDefines.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlDefinesInternal.h,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlDefinesInternal.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlDefinesInternal.h,v <-- GrowlDefinesInternal.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlPathUtil.h,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlPathUtil.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlPathUtil.h,v <-- GrowlPathUtil.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlPathUtil.m,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlPathUtil.m; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlPathUtil.m,v <-- GrowlPathUtil.m initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlPathway.h,v done Checking in toolkit/components/alerts/src/mac/growl/GrowlPathway.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/GrowlPathway.h,v <-- GrowlPathway.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/Makefile.in,v done Checking in toolkit/components/alerts/src/mac/growl/Makefile.in; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/Makefile.in,v <-- Makefile.in initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/NSURLAdditions.h,v done Checking in toolkit/components/alerts/src/mac/growl/NSURLAdditions.h; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/NSURLAdditions.h,v <-- NSURLAdditions.h initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/NSURLAdditions.m,v done Checking in toolkit/components/alerts/src/mac/growl/NSURLAdditions.m; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/NSURLAdditions.m,v <-- NSURLAdditions.m initial revision: 1.1 done RCS file: /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/license.txt,v done Checking in toolkit/components/alerts/src/mac/growl/license.txt; /cvsroot/mozilla/toolkit/components/alerts/src/mac/growl/license.txt,v <-- license.txt initial revision: 1.1 done Checking in toolkit/content/license.html; /cvsroot/mozilla/toolkit/content/license.html,v <-- license.html new revision: 1.9; previous revision: 1.8 done
Status: ASSIGNED → RESOLVED
Closed: 18 years ago
Resolution: --- → FIXED
Whiteboard: [checkin needed]
Depends on: 378785
I think we should back Growl out until we figure out what we want to do about bug 378785. The freeze is today, it's crashing static builds on launch.
Blocks: 378818
Has Growl been re-enabled now that bug 378785 is fixed?
Yes, Growl should be working on trunk now (assuming you have it installed)
Depends on: 380603
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: