谷歌瀏覽器的原始碼分析 25

2021-08-22 19:51:52 字數 1925 閱讀 2018

#001 passrefptrresourcehandle::create(const resourcerequest& request,

#002 resourcehandleclient* client,

#003 frame* deprecated,

#004 bool defersloading,

#005 bool shouldcontentsniff,

#006 bool mightdownloadfromhandle)

在這個函式裡呼叫newhandle->start函式來處理,其實它是呼叫下面的函式來工作的:

bool resourcehandle::start(frame* deprecated)

那麼這裡的d例項是什麼呢?可以通過resourcehandle的建構函式來看到它的類,如下:

resourcehandle::resourcehandle(const resourcerequest& request,

resourcehandleclient* client,

bool defersloading,

bool shouldcontentsniff,

bool mightdownloadfromhandle)

#pragma warning(suppress: 4355) // it's okay to pass |this| here!

:d(new resourcehandleinternal(this, request, client))

可以看到d是類resourcehandleinternal的例項,這就是說呼叫d->start函式,其實就是呼叫下面的函式:

#001 bool resourcehandleinternal::start(

#002 resourceloaderbridge::syncloadresponse* sync_load_response)

#159

通過上面的處理,然後就呼叫橋連線成員bridge_來建立訊息。

#160 bool rv = bridge_->start(this);

#161 if (rv) else

#167

#168 return rv;

#169 }

在這裡使用乙個設計模式,叫橋連線模式。函式bridge_->start的**如下:

// writes a footer on the message and sends it

bool ipcresourceloaderbridge::start(peer* peer)

resource_log("starting request for " << url_);

儲存當前接收的連線端點。

peer_ = peer;

生成請求id,以便返回資料時可以找到相應的顯示程序和視窗。

request_id_ = dispatcher_->addpendingrequest(peer_, request_.resource_type,

request_.mixed_content);

找到ipc的訊息傳送物件,然後建立viewhostmsg_requestresource訊息並傳送出去。

ipc::message::sender* sender = dispatcher_->message_sender();

bool ret = false;

if (sender)

ret = sender->send(new viewhostmsg_requestresource(msg_routing_none,

request_id_,

request_));

return ret;}

通過上面漫長的分析,總算搞清楚了這個過程:

谷歌瀏覽器的原始碼分析 8

上一次說到處理wm char訊息,當使用者每鍵入乙個字元時,萬能連線框就會去進行一次查詢的過程,然後把智慧型提示資訊顯示出來。說到autocompleteedit handlekeystroke函式的操作,那麼它為什麼需要凍結這個函式的使用呢?現在就來分析這部份的內容。如下 scopedfreeze...

谷歌瀏覽器的原始碼分析 30

上次說到函式winhttpreaddata 通過上面的函式可以看到,當資料接收完成後,就會呼叫docallback函式處理接收到的資料。docallback函式的 如下 看到這裡又是乙個 函式c run的通知,它是呼叫開始建立這個連線時設定的 物件。如果是http請求,那麼這個請求 函式是物件url...

谷歌瀏覽器的原始碼分析 32

上一次說到在類resourcedispatcher會收到接收http資料訊息,並進一步處理資料。那麼resourcedispatcher類又把接收到的資料發往何處呢?這是需要我們去搞懂它的。通過進一步的跟蹤,會發現在resourcedispatcher onreceiveddata函式呼叫webco...