2009-07-10 15 views
4

:賞金に加えて、Firefox/Geckoのコードベースでこのバグを修正するために$ 250を支払う予定です。 Here is a simple test project(Visual Studio 2008 C#)を使用して問題を再現してください。Firefox/GeckoのコントロールがWindowsフォームのキープレスに干渉する

編集#2このバグを修正するには$ 600を支払う必要があります。上記の問題を再現するサンプルプロジェクトを参照してください。

私たちはC#Windowsフォーム上にHTMLを表示するためのFirefox(Gecko)ActiveXコントロールを用意しています。

このFirefox ActiveXコントロールが私たちのフォーム上にある場合、私たちのキープレスの約2〜3%は通過しません。代わりに、別のWindowsメッセージが送信されます。

Tabキーを押しながら3つの通常のWinFormsテキストボックスをタブします。時間の97%が正しく動作します。スパイ++は教えてくれるWM_KEYDOWNメッセージが正常に送信されます。

normal behavior http://judahhimango.com/images/normaltab.jpg

しかし、ランダムに、時間の多分百分の2から3には、Tabキー(または他のキー)が右に処理されていません。スパイ++は教えてくれるWM_CHARが代わりに送信されています:

odd behavior http://judahhimango.com/images/screwytab.png

奇妙な現象が発生し、いずれかのキーがまったく処理されない、または正しく(例えばテキストボックスには「\ t」の文字を挿入するように処理され、それは、タブ文字をサポートしていません

このFirefoxのActiveXコントロールは、フォーム上にある場合にのみ発生し

私たちの質問はです:Firefoxの/ Geckoエンジンは、これらの原因となることがありますキーボードフックのいくつかの種類をインストールしません副作用?またはより良いy私たちはこの問題をどのように修正するのですか?

+0

あなたはFirefoxのソースコードを見ることができます。何が起きているのかを知る最も速い方法かもしれません。ソースとシンボルサーバーを使ってデバッグすることもできます(https://developer.mozilla.org/En/Using_the_Mozilla_symbol_server)。 また、フォームでMSHTMLベースのWebブラウザコントロールを使用しているのはなぜですか? –

+0

このエラーを再現するのは簡単ではありません(キープレスの3%になるかもしれません)、Mozillaは巨大なx-platコードベースであるため、このバグを見つけるためにMozillaをデバッグするのは難しい作業です。 –

+1

MSHTMLに関しては、これを試みました。そのバグの工場。マネージラッパーのバグ、COMエラーによるAccessViolationExceptions。そのことを機能させるのは無限で無益な戦いでした。 –

答えて

2

WM_CHARメッセージはTranslateMessage呼び出しによって生成されるため、Geckoソースコード内のTranslateMessage呼び出しを探し始めるのがよいでしょう。

関数を提供した最初のサンプルコードでは、関数mozctl.dllとxul.dllの2つのライブラリのみがインポートされます。 GeckoFXでも同じエラーが発生していると主張しているので、mozctl.dllを式から外すことができます。それでxul.dllが残ってしまうので、Geckoのソースコードでは、widget\src\windows\nsToolkit.cppを調べることをお勧めします。エンジンが組み込まれている場合にコードが実行されるかどうかはわかりませんが、ライブラリがあれば、ライブラリは別のスレッドで完全に新しいメッセージポンプを起動します。

残念ながら私のマシン(Windows 7 x64、Mozilla ActiveXコントロールをインストールしない)でコードを実行またはコンパイルできないため、デバッガでこれを確認することはできません。誰かがそれをさらに追跡するのを助けてくれることを願っています。

+0

あなたの答えをありがとう。私たちはさらに調査します。 –

0

私は、すべての相互運用性を自分で実装していることに気付きました。 GeckoFXプロジェクトでこれを試してみて、同じエラーが出るかどうか確認できますか?私は職場でこのプロジェクトを使用しており、まだ問題は発生していません。

+0

GeckoFXで試したことはありません。私はそれを試してみる。 –

+0

まあ、GeckoFXでも同じエラーが発生します。 GeckoFXを使用するテストプロジェクトは次のとおりです。http://judahhimango.com/GeckoFXError.zip 2番目のタブに移動し、テキストボックスをフォーカスし、タブキーを約10秒間押し続けます。 Geckoはランダムに\ t空白文字をテキストボックスに挿入します。 –

+0

jasonh、あなたのための上記のコードのreproを行いますか? –

1

根本的な問題は、Mozillaが別のアプリケーションに組み込まれていると、内部イベントを送出するときにWindowsメッセージを誤って送り込むことです。 Mozillaはイベントシステムを使用してスレッド間の調整を行い、スレッドの遅延処理のスケジュールを設定します(nsIThreadnsIEventTarget参照)。たとえば、多くのアクティブなXMLHTTPRequestsを持つWebページを埋め込むと、Mozillaはそのイベントディスパッチインターフェースを使用してイベントをjavascriptに戻し、Windowsメッセージを副作用としてポンピングします。 Mozillaイベントが完全にディスパッチされると、メインイベントループに戻ります。

Mozillaがウィンドウメッセージをポンピングするときに、アプリケーションのイベントループで行われた余分な処理が含まれない - Mozillaがこれに入ると、IsDialogMessage()、TranslateMessage()、PreTranslateMessage()、またはその他の前処理がスキップされる状態。したがって、ダイアログのナビゲーション、キーボードショートカットを散発的に無視したり、カスタムメッセージの前処理を散発的にスキップしたりする代わりに、タブキーを文字として挿入することがあります。たとえば、Outlook 2007/2010の「作成」画面では、キーボード入力を処理するカスタムメッセージの前処理に依存するため、キーストロークが散発的に失われます。

問題を解決するパッチについてはhttps://bugzilla.mozilla.org/show_bug.cgi?id=582790を参照してください。

1

私はSnoop FreeとPSM Anti-Keyloggerを持っています。 そのうちの1人が、キーボードフックをインストールしようとしているFirefoxを検出しました。 Mozilla/Firefoxのxul.dllファイルがキーボードフックでインストールしようとしました。 が拒否されました。

+0

興味深い。私を驚かせない。これを正しく修正する唯一の方法は、キーボードフックをインストールしないカスタムGeckoを構築することです。ヤック –

関連する問題