2012-06-04 14 views
6

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ł.

Odpowiedz

0

Ta odpowiedź opisuje sposób rozwiązania faktycznego problemu opisanego w pierwotnym pytaniu. Opis pytania nie jest świetny, ponieważ przyjmowałem założenia, jak rozwiązać problem, który okazał się być bezpodstawny. To, co naprawdę próbowałem zrobić, to określić ścieżkę aktualnie uruchomionego skryptu. Zmieniłem tytuł pytania, aby dokładniej to odzwierciedlić.

Jest to dość łatwe do osiągnięcia, ponieważ skrypty są wykonywane w dokumencie HTML podczas ich ładowania. Więc jeśli obecnie wykonuję JavaScript, który jest ładowany przez znacznik script, ten znacznik script zawsze będzie ostatnim tagiem skryptu w dokumencie (ponieważ reszta dokumentu nie została jeszcze załadowana). Aby rozwiązać ten problem, wystarczy uzyskać adres URL atrybutu src ostatniego znacznika skryptu i rozwiązać wszystkie względne ścieżki na jego podstawie.

Oczywiście to nie działa dla skryptu osadzonego bezpośrednio na stronie HTML, ale to i tak jest zła praktyka (IMO), więc nie wydaje się to bardzo ważnym ograniczeniem.

1

Każdy załadowany skrypt może mieć identyfikator, a każda metoda skryptu wywołującego myfunc() może przekazać ten identyfikator do myfunc(). Oznacza to, że najpierw musisz zmodyfikować myfunct() i ostatecznie zmienić swoje skrypty i połączenia.

+0

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.) –

+0

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 –

+0

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. –

Powiązane problemy