のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

SaveViewState その1

MENU>Save for offline readingをクリックすると以下の処理を通る。

1:browser/Controller.java

   1730         @Override
   1731         protected Long doInBackground(Void... params) {
   1732             if (!mTab.saveViewState(mValues)) { 
                         => snapshot.tab経由 =>2へ
   1733                 return null;
   1734             }
   1735             if (isCancelled()) {
   1736                 String path = mValues.getAsString(Snapshots.VIEWSTATE_PATH);
   1737                 File file = mActivity.getFileStreamPath(path);
   1738                 if (!file.delete()) {
   1739                     file.deleteOnExit();
   1740                 }
   1741                 return null;
   1742             }
   1743             final ContentResolver cr = mActivity.getContentResolver();
   1744             Uri result = cr.insert(Snapshots.CONTENT_URI, mValues);
   1745             if (result == null) {
   1746                 return null;
   1747             }
   1748             long id = ContentUris.parseId(result);
   1749             return id;
   1750         }

2:browser/Tab.java

   1834     /**
   1835      * Probably want to call this on a background thread
   1836      */
   1837     public boolean saveViewState(ContentValues values) {
   1838         WebViewClassic web = getWebViewClassic();
   1839         if (web == null) return false;
   1840         String path = UUID.randomUUID().toString();
   1841         SaveCallback callback = new SaveCallback();
   1842         OutputStream outs = null;
   1843         try {
   1844             outs = mContext.openFileOutput(path, Context.MODE_PRIVATE);
   1845             GZIPOutputStream stream = new GZIPOutputStream(outs);
   1846             synchronized (callback) {
   1847                 web.saveViewState(stream, callback);
                          =>3へ 
                          =>CBをセットして3から戻ってくる。
   1848                 callback.wait();
   1849             }
   1850             stream.flush();
   1851             stream.close();
   1852         } catch (Exception e) {
   1853             Log.w(LOGTAG, "Failed to save view state", e);
   1854             if (outs != null) {
   1855                 try {
   1856                     outs.close();
   1857                 } catch (IOException ignore) {}
   1858             }
   1859             File file = mContext.getFileStreamPath(path);
   1860             if (file.exists() && !file.delete()) {
   1861                 file.deleteOnExit();
   1862             }
   1863             return false;
   1864         }

   1865         File savedFile = mContext.getFileStreamPath(path);
   1866         if (!callback.mResult) {
   1867             if (!savedFile.delete()) {
   1868                 savedFile.deleteOnExit();
   1869             }
   1870             return false;
   1871         }
   1872         long size = savedFile.length();
   1873         values.put(Snapshots.VIEWSTATE_PATH, path);
   1874         values.put(Snapshots.VIEWSTATE_SIZE, size);
   1875         return true;
   1876     }

3:webkit/WebViewClassic.java

   2346      * Saves the view data to the output stream. The output is highly
   2347      * version specific, and may not be able to be loaded by newer versions
   2348      * of WebView.
   2349      * @param stream The {@link OutputStream} to save to
   2350      * @param callback The {@link ValueCallback} to call with the result
   2351      */
   2352     public void saveViewState(OutputStream stream, ValueCallback<Boolean> callback) {
   2353         if (mWebViewCore == null) {
   2354             callback.onReceiveValue(false);
   2355             return;
   2356         }
   2357         mWebViewCore.sendMessageAtFrontOfQueue(EventHub.SAVE_VIEW_STATE,  
   2358                 new WebViewCore.SaveViewStateRequest(stream, callback));
                              => 4のコンストラクタでObject作成
                              => 5へ
   2359     }

4:webkit/WebViewCore.java

   1063     static class SaveViewStateRequest {
        コンストラクタ
   1064         SaveViewStateRequest(OutputStream s, ValueCallback<Boolean> cb) {
   1065             mStream = s;
   1066             mCallback = cb;
   1067         }
   1068         public OutputStream mStream;
   1069         public ValueCallback<Boolean> mCallback;
   1070     }

5:webkit/WebViewCore.java

   1974     void sendMessageAtFrontOfQueue(int what, Object obj) {
   1975         mEventHub.sendMessageAtFrontOfQueue(Message.obtain(
   1976                 null, what, obj));
                     =>EventHubのQueueへメッセージを送る。
   1977     }

6:webkit/WebViewCore.java

   1766                         case SAVE_VIEW_STATE: <=メッセージ受信
   1767                             SaveViewStateRequest request = (SaveViewStateRequest) msg.obj;
   1768                             saveViewState(request.mStream, request.mCallback); =>7
   1769                             break;

7:webkit/WebViewCore.java

   2274     private void saveViewState(OutputStream stream,
   2275             ValueCallback&lt;Boolean&gt; callback) {
   2276         // TODO: Create a native method to do this better without overloading
   2277         // the draw path (and fix saving &lt;canvas&gt;)
   2278         DrawData draw = new DrawData();
   2279         if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, &quot;saveViewState start&quot;);
   2280         draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mContentSize);
   2281         boolean result = false;
   2282         try {
   2283             result = ViewStateSerializer.serializeViewState(stream, draw);
   2284         } catch (Throwable t) {
   2285             Log.w(LOGTAG, &quot;Failed to save view state&quot;, t);
   2286         }
   2287         callback.onReceiveValue(result);
   2288         if (draw.mBaseLayer != 0) {
   2289             if (mDrawIsScheduled) {
   2290                 mDrawIsScheduled = false;
   2291                 mEventHub.removeMessages(EventHub.WEBKIT_DRAW);
   2292             }
   2293             mLastDrawData = draw;
   2294             webkitDraw(draw);
   2295         }
   2296     }

C++の方へ入る。
SaveViewState その2へ