Safari, ChromeでもHTMLエディタを使用可能とするHack

Safari, ChromeでもHTMLエディタを使用可能とするHack

- Tatsuya Shirai の投稿
返信数: 3

 河野先生からの情報提供により,どうやらSafariとChromeでもHTMLエディタが使えそうであることが分かってきました.
http://moodle.org/mod/data/view.php?d=13&rid=3945&filter=1

 ただ,このシンプルな改造(二箇所の修正)ではiPhone, iPod touch などのSafariや携帯電話のブラウザ(NetFrontなど)でもシンプルなテキストエディタではなくHTMLエディタが起動してしまい,文字入力ができない恐れがあります.携帯電話は試していませんが,iPod touchのSafariでHTMLAreaを有効にしてしまうと,文字入力が不能になることは確認しました.

 ブラウザの種別をきちんと判別し,厳密にChromeとPC版SafariでのみHTMLエディタが使用可能とする改造に,一応,成功しました.報告はまた後日に.

Tatsuya Shirai への返信

Re: Safari, ChromeでもHTMLエディタを使用可能とするHack

- Tatsuya Shirai の投稿
 あ,NetFrontはGeckoという文字列を$_SERVER['HTTP_USER_AGENT']に含まないだろうから無関係ですね.あくまでもiPhone系が誤動作するのを防ぐのだけが目的ですね.
Tatsuya Shirai への返信

Re: Safari, ChromeでもHTMLエディタを使用可能とするHack

- Tatsuya Shirai の投稿

関わりのある情報へのリンクを一つ追加しておきます.

http://www.nikep.net/srdpty/index.php?/archives/60-serendipity-Chrome-Safari-patch.html

現状,あまり関係は無いのですが,iPhone系のSafariなどがGeckoと勘違いされた時に警告が表示されるのを防ぐものです.

Tatsuya Shirai への返信

Re: Safari, ChromeでもHTMLエディタを使用可能とするHack

- Tatsuya Shirai の投稿

修正箇所は二つのファイル,3箇所です.

(1)lib/moodlelib.php

a) function can_use_html_editor()

function can_use_html_editor() {
    global $USER, $CFG;

    if (!empty($USER->htmleditor) and !empty($CFG->htmleditor)) {
        if (check_browser_version('MSIE', 5.5)) {
            return 'MSIE';
// (FS_TEST): ここから追加
        } else if (check_browser_version('Chrome', 0)) { // ex) Chrome/6.0.472.59 -> 6
            return 'Gecko';  // Chrome...
        } else if (check_browser_version('Safari', 0)) { // ex) AppelWebKit/533 -> 533
            return 'Safari';
// (FS_TEST): ここまで追加
        } else if (check_browser_version('Gecko', 20030516)) {
            return 'Gecko';
        }
    }
    return false;
}

b) function check_browser_version()

      case 'Safari':  /// Safari
          // Look for AppleWebKit, excluding strings with OmniWeb, Shiira and SimbianOS
          if (strpos($agent, 'OmniWeb')) { // Reject OmniWeb
              return false;
          } elseif (strpos($agent, 'Shiira')) { // Reject Shiira
              return false;
          } elseif (strpos($agent, 'SimbianOS')) { // Reject SimbianOS
              return false;
// (FS_TEST): ここから追加
          } elseif (strpos($agent, 'iPhone')) { // iPhone, iPad, iPod touch
              return false;
          } elseif (strpos($agent, 'Chrome')) {
              return false;
// (FS_TEST): ここまで追加
          }

          if (preg_match("/AppleWebKit\/([0-9]+)/i", $agent, $match)) {
              if (version_compare($match[1], $version) >= 0) {
                  return true;
              }
          }

          break;

// (FS_TEST): ここから追加
      case 'Chrome':   /// Chrome

          if (preg_match("/Chrome\/([0-9]+)/i", $agent, $match)) {
              if ($match[1] >= $version) {
                      return true;
                  }
              }
          break;
// (FS_TEST): ここまで追加
    }

    return false;
}

(2) lib/editor/htmlarea/htmlarea.php

 // FIXME!!! this should return false for IE < 5.5
HTMLArea.checkSupportedBrowser = function() {
    if (HTMLArea.is_gecko) {
        if (navigator.productSub < 20021201) {
            alert("You need at least Mozilla-1.3 Alpha.\n" +
                  "Sorry, your Gecko is not supported.");
            return false;
        }
        if (navigator.productSub < 20030210) {
// (FS_TEST): ここからコメントアウト
//
          alert("Mozilla < 1.3 Beta is not supported!\n" +
//                "I'll try, though, but it might not work.");
// (FS_TEST): ここから追加
            if (!navigator.userAgent.match("AppleWebKit")) {
                alert("Mozilla < 1.3 Beta is not supported!\n" +
                      "I'll try, though, but it might not work.");
            }
// (FS_TEST): ここまで追加
        }
    }
    if(HTMLArea.is_safari) {
// (FS_TEST): ここから修正
//
      return false;
        return 'HTMLArea.is_gecko';
// (FS_TEST): ここまで修正
    }
    return HTMLArea.is_gecko || HTMLArea.is_ie;
};

ChromeはGeckoと互換性が高く,$_SERVER['HTTP_USER_AGENT']にも'Gecko'の文字を含むのでChrome専用のブラウザ種別識別を入れる必要は無いのですが,将来的に非互換性が明らかになった場合に対処できるようにcheck_browser_version()に追加しました.
can_use_html_eitor()に追加したChromeとSafariのバージョンチェックですが,0 としていることで全てのバージョンでHTMLエディタを利用可能としています.私の手元には最新版しかありませんので,古いバージョンで動作するかどうかはわかりません.もし古いバージョンで動作しない場合はご連絡下さい.