リビジョン | 5633b955bc9fcd998e8ecf7e8e30c311aafc588c (tree) |
---|---|
日時 | 2015-11-25 14:48:45 |
作者 | itozyun <itozyun@user...> |
コミッター | itozyun |
Version 0.6.197, add X.Util.Windfow.
@@ -213,12 +213,12 @@ function X_Node_y(){ | ||
213 | 213 | }; |
214 | 214 | |
215 | 215 | /** |
216 | - * 要素の文書内の位置。引数に xnode を与えた場合、 | |
216 | + * 要素の文書内の位置。 | |
217 | 217 | * @alias Node.prototype.offset |
218 | 218 | * @return {object} { x: {number}, y : {number} } |
219 | 219 | * @example node.offset(); |
220 | 220 | */ |
221 | -function X_Node_offset( xnode ){ | |
221 | +function X_Node_offset(){ | |
222 | 222 | var flags = this[ '_flags' ], |
223 | 223 | offset = { x : 0, y : 0 }, |
224 | 224 | obj, parent, elm; |
@@ -7,21 +7,40 @@ | ||
7 | 7 | * |
8 | 8 | * @alias X.Util.NinjaIframe |
9 | 9 | * @class NinjaIframe 隠し iframe 機能を提供します。 |
10 | - * @constructs NinjaIframe | |
11 | 10 | * @extends {Node} |
12 | 11 | */ |
13 | 12 | var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ]( |
14 | 13 | 'NinjaIframe', |
14 | + | |
15 | + /** @lends NinjaIframe.prototype */ | |
15 | 16 | { |
16 | - autoRefresh : 0, | |
17 | + /* autoRefresh : 0, */ | |
17 | 18 | |
19 | + /** | |
20 | + * iframe の contentWindow | |
21 | + * @private | |
22 | + * @type {window} */ | |
18 | 23 | _iwin : null, |
19 | 24 | |
25 | + /** | |
26 | + * iframe に write する html 文字時列 | |
27 | + * @type {string} */ | |
20 | 28 | _contentHTML : '', |
29 | + | |
30 | + /** | |
31 | + * iframe の name | |
32 | + * @private | |
33 | + * @type {string} */ | |
21 | 34 | _name : '', |
35 | + | |
36 | + /** | |
37 | + * iframe への html 文字列の write が完了した | |
38 | + * @private | |
39 | + * @type {string} */ | |
22 | 40 | _ready : false, |
23 | 41 | |
24 | 42 | 'Constructor' : function( html ){ |
43 | + // TODO src も設定可能に | |
25 | 44 | |
26 | 45 | this._name = 'hidden-iframe-' + X_Timer_now(); |
27 | 46 | // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js |
@@ -59,6 +78,11 @@ var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ]( | ||
59 | 78 | X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent ); |
60 | 79 | }, |
61 | 80 | |
81 | + /** | |
82 | + * iframe 内をリフレッシュ、または内容を上書きする | |
83 | + * @param {string=} opt_contentHTML html文字列 | |
84 | + * @return {NinjaIframe} チェーンメソッド | |
85 | + */ | |
62 | 86 | 'refresh' : function( opt_contentHTML ){ |
63 | 87 | var raw = this[ '_rawObject' ], |
64 | 88 | idoc; |
@@ -82,7 +106,6 @@ var X_NinjaIframe = X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ]( | ||
82 | 106 | |
83 | 107 | if( !( X_UA[ 'IE' ] < 9 ) ){ |
84 | 108 | X_Util_NinjaIframe_writeToIframe( this ); |
85 | - //this._ready = true; | |
86 | 109 | }; |
87 | 110 | |
88 | 111 | return this; |
@@ -106,7 +129,6 @@ function X_Util_NinjaIframe_handleEvent( e ){ | ||
106 | 129 | |
107 | 130 | if( !( X_UA[ 'IE' ] < 9 ) ){ |
108 | 131 | X_Util_NinjaIframe_writeToIframe( this ); |
109 | - //this._ready = true; | |
110 | 132 | return; |
111 | 133 | }; |
112 | 134 | //break; これあると IE8 で駄目! |
@@ -116,7 +138,6 @@ function X_Util_NinjaIframe_handleEvent( e ){ | ||
116 | 138 | // ie9- |
117 | 139 | if( !this._ready ){ |
118 | 140 | X_Util_NinjaIframe_writeToIframe( this ); |
119 | - //this._ready = true; | |
120 | 141 | break; |
121 | 142 | }; |
122 | 143 | // onload |
@@ -143,7 +164,7 @@ function X_Util_NinjaIframe_writeToIframe( that ){ | ||
143 | 164 | idoc = raw.contentDocument || that._iwin.document, |
144 | 165 | html = that._contentHTML; |
145 | 166 | |
146 | - that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明 | |
167 | + that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明 'readystatechange' が繰り返し起こりループする?? | |
147 | 168 | delete that._contentHTML; |
148 | 169 | |
149 | 170 | idoc.open(); |
@@ -0,0 +1,121 @@ | ||
1 | +/** | |
2 | + * 別窓(別タブ)の操作 | |
3 | + * <ol> | |
4 | + * <li>win.kill() で別窓を閉じる | |
5 | + * <li>win.kill() 以外で閉じられた場合、ユーザーの[x]ボタン操作や、他のscriptによって閉じられた場合、X.Event.UNLOAD イベントを発して自身を kill する。 | |
6 | + * </ol> | |
7 | + * イベント | |
8 | + * <dl> | |
9 | + * <dt>X.Event.UNLOAD<dd>win.kill() 以外で閉じられた場合に通知、自身はkillする | |
10 | + * <dt>X.Event.ERROR<dd>他ドメインに遷移した等の理由で win.write() による書き換えに失敗した場合 | |
11 | + * </dl> | |
12 | + * | |
13 | + * @example // 別ページの表示 | |
14 | + * win = X.Util.Window( { url : 'other.html' } ); | |
15 | + * // コンテンツの書き込み | |
16 | + * win = X.Util.Window( { html : '<p>Hello,world!</p>' } ); | |
17 | + * // 閉じる | |
18 | + * win.kill(); | |
19 | + * | |
20 | + * @alias X.Util.Window | |
21 | + * @class Window 別窓(別タブ) | |
22 | + * @extends {EventDispatcher} | |
23 | + */ | |
24 | +var X_Window = X[ 'Util' ][ 'Window' ] = X_EventDispatcher[ 'inherits' ]( | |
25 | + 'X.Window', | |
26 | + | |
27 | + /** @lends X.Util.Window.prototype */ | |
28 | + { | |
29 | + | |
30 | + // TODO pair 側に | |
31 | + /** | |
32 | + * closed の監視用タイマーID | |
33 | + * @private | |
34 | + * @type {number} */ | |
35 | + _timerID : 0, | |
36 | + | |
37 | + 'Constructor' : function( options ){ | |
38 | + var url = options[ 'url' ], | |
39 | + page = window.open( url || ''/* 'about:blank' */, options[ 'name' ] || '', options[ 'params' ] || '' ), | |
40 | + html = options[ 'html' ], | |
41 | + doc = X_Script_try( X_Object_find, [ page, 'document' ] ); | |
42 | + | |
43 | + X_Pair_create( this, page ); | |
44 | + | |
45 | + if( !url && html ){ | |
46 | + this[ 'write' ]( html ); | |
47 | + }; | |
48 | + | |
49 | + X_ViewPort[ 'listenOnce' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent ); | |
50 | + this[ 'listenOnce' ]( [ X_EVENT_UNLOAD, X_EVENT_KILL_INSTANCE ], X_Util_Window_handleEvent ); | |
51 | + | |
52 | + this._timerID = X_Timer_add( options[ 'interval' ] || 500, 0, this, X_Util_Window_onTimer ); | |
53 | + }, | |
54 | + | |
55 | + /** | |
56 | + * 別窓が閉じられたか? | |
57 | + * <ol> | |
58 | + * <li>ユーザーの[x]クリック操作等 | |
59 | + * <li>別窓内の script, または他の script | |
60 | + * </ol> | |
61 | + * @return {boolean} | |
62 | + */ | |
63 | + 'closed' : function(){ | |
64 | + return X_Script_try( X_Object_find, [ X_Pair_get( this ), 'closed' ] ); | |
65 | + }, | |
66 | + | |
67 | + /** | |
68 | + * 別窓の内容を書き換える | |
69 | + * @param {string=} opt_html html文字列 | |
70 | + * @return {Window} チェーンメソッド | |
71 | + */ | |
72 | + 'write' : function( opt_html ){ | |
73 | + var doc = X_Script_try( X_Object_find, [ X_Pair_get( this ), 'document' ] ); | |
74 | + | |
75 | + if( doc ){ | |
76 | + doc.open(); | |
77 | + doc.write( opt_html || '' ); // TODO 無毒化 | |
78 | + doc.close(); | |
79 | + } else { | |
80 | + this[ 'asyncDispatch' ]( X_EVENT_ERROR ); | |
81 | + }; | |
82 | + | |
83 | + return this; | |
84 | + } | |
85 | + | |
86 | + // TODO url | |
87 | + | |
88 | + } | |
89 | +); | |
90 | + | |
91 | +function X_Util_Window_onTimer( e ){ | |
92 | + if( this[ 'closed' ]() ){ | |
93 | + this[ 'asyncDispatch' ]( X_EVENT_UNLOAD ); | |
94 | + delete this._timerID; | |
95 | + return X_CALLBACK_UN_LISTEN; | |
96 | + }; | |
97 | +}; | |
98 | + | |
99 | +function X_Util_Window_handleEvent( e ){ | |
100 | + var page = X_Pair_get( this ); | |
101 | + | |
102 | + switch( e.type ){ | |
103 | + case X_EVENT_UNLOAD : | |
104 | + this[ 'kill' ](); | |
105 | + break; | |
106 | + | |
107 | + case X_EVENT_KILL_INSTANCE : | |
108 | + if( page && !this[ 'closed' ]() ){ | |
109 | + if( 9 < X_UA[ 'IEHost' ] ){ | |
110 | + page.close(); | |
111 | + } else { | |
112 | + page.open( 'about:blank', '_self' ).close(); | |
113 | + }; | |
114 | + X_Pair_release( this, page ); | |
115 | + }; | |
116 | + this._timerID && X_Timer_remove( this._timerID ); | |
117 | + X_ViewPort[ 'unlisten' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent ); | |
118 | + break; | |
119 | + }; | |
120 | +}; | |
121 | + |
@@ -114,7 +114,7 @@ X[ 'OAuth2' ] = X_EventDispatcher[ 'inherits' ]( | ||
114 | 114 | 'response_type' : 'code', |
115 | 115 | 'client_id' : pair[ 'clientID' ], |
116 | 116 | 'redirect_uri' : pair[ 'redirectURI' ], |
117 | - 'scope' : ( pair[ 'scopes' ] || [] ).join(' ') | |
117 | + 'scope' : ( pair[ 'scopes' ] || [] ).join( ' ' ) | |
118 | 118 | } |
119 | 119 | ), |
120 | 120 | 'oauthauthorize', |