Получение заголовка / местоположения документа Safari с помощью Scripting Bridge не работает в полноэкранном режиме - PullRequest
0 голосов
/ 10 марта 2010

Я пытаюсь получить URL-адрес и заголовок документа из самого верхнего документа / вкладки Safari. У меня есть AppleScript и целевая версия c с использованием инфраструктуры Apple Scripting Bridge.

Обе версии работают нормально для большинства веб-страниц, однако, когда я открываю видео Youtube в полноэкранном режиме, происходит сбой версии на основе Scripting Bridge. Apple Script отлично работает для "нормальных" и полноэкранных окон Safari.

Может кто-нибудь увидеть, что не так с кодом Scripting Bridge, приведенным ниже, чтобы он не работал в полноэкранных окнах Safari?

Вот код (я пропустил проверку ошибок для краткости):

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

Мост сценариев:

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);

Ошибка моста сценариев (с добавлением разрывов строк):

  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)>;
    }

Я не смог найти подробную информацию о данном коде ошибки. Он жалуется на «currentTab», который показывает, что событие JavaScript, по крайней мере, добралось до Safari. Я предполагаю, что текущая вкладка получает событие, но отказывается запускать код JS, потому что он находится в полноэкранном режиме. Однако почему это работает для AppleScript? Разве они не используют один и тот же путь кода?

Любые предложения приветствуются. Спасибо!

Ответы [ 2 ]

1 голос
/ 13 марта 2010

Похоже, что это ошибка в файле заголовка, созданном sdef / sdp - ваш Objective-C не параллелен вашему рабочему AppleScript (и файл заголовка, похоже, указывает на отсутствие doJavaScript: in:, который бы работал на документ, как в вашем AppleScript). Когда я использовал следующий код, который работает параллельно вашему AppleScript, он дал название без ошибок даже для полноэкранного видео на YouTube. Приведение от SafariDocument* к SafariTab* для использования doJavaScript: in: кажется неправильным, но, кажется, работает.

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);
0 голосов
/ 31 декабря 2010
tell application "Safari"
  get URL of current tab of front window
end tell

Objective-C тогда просто

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