开发者

Getting Safari document title/location with Scripting Bridge does not work in full-screen mode

开发者 https://www.devze.com 2022-12-22 23:36 出处:网络
I\'m trying to get the URL and document title from the topmost Safari document/tab. I have an AppleScript and an objective-c version using Apple\'s Scripting Bridge framework.

I'm trying to get the URL and document title from the topmost Safari document/tab. I have an AppleScript and an objective-c version using Apple's Scripting Bridge framework.

Both versions work fine for most web pages, however when I open a Youtube video in full-screen mode, the Scripting Bridge based version fails. The Apple Script works fine for "normal" and full-screen Safari windows.

Can anyone see what is wrong with the Scripting Bridge code below to cause it to fail for full-screen Safari windows?

Here the code (I omitted error checking for brevity):

AppleScript:

tell application "Safari"
 # Give us some time to open video in full-screen mode
 delay 10
 do JavaScript "document.title" in document 0
end tell

Scripting Bridge:

SafariApplication* safari = [SBApplication applicationWithBundleIdentifier:@"com.apple.Safari"];

SBElementArray* windows = [safari windows];
SafariTab* currentTab = [[windows objectAtIndex: 0] currentTab];

// This fails when in full-screen mode:
id result = [safari doJavaScript: @"document.title" in: currentTab];
NSLog(@"title: %@", result);

Scripting Bridge error 开发者_如何学Go(with added line breaks):

  Apple event returned an error.  Event = 'sfri'\'dojs'{
   '----':'utxt'("document.title"),
   'dcnm':'obj '{ 'want':'prop',
                  'from':'obj '{ 'want':'cwin', 
                                 'from':'null'(),
                                 'form':'indx',
                                 'seld':1 },
                  'form':'prop',
                  'seld':'cTab' }
                }
    Error info = {
        ErrorNumber = -1728;
        ErrorOffendingObject = <SBObject @0x175c2de0: 
                   currentTab of SafariWindow 0 of application "Safari" (238)>;
    }

I could not find details about the given error code. It complains about 'currentTab' which shows that the JavaScript event at least made it all the way to Safari. I assume that the current tab receives the event, but refuses to run the JS code, because it is in full-screen mode. However, why does this work for an AppleScript? Don't they use the same code path eventually?

Any suggestions are greatly appreciated. Thanks!


This appears to be a failure in the header file created by sdef/sdp--your Objective-C does not parallel your working AppleScript (and the header file seemed to indicate that there is no doJavaScript:in: that would work on a document, as in your AppleScript). When I used the following code, which does parallel your AppleScript, it gave the title without error even for a full-screen YouTube video. The cast from SafariDocument* to SafariTab* in order to use doJavaScript:in: feels wrong, but seems to work.

SafariApplication* safari = [SBApplication applicationWithBundleIdentifier:@"com.apple.Safari"];

SBElementArray* documents = [safari documents];
SafariDocument* frontDocument = [documents objectAtIndex: 0];

// This *no longer* fails when in full-screen mode:
id result = [safari doJavaScript: @"document.title" in: (SafariTab *) frontDocument];
NSLog(@"title: %@", result);


tell application "Safari"
  get URL of current tab of front window
end tell

The Objective-C is then simply

SafariApplication* safari = [SBApplication 
                            applicationWithBundleIdentifier:@"com.apple.Safari"];
for (SafariWindow *window in safari.windows) {
  if ([window visible]) {
    result = window.currentTab.URL;
    break;
  }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号