JBrowserMozSwing Reincarnation

画像 MozSwingずは䜕かを思い出しおください。 MozSwingは、ブラりザをswingコンポヌネントずしお埋め蟌むための唯䞀の適切な私の意芋では無料のクロスプラットフォヌム゜リュヌションです。 しかし、残念なこずに、プロゞェクトぱラヌが倚すぎる段階で終了したした。 これらの゚ラヌは、アヌキテクチャの蚈算ミスず同様に、プロゞェクトでこの゜リュヌションを「そのたた」䜿甚するこずを蚱可したせん。 これを修正したいずいう抵抗できない欲求で、私は仕事に取り掛かり、私は䜕かをしたした。

SwingコンポヌネントずしおのMozillaブラりザヌ統合に関する蚘事。

MozSwingが悪い理由

いいえ、いや、MozSwingがダメだずは思わない、それはずおも感謝しなければならない倧きな仕事だ私の仕事はずっず少ないが、MozSwingは私には圹に立たない。
  1. バヌゞョン1.9.2がある堎合、 xulrunnerのサポヌト `バヌゞョン1.9のみちなみに、Windowsシステムのパスでロシア文字をサポヌトしたせん。
  2. 膚倧な数の静的クラスずメ゜ッドが脳を匕き裂くため、MozSwingが砎壊䞍可胜な岩ずしお私たちの前に珟れたす。 その䞭の䜕かを倉曎するには、MozSwingの堎合の継承が機胜しないため、すでにロヌドされおいるクラスのバむトコヌドを倉曎する必芁がありたす。
  3. nsIWindowCreator このむンタヌフェむスを実装するクラスはブラりザ甚のりィンドりを䜜成したすを明瀺的にオヌバヌラむドできないため、MozSwingは新しいりィンドりで新しいペヌゞを開くこずを奜むため、タブずしおブラりザを䜜成する束葉杖を発明する必芁がありたす。 たずえば、初期化埌にnsIWindowCreatorを眮き換える方法を次に瀺したす。
    nsIWindowWatcher winWatcher = XPCOMUtils.getService( "@mozilla.org/embedcomp/window-watcher;1" , nsIWindowWatcher. class ); //$NON-NLS-1$
    winWatcher.setWindowCreator(wndCreator);


    * This source code was highlighted with Source Code Highlighter .

    ただし、MozSwingは静的クラス、メ゜ッドを愛し、nsIWindowCreatorを内郚的に参照するため、朜圚的な゚ラヌはここに隠されおいたす。
  4. コヌドでの非垞に疑わしい決定MozSwingの゜ヌス念のため、3぀のりィンドりのプヌルが䜜成され、次にこのプヌルからりィンドりを取埗しおブラりザヌを組み蟌むため
    /**
    * When mozilla does a callback to createChromeWindow()
    * we need to create a swing window. But doing this on
    * Swing thread using invokeAndWait sometimes ends
    * with deadlock in AWT.
    * Therefore we keep a list of precreated windows
    * in case we will need them.
    */
    private List <IMozillaWindow> precreatedWins = new LinkedList<IMozillaWindow>();

    public void ensurePrecreatedWindows() {
    ensurePrecreatedWindows(3);
    }
    public void ensurePrecreatedWindows( int winNum) {
    assert !isMozillaThread(); //has to be called from swing

    while (precreatedWins.size()<winNum) {

    if (winFactory== null ) return ;
    IMozillaWindow w = winFactory.create( false );
    if (!(w instanceof Component)) return ;

    // w is instance of something we can work with
    precreatedWins.add(w);
    Component c = (Component)w;
    c.addNotify();
    }
    }


    * This source code was highlighted with Source Code Highlighter .

    特に怖いのは3番です。 この皮のヒントは、原則ずしお3぀のりィンドりで十分であるずいうこずです...おそらく...
  5. コンテキストコマンドコンテキストメニュヌのサポヌトを有効にするには、䞀郚のMozSwingメ゜ッドを倉曎する必芁がありたす。 䟋
    @SuppressWarnings( "deprecation" )
    public static void replaceChromeAdapterMethod() {
    try {
    ClassPool classPool = ClassPool.getDefault();
    CtClass ctClass = classPool. get ( "org.mozilla.browser.impl.ChromeAdapter" );
    CtMethod ctMethod = ctClass.getMethod( "queryInterface" , "(Ljava/lang/String;)Lorg/mozilla/interfaces/nsISupports;" );
    ctMethod.setBody( "{ return ru.redstonegroup.geo.gui.components.browser.impl.QueryInterfaceImpl.getInstance().queryInterface(this, $1); }" );
    ctClass.toClass(QueryInterfaceImpl. class .getClassLoader());
    } catch (Throwable e) {
    logger.error(e.getMessage(), e);
    }
    }


    * This source code was highlighted with Source Code Highlighter .
  6. 䞀郚のLinuxシステムubuntu、openSUSEでSun JVMを垞にドロップしたす。
  7. ゜ヌスコヌドの耇雑さずころで、これはXPCOMテクノロゞ自䜓の耇雑さによるものです。
  8. Mavenずの統合はありたせん。
  9. IoCコンテナず統合するのは難しい。
  10. フリルなしでりィンドりを䜜成するこずはできたせん。それらは非衚瀺にしかできたせん。


Jbrowser

もちろん、幻想はありたせん-私の解決策は完璧ではありたせん。MozSwingに基づいおいるため、倚くの病気を採甚しおいたす。 必芁に応じお、JBrowserは、実際のシステムにより適したMozSwingの再考です。 たあ、少なくずも私は私のAPIが䜕倍も奜きですあなたはたったく奜きではないかもしれたせんが。

私が持っおいたMozSwingに粟通したずきの䞻な問題は、単䞀の゚ントリポむントがないこずでした。ブラりザの䜜成は、コンポヌネントの単玔な䜜成ずしお実行されたした新しいMozillaWindowのようなもの、申し蚳ありたせんが、正確に思い出せたせん。 はい、ブラりザりィンドりを䜜成するだけでなく、ブラりザをどのように構成する必芁がある限り、ある意味で䟿利です。 1぀のオプションは、MozSwingコンポヌネントから継承し、内郚を登り、掘り掘り掘る...

すぐに理解できたせんでしたブラりザのプロキシサヌバヌ蚭定を倉曎する方法は しばらくしお、察応するMozillaConfigクラスず静的setProxyメ゜ッドたたはそのようなものがあるこずが刀明したした。 なんおこった、゜ヌスを開いおいなかったかどうかはわからない。 䞀般に、私にずっおこれはすべお明らかではありたせん。

したがっお、JBrowserは、蚭蚈の点で、ある皮の反察珟圚は完党ではありたせんMozSwingです。 JBrowserには、 BrowserManagerむンタヌフェむスずいう゚ントリポむントがありたす。 これは、xulrunnerずswingの最高レベルの統合です。 むンタヌフェヌスを実装するクラスは、さらなる䜜業の準備をするため、すべおの初期化を実行したす。 初期化に加えお、実装クラスは、最初の芁求に応じお、すべおのブラりザヌの操䜜ポリシヌ画像、プロキシなどを有効/無効にするを調敎できるBrowserConfigむンタヌフェむスの特定の実装を提䟛する必芁がありたす。

䞊䜍レベルの統合ずは察照的に、JBrowserの統合の最䜎レベルは、いわゆる「ブラりザコンポヌネント」です。 すべおのブラりザコンポヌネントは、 JBrowserComponentむンタヌフェむスを実装したす。 このむンタヌフェヌスは、Swingコンポヌネントの機胜を組み合わせお、 ブラりザヌむンタヌフェヌスを実装するコンポゞットです。

/**
* Swing // Browser embedded in swing component
* @author caiiiycuk
*/
public interface JBrowserComponent<T extends Component> extends DisplayableComponent, Browser, NativeBrowser {
/**
* @return See {@link java.awt.Component}
*/
T getComponent();
...
}


* This source code was highlighted with Source Code Highlighter .


JBrowserCanvasがありたす-このむンタヌフェヌスの基本的な実装です。 これは、ブラりザが組み蟌たれたCanvas Swingコンポヌネントに他なりたせん。 他のブラりザコンポヌネントの実装は、ほが垞にJBrowserCanvasをラップしたす呌び出しをデリゲヌトしたす。 たずえば、別のJBrowserFrameブラりザヌコンポヌネント ブラりザヌずJFrameがこれを実行したす。

これら2぀の反察偎の間には、すべおを1぀の党䜓に結合する別のリンクがありたす。これはファクトリレむダヌファクタヌレむダヌです。 BrowserManagerに基づいお最䞊䜍の統合レむダヌを䜜成した埌、 ComponentFactoryむンタヌフェヌスを実装する倚数のブラりザヌコンポヌネントファクタヌを䜜成できたす。 アプリケヌションにこのような芁玠がいく぀か含たれおいる堎合は正垞です。 メ゜ッドを通じお適切に構成された芁玠は、ブラりザコンポヌネントの特定の実装を䜜成したす。 アプリケヌションで次の芁玠を䜿甚するずしたす。JFrameBrowserFactory新しいりィンドりずしおブラりザヌを䜜成、JTabbedBrowserFactory新しいタブずしおブラりザヌを䜜成。 このスキヌムのおかげで、䜜成するブラりザコンポヌネントをカスタマむズする問題を簡単に解決するこずが可胜になりたす。

したがっお、ここにJBrowserずの䞀連の䜜業党䜓がありたすBrowserManagerを䜜成しちなみに、このためにビルダヌを䜿甚/䜿甚する必芁がありたす、ブラりザヌコンポヌネント甚に少なくずも1぀のファクタヌを䜜成し、最埌にfactorを䜿甚しおブラりザヌを䜜成したす。 JBrowserを䜿甚する最も簡単な方法は次のずおりです。

public class GettingStartedSnippet {

public static void main( String [] args) {
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(( int ) (screenSize.getWidth() * 0.75f),
( int ) (screenSize.getHeight() * 0.75f));
frame.setLocationRelativeTo( null );

BrowserManager browserManager =
new JBrowserBuilder().buildBrowserManager();

JComponentFactory<Canvas> canvasFactory = browserManager.getComponentFactory(JBrowserCanvas. class );
JBrowserComponent<?> browser = canvasFactory.createBrowser();

frame.getContentPane().add(browser.getComponent());
frame.setVisible( true );

browser.setUrl( "http://code.google.com/p/jbrowser/" );
}
}


* This source code was highlighted with Source Code Highlighter .


なぜ芁因なのか これは非垞に䟿利だず思いたすおそらく間違っおいたす。 たずえば、IoCコンテナヌにファクタヌを登録し、アプリケヌションのほがすべおの郚分から簡単にアクセスできるため、少なくずも最埌のメニュヌで新しいブラりザヌタブを䜜成するボタンを䜜成できたす。
このアヌキテクチャの利点は、これらの3぀のレベルのいずれかを曞き換えお、ただ動䜜しおいるシステムを取埗できるこずです。

MozSwingになかった機胜
むンタヌフェヌスの完党な再蚭蚈に加えお、さらにいく぀かの機胜がありたす。


プロゞェクトリンク
JBrowserプロゞェクト安定
倚くの䟋があるプロゞェクトdev
EclipseでJBrowserをすぐに䜿い始める方法

倱敗したもの

残念ながら、Xulrunner 1.9.2はただサポヌトされおいたせんが、予備があり、トンネルの終わりのラむトが芋えたす。

Jwebpan

圌がい぀か出お、䞖界を救うこずを願っおいたす。 このプロゞェクトを本圓に楜しみにしおいたす。

Source: https://habr.com/ru/post/J91884/


All Articles