Mamy rozszerzenie IE zaimplementowane jako obiekt pomocnika przeglądarki (BHO). Mamy funkcję narzędzia napisaną w C++, którą dodajemy do obiektu okna strony, aby inne skrypty na stronie mogły jej używać do dynamicznego ładowania lokalnych skryptów. W celu rozwiązania względnych ścieżek do tych lokalnych plików skryptów, jednak musimy określić ścieżkę do pliku JavaScript, który wywołuje naszą funkcję:Jak uzyskać ścieżkę do aktualnie uruchomionego skryptu za pomocą JavaScript?
myfunc()
napisany w C++ i narażeni na stronie jest JavaScript- pliku: ///path/to/some/javascript.js
- (dodatkowe ramki stosu)
z górnej ramie chcę uzyskać informację, że skrypt dzwoniąc myfunc()
znajduje się w file: /// ścieżka /to/some/javascript.js.
Najpierw oczekiwałem, że możemy po prostu użyć interfejsu IActiveScriptDebug
, aby pobrać stos z naszej funkcji narzędzia. Jednak wydaje się niemożliwe uzyskanie interfejsu IActiveScript
z interfejsu IWebBrowser2
lub powiązanego dokumentu (patrz Full callstack for multiple frames JS on IE8).
Jedyne, co mogę wymyślić, to zarejestrować naszą własną implementację debuggera skryptów i wprowadzić do debugera myfunc()
. Jestem jednak sceptyczny, że zadziała to bez pytania użytkownika, czy chce włamać się do debuggera.
Zanim przeprowadziłem dokładniejsze testy tego podejścia, chciałem sprawdzić, czy ktoś ma ostateczne informacje o tym, czy to działa i/lub może zasugerować alternatywne podejście, które umożliwi funkcję napisaną w C++, aby uzyskać ślad stosu z silnika skryptów, który go wywołał.
Powinienem być bardziej przejrzysty: myfunc() nie może uzyskać żadnych informacji od dzwoniącego, które mogłyby zostać użyte do określenia ścieżki. (Jeśli ktokolwiek jest ciekawy, implementujemy funkcję require() zgodnie ze specyfikacją CommonJS, więc musimy trzymać się tego, co mówi spec.) –
To jest zupełnie inne. Najlepsze, co możesz zrobić, to rzucić okiem na bieżące implementacje i ewentualnie uzyskać pomysł (jeśli jeszcze tego nie zrobiłeś).Przykładem może być "Smart Platform" wymaga wdrożenia na https://github.com/joyent/smart-platform/blob/master/share/internal_js/require.js –
Jak to pomaga? Mamy już implementację require() dla IE (napisaną w C++), ale aby działała zgodnie ze specyfikacją, musi znać ścieżkę do pliku JS, który go wywołuje. –