Как определить путь к текущему исполняемому скрипту в JavaScript?

У меня есть расширение для браузера Internet Explorer, которое работает как Browser Helper Object (BHO). Я создал функцию-утилиту на C++, которая добавляется к объекту window страницы. Это позволяет другим скриптам на странице использовать её для динамической загрузки локальных JavaScript файлов.

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

Вот структура вызовов:

  • myUtility() - написана на C++ и доступна в JavaScript страницы
  • file:///путь/к/некоторому/script.js
  • (дополнительные фреймы стека)

Мне нужно из верхнего фрейма получить информацию о том, что скрипт, вызывающий myUtility(), находится по адресу file:///путь/к/некоторому/script.js.

Сначала я думал использовать интерфейс IActiveScriptDebug для получения трассировки стека из моей утилиты. Однако оказалось невозможным получить интерфейс IActiveScript из IWebBrowser2 или связанного документа.

Единственный вариант, который приходит в голову - зарегистрировать собственную реализацию отладчика скриптов и заставить myUtility() войти в режим отладки. Но я сомневаюсь, что это сработает без запроса разрешения у пользователя на вход в отладчик.

Есть ли у кого-нибудь точная информация о том, будет ли такой подход работать? Или может посоветуете альтернативный способ, который позволит функции на C++ получить трассировку стека от движка скриптов, который её вызвал?

Попробуй Error().stack прямо в JS перед вызовом myUtility(). Создай Error объект, достань stack trace и передай в C++ функцию как параметр. В стеке будет полный путь к скрипту. В старых браузерах может не работать, для IE есть new Error().fileName. Гораздо проще чем с дебаггером возиться.

Столкнулся с похожей проблемой с другим BHO. В итоге изменил объект window - добавил специальное свойство, которое обновляется каждый раз, когда загружается скрипт. Создал обёртку, которая записывает путь к скрипту в window.__currentScriptPath перед каждым вызовом myUtility(). А затем просто читаю это свойство в функции C++. Да, решение не самое элегантное, но оно надёжно работает на всех версиях IE.

А почему не передавать путь напрямую? В начале каждого скрипта объявляешь переменную с его расположением и передаёшь в myUtility(). Да, чуть больше работы, но работает везде. Или через document.currentScript.src - хотя не уверен, что IE это поддерживает.