⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xhtmldocument.java

📁 XBrowser是一个完全免费并且开源的Web浏览器
💻 JAVA
字号:
/****************************************************************
*              XBrowser  -  eXtended web Browser                *
*                                                               *
*           Copyright (c) 2000-2001  Armond Avanes              *
*     Refer to ReadMe & License files for more information      *
*                                                               *
*                                                               *
*                      By: Armond Avanes                        *
*       Armond555@yahoo.com     &    Armond333@yahoo.com        *
*                http://xbrowser.sourceforge.net/               *
*****************************************************************/
package xbrowser.renderer.custom;

import java.util.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.*;

import xbrowser.renderer.XRenderer;
import xbrowser.renderer.custom.js.*;

public class XHTMLDocument extends HTMLDocument implements XIScriptConsumer {
	public XHTMLDocument(StyleSheet styles) {
		super(styles);
	}

	private synchronized void ensureJSThread() {
		if( jsThread == null) {
			jsThread = new XJSThread( getBase(), this);
			if( jsThread instanceof XIScriptConsumer)
				sink = (XIScriptConsumer)jsThread;
			jsThread.start();
		}
	}

	public void addScript( String script, Element startTag) {
		ensureJSThread();
		if( sink != null)
			sink.addScript( script, startTag);
	}

	public void addScriptLink( String src) {
		ensureJSThread();
		if( sink != null )
			sink.addScriptLink( src);
	}

	public XDOM getSink() {
		ensureJSThread();
		if( sink != null)
			return sink.getSink();
		return null;
	}

	public void setEndScriptTag( Element startTag, Element endTag) {
		if( sink != null)
			sink.setEndScriptTag( startTag, endTag);
		else
			XRendererSupport.getContext().getLogger().error( this, "setCurScript(): sink == null?");
	}

	public void endParsing() {
		ensureJSThread();
		if( sink != null)
			sink.endParsing();
	}

	public synchronized void stopJScript() {
		if( jsThread != null) {
			jsThread.interrupt();
			jsThread = null; // free thread
		}
	}

	public XRenderer getWindow() {
		return window;
	}

	public void setWindow( XRenderer wnd) {
		window = wnd;
	}

	public XJSThread getDocThread() {
		ensureJSThread();
		return (XJSThread)jsThread;
	}

	public synchronized void addSaveThread( Thread imgSave) {
		if( imageSaveQueue == null)
			imageSaveQueue = new LinkedList();
		imageSaveQueue.add( imgSave);
	}

	public synchronized void removeSaveThread( Thread imgSave) {
		if( imageSaveQueue != null) {
			imageSaveQueue.remove( imgSave);
			// We now can show message '73 images of 999 are loaded...'
			// Do after making XImageView.
		}
	}

	public synchronized java.util.List getSaveQueue() {
		if( imageSaveQueue == null)
			imageSaveQueue = new LinkedList();
		return imageSaveQueue;
	}

	public HTMLEditorKit.ParserCallback getReader(int pos) {
		Object desc = getProperty(Document.StreamDescriptionProperty);

		if (desc instanceof URL)
			setBase((URL)desc);

		HTMLDocument.HTMLReader reader = new XHTMLReader(pos);
		return reader;
	}

	public class XHTMLReader extends HTMLDocument.HTMLReader {

		public XHTMLReader( int pos) {
			super( pos);
			inBody = false;
			inScript = false;
			lastScriptStart = -1;
		}

		public void handleStartTag( HTML.Tag t, MutableAttributeSet a, int pos) {
			if( t == HTML.Tag.BODY) {
				inBody = true;
			} else
			if( ! inBody && t == HTML.Tag.SCRIPT) {
				inScript = true;
				lastScriptStart = pos;
				// Maybe src?
				Object src = a.getAttribute( HTML.Attribute.SRC);
				if( src != null) {
					addScriptLink( (String)src);
					debugExtract( "Script SRC", (String)src);
				}
			}
			super.handleStartTag( t, a, pos);
		}

		public void handleEndTag( HTML.Tag t, int pos) {
			if( inScript && t == HTML.Tag.SCRIPT)
				inScript = false;
			else if( t==HTML.Tag.HTML )
				endParsing();

			super.handleEndTag( t, pos);
		}

		public void handleComment(char[] data, int pos) {
			if (! inBody && inScript) {
				String script = new String(data);
				// Bugfix: first line of comment does not execute.
				int iLinePos = script.indexOf( '\n');
				if( iLinePos >= 0) {
					script = script.substring( iLinePos+1);
					addScript( script, null);
				}
				debugExtract( "In head in comment", script);
			}
			super.handleComment( data, pos);
		}

		public void handleText(char[] data, int pos) {
			if (! inBody && inScript) {
				String script = new String(data);
				addScript( script, null);
				debugExtract( "In head", script);
			}
			super.handleText( data, pos);
		}

		private void debugExtract( String where, String script) {
			 if( DEBUG_EXTRACT )
				XRendererSupport.getContext().getLogger().message(this, where + ": {" + script + "}");
		}

	// Attributes:
		boolean inBody;
		boolean inScript;
		int lastScriptStart;
	} // class XHTMLReader

// Attributes:
	private static final boolean DEBUG_EXTRACT = false;

	protected Thread jsThread = null;
	protected XIScriptConsumer sink = null;
	protected LinkedList imageSaveQueue = null;
	XRenderer window;
} // class XHTMLDocument

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -