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 }
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 }
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 }
1974 void sendMessageAtFrontOfQueue(int what, Object obj) { 1975 mEventHub.sendMessageAtFrontOfQueue(Message.obtain( 1976 null, what, obj)); =>EventHubのQueueへメッセージを送る。 1977 }
1766 case SAVE_VIEW_STATE: <=メッセージ受信 1767 SaveViewStateRequest request = (SaveViewStateRequest) msg.obj; 1768 saveViewState(request.mStream, request.mCallback); =>7 1769 break;
2274 private void saveViewState(OutputStream stream, 2275 ValueCallback<Boolean> callback) { 2276 // TODO: Create a native method to do this better without overloading 2277 // the draw path (and fix saving <canvas>) 2278 DrawData draw = new DrawData(); 2279 if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "saveViewState start"); 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, "Failed to save view state", 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へ