2013-09-16 1 views
3

Я отлаживаю что-то для коллеги, который находится в отпуске и мало что знает о разработке Safari Extension.Получить данные URL и заголовка страницы из SafariNavigateEvent

У меня есть расширение Safari, которое прослушивает события 'open', 'beforeNavigate', 'navigate' и 'activate'. Когда какое-либо из этих событий увольняется, я хочу отслеживать URL-адрес activeTab и заголовок страницы.

Похоже, что в некоторых случаях (а именно beforeNavigate и навигации при открытии новой вкладки) заголовок страницы не всегда определяется либо объектом safari.application.activeBrowserWindow.activeTab, либо объектом event, переданным моим обработчикам.

Когда я печатаю объект события на консоль, он заполняется правильно, но если я получаю доступ к event['target']['title'] непосредственно в обработчике событий, он возвращается Untitled. Я бы предположил, что есть задержка в заполнении данных, но я не могу понять, как справиться с задержкой, и не могу найти на ней никакой документации.

FYI У меня есть доступ к веб-сайту для ВСЕХ в моем info.plist.

Кто-нибудь сталкивался с этой проблемой? Любые мысли о том, как это исправить?

Он фрагмент кода:

safari.application.addEventListener("beforeNavigate", function (event) { 
    console.log('//-- Event Data -------------------------------------'); 
    console.log(event); 
    console.log(event['target']); 
    console.log('Url: ' + event['target']['url']); 
    console.log('Title: ' + event['target']['title']); 

    console.log('//-- Tab Data -------------------------------------'); 
    console.log('Url: ' + safari.application.activeBrowserWindow.activeTab.url); 
    console.log('Title: ' + safari.application.activeBrowserWindow.activeTab.title); 
}, true); 

И выход на консоль:

//-- Event Data ------------------------------------- 
SafariBeforeNavigateEvent 
    BUBBLING_PHASE: 3 
    CAPTURING_PHASE: 1 
    TARGETING_PHASE: 2 
    bubbles: true 
    cancelable: true 
    currentTarget: null 
    defaultPrevented: false 
    eventPhase: 0 
    target: SafariBrowserTab 
     browserWindow: SafariBrowserWindow 
     page: SafariWebPageProxy 
     reader: SafariReader 
     title: "Google" 
     url: "https://www.google.ca/" 
     __proto__: CallbackObject 
    timeStamp: 1379353767889 
    type: "beforeNavigate" 
    url: "http://www.google.ca/" 
    __proto__: CallbackObject 

SafariBrowserTab 
    browserWindow: SafariBrowserWindow 
    page: SafariWebPageProxy 
    reader: SafariReader 
    title: "Google" 
    url: "https://www.google.ca/" 
    __proto__: CallbackObject 
Url: 
Title: Untitled 
//-- Tab Data ------------------------------------- 
Url: 
Title: Untitled 

ответ

0

Я бы предположил, что проблема в том, что название фактически определяется в пределах страницы HTML. Поскольку это событие beforeNavigate, страница еще не загружена, поэтому, как правило, название еще не доступно, просто URL.

Одним из решений может быть использование события navigate вместо beforeNavigate, если вам не нужно ничего делать, прежде чем страница загрузится. Однако я не уверен, что на самом деле гарантирует, что страница будет загружена, но это делает ее более вероятной.

Если проблема по-прежнему возникает, более сложной альтернативой является использование injected script, который отправляет сообщение на глобальную страницу всякий раз, когда загружается страница. Используйте событие готовности DOM в введенном скрипте, а затем просто отправьте сообщение на глобальную страницу, содержащую заголовок страницы. Используйте if (window == window.top), чтобы предотвратить включение встроенных фреймов с отправкой сообщения.

+0

Спасибо за ответ Matt. Я отметил это как правильно. Для моего случая лучшим решением было бы, чтобы вложенный сценарий отправил заголовок страницы и URL-адрес в фоновый скрипт. К сожалению, события, выпущенные из Safari, оказались бесполезными при отслеживании этих данных. Даже события навигации сообщают название страницы undefined или Untitled. В конечном итоге ИМО события должны быть способ сделать это. Ну что ж. – adampetrie