// // ERXBrowser.java // Project ERExtensions // // Created by tatsuya on Mon Jul 22 2002 // package er.extensions.appserver; import com.webobjects.appserver.WORequest; import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSKeyValueCoding; /** * <div class="en"> * ERXBrowser is an abstract class that defines browser object. * A browser object represents the web browser that the current * request-response loop is dealing with. It holds the information * retrieved from HTTP request's "user-agent" header, and such * information includes web browser's name, version, Mozilla * compatible version and platform (OS). Also, a browser object * can answer boolean questions such as <code>isIE</code>, * <code>isOmniWeb</code>, <code>isVersion5</code> and * <code>isMozilla40Compatible</code>. * <p> * ERXBrowser is immutable and shared by different sessions and * direct actions. * The shared instances are managed by ERXBrowserFactory which * is also responsible to parse "user-agent" header in a WORequest * object and to get an appropriate browser object. * <p> * One concrete browser, ERXBasicBrowser, is defined in the * ERExtensions framework. It not only implements the basic * questions defined by ERXBrowser, but also more specific * questions like <code>isIFrameSupported</code> and * <code>willRenderNestedTablesFast</code>. * <p> * You can extend ERXBrowser or its concrete subclass * ERXBasicBrowser to implement more specific questions for * your application. One good example will be to have a question * <code>isSupportedBrowser</code> that checks if the client * is using one of the supported browsers for your application. * <p> * ERXSession holds a browser object that represent the web * browser for that session and <code>browser</code> method * returns the object. * * To access ERXBrowser's boolean questions from WOConditionals * on a web component, set the key path like "session.brower.isIFrameSupported" * to their condition bindings. * <p> * ERXDirectAction also holds a browser object for the current request. * Use its <code>browser</code> method to access the object from a * session-less direct action. * </div> * * <div class="ja"> * ERXBrowser はブラウザ・オブジェクトを表現する抽象的なクラスです。 * ブラウザ・オブジェクトはカレント・リクエスト・レスポンス・ループの Webブラウザを表現しています。 * HTTPリクエスト "user-agent" より情報を取得し、 Webブラウザ名、バージョン番号、プラットフォームと * Mozilla バージョン番号等々を含みます。他には boolean で <code>isIE</code>, * <code>isOmniWeb</code>, <code>isVersion5</code> と * <code>isMozilla40Compatible</code>の情報を簡単にアクセスできます。 * <p> * ERXBrowser は不変で、他のセッションとダイレクト・アクションで共有されています。 * 共有インスタンスは ERXBrowserFactory で管理されています。他には ERXBrowserFactory が * WORequest の "user-agent" パースとブラウザ・オブジェクトの作成を担当しています。 * <p> * ERExtensions フレームワークには ERXBasicBrowser ブラウザ・オブジェクトが明確にされている。 * ERXBrowser の基本な調査メソッドのみではなく、もっと確実な <code>isIFrameSupported</code> * と <code>willRenderNestedTablesFast</code> を回答します。 * <p> * 自分のアプリケーションの為に ERXBrowser や ERXBasicBrowser のサブクラスをつくることができます。 * 例:アプリケーションでサポートされているブラウザかどうかの <code>isSupportedBrowser</code> を追加できます。<br> * * ERXSession はブラウザ・オブジェクトを保持し、セッションにアクセスしている Web Browser の情報を持っている。 * <code>browser</code> メソッドでオブジェクトを取得できます。<br> * * コンポーネント内の WOConditionals より ERXBrowser の boolean を問い合わせにアクセスする時、 * 次のようなキーパス "session.brower.isIFrameSupported" をバインディングします。<br> * * ERXDirectAction もカレント・リクエストのブラウザ・オブジェクトを保持します。 * オブジェクトをアクセスするには <code>browser</code> メソッドを使用します。 * </div> */ public abstract class ERXBrowser implements NSKeyValueCoding { public static final String UNKNOWN_BROWSER = "Unknown Browser"; public static final String ROBOT = "robot"; public static final String ICAB = "iCab"; public static final String EDGE = "Edge"; public static final String IE = "IE"; public static final String NETSCAPE = "Netscape"; public static final String OMNIWEB = "OmniWeb"; public static final String OPERA = "Opera"; public static final String SAFARI = "Safari"; public static final String MOZILLA = "Mozilla"; public static final String CHROME = "Chrome"; public static final String FIREFOX = "Firefox"; public static final String UNKNOWN_VERSION = "Unknown Version"; public static final String UNKNOWN_PLATFORM = "Unknown Platform"; public static final String MACOS = "MacOS"; public static final String WINDOWS = "Windows"; public static final String LINUX = "Linux"; public static final String IPHONE = "iPhone"; public static final String IPAD = "iPad"; public static final String POWER_PC = "PowerPC"; public static final String UNKNOWN_CPU = "Unknown CPU"; public static final String NO_GECKO = "No Gecko"; /** * <div class="en"> * Browser name string * </div> * * <div class="ja"> * ブラウザ名を戻します * </div> * * @return <div class="en">what type of browser</div> * <div class="ja">ブラウザ名</div> */ public abstract String browserName(); /** * <div class="en"> * Version string * </div> * * <div class="ja"> * ブラウザのバージョンアップを戻します * </div> * * @return <div class="en">what version of browser</div> * <div class="ja">ブラウザのバージョンアップ</div> */ public abstract String version(); /** * Major version * * @return what major version of browser */ public abstract Integer majorVersion(); /** * <div class="en"> * MozillaVersion string * </div> * * <div class="ja"> * ブラウザの Mozilla バージョンを戻します * </div> * * @return <div class="en">Mozilla version equivalent to the browser's version</div> * <div class="ja">ブラウザの Mozilla バージョン</div> */ public abstract String mozillaVersion(); /** * <div class="en"> * The revision of the gecko rendering engine. 1.0.2 and up support xslt. * </div> * * <div class="ja"> * gecko レンダリング・エンジンのバージョンを戻します * </div> * * @return <div class="en">gecko revision equivalent to the browser's version</div> * <div class="ja">gecko レンダリング・エンジンのバージョンを戻します</div> */ public abstract String geckoRevision(); /** * <div class="en"> * Platform string * </div> * * <div class="ja"> * プラットフォームを戻します * </div> * * @return <div class="en">what platform that the browser is running on</div> * <div class="ja">プラットフォーム</div> */ public abstract String platform(); /** * <div class="en"> * UserInfo dictionary * </div> * * <div class="ja"> * UserInfo ディクショナリーを戻します * </div> * * @return <div class="en">the user info</div> * <div class="ja">UserInfo ディクショナリー</div> */ public abstract NSDictionary userInfo(); /** * <div class="ja"> * 未知のブラウザ? * </div> * * @return <div class="en">true if browser type is unknown</div> * <div class="ja">未知のブラウザの場合は true が戻ります</div> */ public abstract boolean isUnknownBrowser(); /** * <div class="en"> * Browser is isRobot? * </div> * * <div class="ja"> * ブラウザはロボットですか? * </div> * * @return <div class="en">true if browser is robot.</div> * <div class="ja">ロボットの場合には true が戻ります</div> */ public abstract boolean isRobot(); /** * <div class="en"> * Browser is iCab? * </div> * <div class="ja"> * ブラウザは iCab ですか? * </div> * * @return <div class="en">true if browser is iCab.</div> * <div class="ja">iCab の場合には true が戻ります</div> */ public abstract boolean isICab(); /** * <div class="en"> * Browser is Microsoft Edge? * </div> * <div class="ja"> * ブラウザは Microsoft Edge ですか? * </div> * * @return <div class="en">true if browser is Edge.</div> * <div class="ja">Edge の場合には true が戻ります</div> */ public abstract boolean isEdge(); /** * <div class="en"> * Browser is Internet Explorer? * </div> * * <div class="ja"> * ブラウザは Internet Explorer ですか? * </div> * * @return <div class="en">true if browser is IE.</div> * <div class="ja">IE の場合には true が戻ります</div> */ public abstract boolean isIE(); /** * <div class="en"> * Browser is Netscape? * </div> * * <div class="ja"> * ブラウザは Netscape ですか? * </div> * * @return <div class="en">true if browser is Netscape.</div> * <div class="ja">Netscape の場合には true が戻ります</div> */ public abstract boolean isNetscape(); /** * <div class="en"> * Browser is not Netscape? * </div> * * <div class="ja"> * ブラウザは Netscape ではないか? * </div> * * @return <div class="en">true if browser is not Netscape.</div> * <div class="ja">Netscape でない場合には true が戻ります</div> */ public abstract boolean isNotNetscape(); /** * <div class="en"> * Browser is OmniWeb? * </div> * * <div class="ja"> * ブラウザは OmniWeb ですか? * </div> * * @return <div class="en">true if browser is OmniWeb.</div> * <div class="ja">OmniWeb の場合には true が戻ります</div> */ public abstract boolean isOmniWeb(); /** * <div class="en"> * Browser is Opera? * </div> * * <div class="ja"> * ブラウザは Opera ですか? * </div> * * @return <div class="en">true if browser is Opera.</div> * <div class="ja">Opera の場合には true が戻ります</div> */ public abstract boolean isOpera(); /** * <div class="en"> * Browser is Safari? * </div> * * <div class="ja"> * ブラウザは Safari ですか? * </div> * * @return <div class="en">true if browser is Safari.</div> * <div class="ja">Safari の場合には true が戻ります</div> */ public abstract boolean isSafari(); /** * <div class="en"> * Browser is Firefox? * </div> * * <div class="ja"> * ブラウザは Firefox ですか? * </div> * * @return <div class="en">true if browser is Firefox.</div> * <div class="ja">Firefox の場合には true が戻ります</div> */ public abstract boolean isFirefox(); /** * <div class="en"> * Browser is Chrome? * </div> * * <div class="ja"> * ブラウザは Chrome ですか? * </div> * * @return <div class="en">true if browser is Chrome.</div> * <div class="ja">Chrome の場合には true が戻ります</div> */ public abstract boolean isChrome(); public abstract boolean isMozilla50Compatible(); public abstract boolean isMozilla45Compatible(); public abstract boolean isMozilla40Compatible(); public abstract boolean isVersion9(); public abstract boolean isVersion8(); public abstract boolean isVersion7(); public abstract boolean isVersion6(); public abstract boolean isVersion5(); public abstract boolean isVersion51(); // IE 5.0 and IE 5.1 on Mac OS is different public abstract boolean isVersion45(); // Netscape 4.5 to 4.7 is very different from 4.0 // NOTE: 4.6 and 4.7 is fell into this group public abstract boolean isVersion41(); // IE 4.1 for Mac is somewhat different from 4.0 public abstract boolean isVersion40(); public abstract boolean isVersion4(); public abstract boolean isVersion3(); public abstract boolean isVersion2(); public abstract boolean isUnknownPlatform(); public abstract boolean isMacOS(); public abstract boolean isWindows(); public abstract boolean isLinux(); public abstract boolean isIPhone(); public abstract boolean isIPad(); /** * <div class="en"> * Gets the message encoding for a given request. Default implementation * gets the message encoding for all of the browserLanguages off of * the request. * </div> * * <div class="ja"> * 指定のリクエストのメッセージ・エンコーディング方法を戻します。 * デフォルト実装ではリクエストの全てのブラウザ言語のエンコーディング方法を取得します。 * </div> * * @param request <div class="en">to get the message encoding for</div> * <div class="ja">リクエスト WORequest</div> * @return <div class="en">message encoding</div> * <div class="ja">メッセージ・エンコーディング方法</div> */ public ERXMessageEncoding messageEncodingForRequest(WORequest request) { return messageEncodingForLanguages(request.browserLanguages()); } /** * <div class="en"> * Gets the message encoding for a given array of languages. * </div> * * <div class="ja"> * 指定の言語配列のメッセージ・エンコーディング方法を戻します。 * </div> * * @param languages <div class="en">array to get the correct encoding for</div> * <div class="ja">メッセージ・エンコーディング方法を取得したい言語配列</div> * @return <div class="en">message encoding</div> * <div class="ja">メッセージ・エンコーディング方法</div> */ public ERXMessageEncoding messageEncodingForLanguages(NSArray languages) { return new ERXMessageEncoding(languages); } /** * <div class="en"> * Gets the message encoding for a given language. * </div> * * <div class="en"> * 指定の言語のメッセージ・エンコーディング方法を戻します。 * </div> * * @param language <div class="en">to get the encoding for</div> * <div class="ja">メッセージ・エンコーディング方法を取得したい言語</div> * @return <div class="en">message encoding</div> * <div class="ja">メッセージ・エンコーディング方法</div> */ public ERXMessageEncoding messageEncodingForLanguage(String language) { return new ERXMessageEncoding(language); } /** * <div class="en"> * If using ERXRequest objects allows one to override on a per browser basis * what form value encoding to use. Default implementation defaults to null * Note that you will need to enable the property: * er.extensions.ERXRequest.BrowserFormValueEncodingOverrideEnabled=true * in order for the actual over ride to happen. * </div> * * <div class="ja"> * ERXRequest オブジェクトを使用すると、各ブラウザのエンコーディング方法をオーバライドすることができます。 * デフォルト実装では null を戻します。 * オーバライドを使用する為には、次のプロパティーをセットする必要があります。 * er.extensions.ERXRequest.BrowserFormValueEncodingOverrideEnabled=true * </div> * * @return <div class="en">form value encoding to use for this particular user-agent.</div> * <div class="ja">指定 user-agent のフォーム・バリューのエンコーディング方法</div> */ public String formValueEncoding() { return null; } public Object valueForKey(String key) { return NSKeyValueCoding.DefaultImplementation.valueForKey(this, key); } public void takeValueForKey(Object value, String key) { NSKeyValueCoding.DefaultImplementation.takeValueForKey(this, value, key); } private String _toString; @Override public String toString() { if (_toString == null) { _toString = "<" + getClass().getName() + " browserName: " + browserName() + ", version: " + version() + ", mozillaVersion: " + mozillaVersion() + ", platform: " + platform() + ">"; } return _toString; } }