Anulando el componente NSIWINDOWWATCHER -- javascript campo con firefox campo con firefox-addon campo con xpcom camp Relacionados El problema

Overriding nsIWindowWatcher Component


0
vote

problema

Español

Estoy escribiendo Firefox Addon que en lugar de abrir contenido en nuevas ventanas podría abrir un contenido en nueva pestaña o barra lateral.

Hay Varias formas para abrir Windows:

  • window.open()
  • window.openDialog() o ...
  • Uso de openWindow() Función Función del componente @mozilla.org/embedcomp/window-watcher;1 por nsiwindowwatcher interfaz

Analizo ventana. Abre y Window.opendialog y parece funcionar, pero tengo un problema con la función "Código> @mozilla.org/embedcomp/window-watcher;17 en el componente de Window-Watcher.

Anule el componente completo porque no sé cómo anular solo las funciones especifiquen. Por ahora, implemento todas las funciones del componente y los redirige al componente original interno this._WindowWatcher=Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher) de una manera como esta función:

  getWindowByName : function(/* in wstring */ aTargetName, /* in nsIDOMWindow */ aCurrentWindow)  // --> nsIDOMWindow; {     var all_args = Array.prototype.slice.call(arguments); // convert to Array     return this._WindowWatcher.getWindowByName.apply(this._WindowWatcher, all_args);     },   

Luego registro el componente usando xpcomutils.jsm y Nsicomponentregistrar:

  package bookKeeping;  import bookKeeping.Student;  import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException;  class Construct {     public static String[] names(String fileName) {         String[] studentInfo = null;         Student[] studentName = null;         BufferedReader reader = null;          int a = 0, position = 0, lineSafe = 0;         try {             String line;             reader = new BufferedReader(new FileReader(new File(fileName)));             System.out.println(" This program assumes MM/dd/YYYY and MM/YYYY");              line = reader.readLine();              a = Integer.parseInt(line);             studentInfo = new String[a];             studentName = new Student[a];              studentName[lineSafe] = new Student();              while ((line = reader.readLine()) != null) {                 String kappa = null;                 switch (position) {                     case 0: kappa = studentName[lineSafe].SetNames(line);                             break;                     case 1: kappa = studentName[lineSafe].SetID(line);                             break;                     case 2: kappa = studentName[lineSafe].SetMajor(line);                             break;                     case 3: kappa = studentName[lineSafe].SetClassYear(line);                             break;                 }                  if (kappa != null) {                     System.out.println(kappa);                     System.exit(0);                 }                  if (position == 3) {                     position = 0;                     studentInfo[lineSafe] = studentName[lineSafe].ToString();                     studentName[++lineSafe] = new Student();                                     } else {                     position++;                 }             }          } catch (IOException e1) {             System.out.println(" IOEXCEPTION ");             System.exit(0);         } finally {             try {                 reader.close();             } catch (IOException e2) {                 e2.printStackTrace();             }         }          return studentInfo;     } }  public class Advisor {     public static void main(String[] args) {         if (args.length != 1) {             System.out.println(" Error: Files missing from Command Line ");             System.exit(0);         }          String[] studentInfo = Construct.names(args[0]);     } } 0  

Entonces, esto parece funcionar cuando uso directamente Window Watcher en JavaScript:

  package bookKeeping;  import bookKeeping.Student;  import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException;  class Construct {     public static String[] names(String fileName) {         String[] studentInfo = null;         Student[] studentName = null;         BufferedReader reader = null;          int a = 0, position = 0, lineSafe = 0;         try {             String line;             reader = new BufferedReader(new FileReader(new File(fileName)));             System.out.println(" This program assumes MM/dd/YYYY and MM/YYYY");              line = reader.readLine();              a = Integer.parseInt(line);             studentInfo = new String[a];             studentName = new Student[a];              studentName[lineSafe] = new Student();              while ((line = reader.readLine()) != null) {                 String kappa = null;                 switch (position) {                     case 0: kappa = studentName[lineSafe].SetNames(line);                             break;                     case 1: kappa = studentName[lineSafe].SetID(line);                             break;                     case 2: kappa = studentName[lineSafe].SetMajor(line);                             break;                     case 3: kappa = studentName[lineSafe].SetClassYear(line);                             break;                 }                  if (kappa != null) {                     System.out.println(kappa);                     System.exit(0);                 }                  if (position == 3) {                     position = 0;                     studentInfo[lineSafe] = studentName[lineSafe].ToString();                     studentName[++lineSafe] = new Student();                                     } else {                     position++;                 }             }          } catch (IOException e1) {             System.out.println(" IOEXCEPTION ");             System.exit(0);         } finally {             try {                 reader.close();             } catch (IOException e2) {                 e2.printStackTrace();             }         }          return studentInfo;     } }  public class Advisor {     public static void main(String[] args) {         if (args.length != 1) {             System.out.println(" Error: Files missing from Command Line ");             System.exit(0);         }          String[] studentInfo = Construct.names(args[0]);     } } 111  

Pero cuando Firefox le gustaría usar el componente Overrideren (por ejemplo, hacer clic en el elemento de error en la consola; Probablemente Firefox está usando nsglobalwindow :: opendialog ), causa error:

  package bookKeeping;  import bookKeeping.Student;  import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException;  class Construct {     public static String[] names(String fileName) {         String[] studentInfo = null;         Student[] studentName = null;         BufferedReader reader = null;          int a = 0, position = 0, lineSafe = 0;         try {             String line;             reader = new BufferedReader(new FileReader(new File(fileName)));             System.out.println(" This program assumes MM/dd/YYYY and MM/YYYY");              line = reader.readLine();              a = Integer.parseInt(line);             studentInfo = new String[a];             studentName = new Student[a];              studentName[lineSafe] = new Student();              while ((line = reader.readLine()) != null) {                 String kappa = null;                 switch (position) {                     case 0: kappa = studentName[lineSafe].SetNames(line);                             break;                     case 1: kappa = studentName[lineSafe].SetID(line);                             break;                     case 2: kappa = studentName[lineSafe].SetMajor(line);                             break;                     case 3: kappa = studentName[lineSafe].SetClassYear(line);                             break;                 }                  if (kappa != null) {                     System.out.println(kappa);                     System.exit(0);                 }                  if (position == 3) {                     position = 0;                     studentInfo[lineSafe] = studentName[lineSafe].ToString();                     studentName[++lineSafe] = new Student();                                     } else {                     position++;                 }             }          } catch (IOException e1) {             System.out.println(" IOEXCEPTION ");             System.exit(0);         } finally {             try {                 reader.close();             } catch (IOException e2) {                 e2.printStackTrace();             }         }          return studentInfo;     } }  public class Advisor {     public static void main(String[] args) {         if (args.length != 1) {             System.out.println(" Error: Files missing from Command Line ");             System.exit(0);         }          String[] studentInfo = Construct.names(args[0]);     } } 2  

Mi extensión es aquí (módulo de componente primordial en package bookKeeping; import bookKeeping.Student; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; class Construct { public static String[] names(String fileName) { String[] studentInfo = null; Student[] studentName = null; BufferedReader reader = null; int a = 0, position = 0, lineSafe = 0; try { String line; reader = new BufferedReader(new FileReader(new File(fileName))); System.out.println(" This program assumes MM/dd/YYYY and MM/YYYY"); line = reader.readLine(); a = Integer.parseInt(line); studentInfo = new String[a]; studentName = new Student[a]; studentName[lineSafe] = new Student(); while ((line = reader.readLine()) != null) { String kappa = null; switch (position) { case 0: kappa = studentName[lineSafe].SetNames(line); break; case 1: kappa = studentName[lineSafe].SetID(line); break; case 2: kappa = studentName[lineSafe].SetMajor(line); break; case 3: kappa = studentName[lineSafe].SetClassYear(line); break; } if (kappa != null) { System.out.println(kappa); System.exit(0); } if (position == 3) { position = 0; studentInfo[lineSafe] = studentName[lineSafe].ToString(); studentName[++lineSafe] = new Student(); } else { position++; } } } catch (IOException e1) { System.out.println(" IOEXCEPTION "); System.exit(0); } finally { try { reader.close(); } catch (IOException e2) { e2.printStackTrace(); } } return studentInfo; } } public class Advisor { public static void main(String[] args) { if (args.length != 1) { System.out.println(" Error: Files missing from Command Line "); System.exit(0); } String[] studentInfo = Construct.names(args[0]); } } 3 < / Código>)

Para las pruebas, uso la consola Firebug en el contexto de Chrome o en JavaScript Shell en desarrollador Asistente Addón e importar mi módulo de componente package bookKeeping; import bookKeeping.Student; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; class Construct { public static String[] names(String fileName) { String[] studentInfo = null; Student[] studentName = null; BufferedReader reader = null; int a = 0, position = 0, lineSafe = 0; try { String line; reader = new BufferedReader(new FileReader(new File(fileName))); System.out.println(" This program assumes MM/dd/YYYY and MM/YYYY"); line = reader.readLine(); a = Integer.parseInt(line); studentInfo = new String[a]; studentName = new Student[a]; studentName[lineSafe] = new Student(); while ((line = reader.readLine()) != null) { String kappa = null; switch (position) { case 0: kappa = studentName[lineSafe].SetNames(line); break; case 1: kappa = studentName[lineSafe].SetID(line); break; case 2: kappa = studentName[lineSafe].SetMajor(line); break; case 3: kappa = studentName[lineSafe].SetClassYear(line); break; } if (kappa != null) { System.out.println(kappa); System.exit(0); } if (position == 3) { position = 0; studentInfo[lineSafe] = studentName[lineSafe].ToString(); studentName[++lineSafe] = new Student(); } else { position++; } } } catch (IOException e1) { System.out.println(" IOEXCEPTION "); System.exit(0); } finally { try { reader.close(); } catch (IOException e2) { e2.printStackTrace(); } } return studentInfo; } } public class Advisor { public static void main(String[] args) { if (args.length != 1) { System.out.println(" Error: Files missing from Command Line "); System.exit(0); } String[] studentInfo = Construct.names(args[0]); } } 4

Gracias por cada consejos posibles.

Original en ingles

I'm writing Firefox Addon that instead of opening content in new windows could open a content in new tab or sidebar.

There are several ways to open windows:

  • window.open()
  • window.openDialog() or...
  • using openWindow() function form the component @mozilla.org/embedcomp/window-watcher;1 by nsIWindowWatcher interface

I override window.open and window.openDialog and it seems to work but I have problem with overriding openWindow() function in window-watcher component.

I override whole component because I don't know how to override only specify functions. For now I implement all functions of the component and redirect them to internal original component this._WindowWatcher=Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher) in a way like this function:

getWindowByName : function(/* in wstring */ aTargetName, /* in nsIDOMWindow */ aCurrentWindow)  // --> nsIDOMWindow; {     var all_args = Array.prototype.slice.call(arguments); // convert to Array     return this._WindowWatcher.getWindowByName.apply(this._WindowWatcher, all_args);     }, 

Then I register the component using XPCOMUtils.jsm and nsIComponentRegistrar :

var NSGetFactory = XPCOMUtils.generateNSGetFactory([WindowWatcher]); var WindowWatcherFactory = NSGetFactory(WindowWatcher.prototype.classID); var nsIComponentRegistrar = Components.manager                             .QueryInterface(Ci.nsIComponentRegistrar); var oldCID = nsIComponentRegistrar              .contractIDToCID("@mozilla.org/embedcomp/window-watcher;1"); nsIComponentRegistrar.registerFactory(        WindowWatcher.prototype.classID,         null,         "@mozilla.org/embedcomp/window-watcher;1",         WindowWatcherFactory ); 

Then this seems work when I use directly Window Watcher in JavaScript:

 ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]       .getService(Ci.nsIWindowWatcher)  var win = ww.openWindow(null, "about:home",                      "_blank", "chrome,centerscreen", null);  

But when Firefox would like internally use the overriden component (e.g. clicking link on error item in Console; probably Firefox is using nsGlobalWindow::OpenDialog), it causes error :

  NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff    (NS_ERROR_UNEXPECTED) [nsIDOMJSWindow.openDialog] 

My extension is here (overriding component module in modules\window-watcher.jsm)

For tests I use Firebug Console on chrome context or JavaScript Shell in Developer Assistant addon and import my component module Components.utils.import("resource://moreICUIPlus/window-watcher.jsm");

Thanks for every possible hints.

           
     
     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Solo para que uno no sea necesario para hojear los comentarios:

Re-implementación (envoltura) El componente Student[] studentInfo22 en un componente JavaScript no es posible, ya que uno tendría que implementar la interfaz Student[] studentInfo623 .

Re-implementación (envoltura) en un componente C ++ sería posible, pero en el contexto de los complementos no es muy factible, porque uno debería compilar para todos los sistemas operativos / plataformas compatibles, y uno tendría que volver a compilar Para cada versión de Gecko, ya que los componentes binarios están etiquetados en versión y no se cargan si las versiones de Gecko no coinciden.

 

Just so that one does not need to skim the comments:

Re-implementing (wrapping) the @mozilla.org/embedcomp/window-watcher;1 component in a javascript component is not possible, because one would need to implement the non-scriptable nsPIWindowWatcher interface.

Re-implementing (wrapping) it in a C++ component would be possible, but in context of add-ons isn't very feasible, because one would need to compile for all supported OS/platforms, and one would need to recompile for each version of Gecko, as binary-components are version-tagged and won't load if the Gecko versions don't match.

 
 
   
   

Relacionados problema

4  ¿Qué método IPC debo usar entre la extensión Firefox y el código C # que se ejecuta en la misma máquina?  ( What ipc method should i use between firefox extension and c sharp code running ) 
Tengo una pregunta sobre cómo estructurar la comunicación entre una extensión (nueva) de Firefox y el código C # existente. La extensión Firefox utilizará l...

1  IPC entre extensión de Firefox y componente COM  ( Ipc between firefox extension and com component ) 
Necesito hacer una llamada síncrona entre un componente y un componente COM (Nativo de Win32). Lo sé, las opciones son: 1) Abra los enchufes y use TCP /...

1  Cómo registrar una DLL de nsimodule en Windows  ( How to register an nsimodule dll on windows ) 
He creado una biblioteca de Windows con una implementación de Nsimodule (y NsiprotocolHandler) hace un tiempo. Recientemente me he vuelto a depurarlo un poco ...

1  Impresión personalizada desde Firefox (solo Windows)  ( Custom printing from firefox windows only ) 
He creado un componente de formularios de Windows de .NET que se ejecuta dentro de IE a través de una etiqueta <object /> y me permite imprimir en una impre...

1  XPCOM / Jetpack observa todas las cargas de documentos  ( Xpcom jetpack observe all document loads ) 
Escribo un complemento basado en Mozilla Jetpack que tiene que funcionar cada vez que se carga un documento. Para "Toplevel Documents", esto funciona principa...

0  Vuelva a buscar el cuerpo del objeto Redirecto en la extensión Firefox  ( Fetch the redirect object body in firefox extension ) 
Estoy tratando de buscar el contenido / cuerpo del objeto HTTP a través de registrar un oyente de transmisión al canal al recibir la notificación "HTTP-ON-MOD...

2  Componente Firefox XPCOM: permiso denegado al método de llamada Sin nombre  ( Firefox xpcom component permission denied to call method unnamedclass ) 
¿Puede un componente Firefox XPCOM leer y escribir contenido de página en varias páginas? Escenario: Un montón de archivos locales HTML y JavaScript. Un arc...

1  Usando xpcom con django  ( Using xpcom with django ) 
Estoy usamos los objetos XPCOM con Django. Cuando uso el servidor de desarrollo, todo funciona bien, pero cuando cambie a Apache Server con MOD_WSGI i Obte qu...

9  Modifique la URL antes de cargar la página en Firefox  ( Modify url before loading page in firefox ) 
Quiero prefijar las URL que coinciden con mis patrones. Cuando abra una nueva pestaña en Firefox e ingrese una URL de coincidencia, la página no debe cargarse...

1  Manipulación de la base de datos SQLite de Firefox Addon Worker  ( Manipulating sqlite database from firefox addon worker ) 
Estoy desarrollando una extensión de Firefox que necesita escribir en una base de datos de SQLite con bastante frecuencia (esto es para algunos propósitos exp...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos