Changeset 160405 in webkit
- Timestamp:
- Dec 10, 2013, 6:07:33 PM (11 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r160404 r160405 1 2013-12-10 Dan Bernstein <mitz@apple.com> 2 3 All observable PageLoadState properties should change in an atomic fashion, with properly nested change notifications 4 https://bugs.webkit.org/show_bug.cgi?id=125431 5 6 Reviewed by Anders Carlsson. 7 8 Made PageLoadState maintain two copies of its state data members, one representing the 9 committed state and one possibly containing uncommitted changes. When changes are committed, 10 change notifications are sent and the uncommitted state is copied into the committed state. 11 Changes can be committed explicitly at any time, but are also committed when the last 12 outstanding transaction ends. Transactions are RAII objects vended by the PageLoadState. 13 Mutating the PageLoadState requires holding a Transaction, which is enforced by making all 14 the mutating member functions take a Transaction::Token. Passing a Token also marks the 15 PageLoadState as possibly having uncommitted changes. 16 17 * UIProcess/API/Cocoa/WKBrowsingContextController.mm: 18 Added PageLoadStateObserver::{will,did}ChangeActiveURL overrides that call 19 -{will,did}ChangeValueForKey:. 20 21 * UIProcess/PageLoadState.cpp: 22 Moved constant from the middle of the file to the beginning and reworded comment. 23 (WebKit::PageLoadState::PageLoadState): Added initializers for new member variables, removed 24 initialization of members that are not part of Data, which initializes them in its 25 constructor. 26 (WebKit::PageLoadState::endTransaction): Added. Calles when a Transaction is destructed. 27 Decrements the outstanding transaction count, and if it is zero, commits changes. 28 (WebKit::PageLoadState::commitChanges): Added. Checks for differences in observable 29 properties between the committed state and the uncommitted state, then makes appropriate 30 willChange Observer callbacks, then copies the uncommitted state into the committed state, 31 then makes appropriate didChange Observer callbacks in reverse order. Also added active URL 32 to the set of observable properties. 33 (WebKit::PageLoadState::reset): Changed to take a transaction token, act on 34 m_uncommittedState, and not make observer callbacks. 35 (WebKit::PageLoadState::isLoading): Changed to access m_committedState. 36 (WebKit::PageLoadState::activeURL): Changed to call a static function factored out of this. 37 (WebKit::PageLoadState::estimatedProgress): Ditto. 38 (WebKit::PageLoadState::pendingAPIRequestURL): Changed to access m_committedState. 39 (WebKit::PageLoadState::setPendingAPIRequestURL): Changed to take a transaction token, act 40 on m_uncommittedState, and not make observer callbacks. 41 (WebKit::PageLoadState::clearPendingAPIRequestURL): Ditto. 42 (WebKit::PageLoadState::didStartProvisionalLoad): Ditto. 43 (WebKit::PageLoadState::didReceiveServerRedirectForProvisionalLoad): Ditto. 44 (WebKit::PageLoadState::didFailProvisionalLoad): Ditto. 45 (WebKit::PageLoadState::didCommitLoad): Ditto. 46 (WebKit::PageLoadState::didFinishLoad): Ditto. 47 (WebKit::PageLoadState::didFailLoad): Ditto. 48 (WebKit::PageLoadState::didSameDocumentNavigation): Ditto. 49 (WebKit::PageLoadState::setUnreachableURL): Ditto. 50 (WebKit::PageLoadState::title): Changed to access m_committedState. 51 (WebKit::PageLoadState::setTitle): Changed to take a transaction token, act on 52 m_uncommittedState, and not make observer callbacks. 53 (WebKit::PageLoadState::didStartProgress): Ditto. 54 (WebKit::PageLoadState::didChangeProgress): Ditto. 55 (WebKit::PageLoadState::didFinishProgress): Ditto. 56 * UIProcess/PageLoadState.h: 57 (WebKit::PageLoadState::Transaction::Transaction): Added. Calls 58 PageLoadState::beginTransaction. 59 (WebKit::PageLoadState::Transaction::~Transaction): Added. Calls 60 PageLoadState::endTransaction. 61 (WebKit::PageLoadState::Transaction::Token::Token): Added. Sets m_mayHaveUncommittedChanges. 62 (WebKit::PageLoadState::transaction): Added. Returns a Transaction for this PageLoadState. 63 (WebKit::PageLoadState::provisionalURL): Changed to access m_committedState. 64 (WebKit::PageLoadState::url): Ditto. 65 (WebKit::PageLoadState::unreachableURL): Ditto. 66 (WebKit::PageLoadState::beginTransaction): Added. Increments the outstanding transaction 67 count. 68 (WebKit::PageLoadState::Data::Data): Added. Moved internal state members into this struct 69 and made its constructor initialize state and estimatedProgress. 70 71 * UIProcess/WebPageProxy.cpp: 72 (WebKit::WebPageProxy::loadURL): Changed to create a PageLoadState::Transaction and pass it 73 along. 74 (WebKit::WebPageProxy::loadURLRequest): Ditto. 75 (WebKit::WebPageProxy::loadAlternateHTMLString): Ditto. 76 (WebKit::WebPageProxy::reload): Ditto. 77 (WebKit::WebPageProxy::goForward): Ditto. 78 (WebKit::WebPageProxy::goBack): Ditto. 79 (WebKit::WebPageProxy::goToBackForwardItem): Ditto. 80 (WebKit::WebPageProxy::receivedPolicyDecision): Ditto. 81 (WebKit::WebPageProxy::didStartProgress): Ditto. Also added a call to 82 PageLoadState::commitChanges before calling the client, so that the client sees the updated 83 state. 84 (WebKit::WebPageProxy::didChangeProgress): Ditto. 85 (WebKit::WebPageProxy::didFinishProgress): Ditto. 86 (WebKit::WebPageProxy::didStartProvisionalLoadForFrame): Ditto. 87 (WebKit::WebPageProxy::didReceiveServerRedirectForProvisionalLoadForFrame): Ditto. 88 (WebKit::WebPageProxy::didFailProvisionalLoadForFrame): Ditto. 89 (WebKit::WebPageProxy::didCommitLoadForFrame): Ditto. 90 (WebKit::WebPageProxy::didFinishLoadForFrame): Ditto. 91 (WebKit::WebPageProxy::didFailLoadForFrame): Ditto. 92 (WebKit::WebPageProxy::didSameDocumentNavigationForFrame): Ditto. 93 (WebKit::WebPageProxy::didReceiveTitleForFrame): Ditto. 94 (WebKit::WebPageProxy::decidePolicyForNavigationAction): Changed to create a 95 PageLoadState::Transaction and pass it along. 96 (WebKit::WebPageProxy::processDidCrash): Ditto. This addressed a FIXME about the client not 97 seeing the state prior to the crash, because now the changes cuased by reset() aren’t 98 committed until after the client callback. 99 100 * UIProcess/cf/WebPageProxyCF.cpp: 101 (WebKit::WebPageProxy::restoreFromSessionStateData): Changed to create a 102 PageLoadState::Transaction and pass it along. 103 1 104 2013-12-10 Ryuan Choi <ryuan.choi@samsung.com> 2 105 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKBrowsingContextController.mm
r160227 r160405 85 85 } 86 86 87 virtual void willChangeActiveURL() OVERRIDE 88 { 89 [m_controller willChangeValueForKey:@"activeURL"]; 90 } 91 92 virtual void didChangeActiveURL() OVERRIDE 93 { 94 [m_controller didChangeValueForKey:@"activeURL"]; 95 } 96 87 97 virtual void willChangeEstimatedProgress() OVERRIDE 88 98 { -
trunk/Source/WebKit2/UIProcess/PageLoadState.cpp
r160137 r160405 29 29 namespace WebKit { 30 30 31 // Progress always starts at this value. This helps provide feedback as soon as a load starts. 32 static const double initialProgressValue = 0.1; 33 31 34 PageLoadState::PageLoadState() 32 : m_ state(State::Finished)33 , m_ estimatedProgress(0)35 : m_mayHaveUncommittedChanges(false) 36 , m_outstandingTransactionCount(0) 34 37 { 35 38 } … … 55 58 } 56 59 57 void PageLoadState::reset() 58 { 59 setState(State::Finished); 60 61 m_pendingAPIRequestURL = String(); 62 m_provisionalURL = String(); 63 m_url = String(); 64 65 m_unreachableURL = String(); 60 void PageLoadState::endTransaction() 61 { 62 ASSERT(m_outstandingTransactionCount > 0); 63 64 if (!--m_outstandingTransactionCount) 65 commitChanges(); 66 } 67 68 void PageLoadState::commitChanges() 69 { 70 if (!m_mayHaveUncommittedChanges) 71 return; 72 73 m_mayHaveUncommittedChanges = false; 74 75 bool titleChanged = m_committedState.title != m_uncommittedState.title; 76 bool isLoadingChanged = isLoadingState(m_committedState.state) != isLoadingState(m_uncommittedState.state); 77 bool activeURLChanged = activeURL(m_committedState) != activeURL(m_uncommittedState); 78 bool estimatedProgressChanged = estimatedProgress(m_committedState) != estimatedProgress(m_uncommittedState); 79 80 if (titleChanged) 81 callObserverCallback(&Observer::willChangeTitle); 82 if (isLoadingChanged) 83 callObserverCallback(&Observer::willChangeIsLoading); 84 if (activeURLChanged) 85 callObserverCallback(&Observer::willChangeActiveURL); 86 if (estimatedProgressChanged) 87 callObserverCallback(&Observer::willChangeEstimatedProgress); 88 89 m_committedState = m_uncommittedState; 90 91 // The "did" ordering is the reverse of the "will". This is a requirement of Cocoa Key-Value Observing. 92 if (estimatedProgressChanged) 93 callObserverCallback(&Observer::didChangeEstimatedProgress); 94 if (activeURLChanged) 95 callObserverCallback(&Observer::didChangeActiveURL); 96 if (isLoadingChanged) 97 callObserverCallback(&Observer::didChangeIsLoading); 98 if (titleChanged) 99 callObserverCallback(&Observer::didChangeTitle); 100 } 101 102 void PageLoadState::reset(const Transaction::Token& token) 103 { 104 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 105 106 m_uncommittedState.state = State::Finished; 107 108 m_uncommittedState.pendingAPIRequestURL = String(); 109 m_uncommittedState.provisionalURL = String(); 110 m_uncommittedState.url = String(); 111 112 m_uncommittedState.unreachableURL = String(); 66 113 m_lastUnreachableURL = String(); 67 114 68 callObserverCallback(&Observer::willChangeTitle); 69 m_title = String(); 70 callObserverCallback(&Observer::didChangeTitle); 71 72 callObserverCallback(&Observer::willChangeEstimatedProgress); 73 m_estimatedProgress = 0; 74 callObserverCallback(&Observer::didChangeEstimatedProgress); 115 m_uncommittedState.title = String(); 116 117 m_uncommittedState.estimatedProgress = 0; 75 118 } 76 119 77 120 bool PageLoadState::isLoading() const 78 121 { 79 return isLoadingState(m_ state);80 } 81 82 String PageLoadState::activeURL( ) const122 return isLoadingState(m_committedState.state); 123 } 124 125 String PageLoadState::activeURL(const Data& data) 83 126 { 84 127 // If there is a currently pending URL, it is the active URL, 85 128 // even when there's no main frame yet, as it might be the 86 129 // first API request. 87 if (! m_pendingAPIRequestURL.isNull())88 return m_pendingAPIRequestURL;89 90 if (! m_unreachableURL.isEmpty())91 return m_unreachableURL;92 93 switch ( m_state) {130 if (!data.pendingAPIRequestURL.isNull()) 131 return data.pendingAPIRequestURL; 132 133 if (!data.unreachableURL.isEmpty()) 134 return data.unreachableURL; 135 136 switch (data.state) { 94 137 case State::Provisional: 95 return m_provisionalURL;138 return data.provisionalURL; 96 139 case State::Committed: 97 140 case State::Finished: 98 return m_url;141 return data.url; 99 142 } 100 143 … … 103 146 } 104 147 105 // Always start progress at initialProgressValue. This helps provide feedback as 106 // soon as a load starts. 107 108 static const double initialProgressValue = 0.1; 148 String PageLoadState::activeURL() const 149 { 150 return activeURL(m_committedState); 151 } 152 153 double PageLoadState::estimatedProgress(const Data& data) 154 { 155 if (!data.pendingAPIRequestURL.isNull()) 156 return initialProgressValue; 157 158 return data.estimatedProgress; 159 } 109 160 110 161 double PageLoadState::estimatedProgress() const 111 162 { 112 if (!m_pendingAPIRequestURL.isNull()) 113 return initialProgressValue; 114 115 return m_estimatedProgress; 163 return estimatedProgress(m_committedState); 116 164 } 117 165 118 166 const String& PageLoadState::pendingAPIRequestURL() const 119 167 { 120 return m_pendingAPIRequestURL; 121 } 122 123 void PageLoadState::setPendingAPIRequestURL(const String& pendingAPIRequestURL) 124 { 125 callObserverCallback(&Observer::willChangeEstimatedProgress); 126 m_pendingAPIRequestURL = pendingAPIRequestURL; 127 callObserverCallback(&Observer::didChangeEstimatedProgress); 128 } 129 130 void PageLoadState::clearPendingAPIRequestURL() 131 { 132 callObserverCallback(&Observer::willChangeEstimatedProgress); 133 m_pendingAPIRequestURL = String(); 134 callObserverCallback(&Observer::didChangeEstimatedProgress); 135 } 136 137 void PageLoadState::didStartProvisionalLoad(const String& url, const String& unreachableURL) 138 { 139 ASSERT(m_provisionalURL.isEmpty()); 140 141 setState(State::Provisional); 142 143 m_provisionalURL = url; 144 145 setUnreachableURL(unreachableURL); 146 } 147 148 void PageLoadState::didReceiveServerRedirectForProvisionalLoad(const String& url) 149 { 150 ASSERT(m_state == State::Provisional); 151 152 m_provisionalURL = url; 153 } 154 155 void PageLoadState::didFailProvisionalLoad() 156 { 157 ASSERT(m_state == State::Provisional); 158 159 setState(State::Finished); 160 161 m_provisionalURL = String(); 162 m_unreachableURL = m_lastUnreachableURL; 163 } 164 165 void PageLoadState::didCommitLoad() 166 { 167 ASSERT(m_state == State::Provisional); 168 169 setState(State::Committed); 170 171 m_url = m_provisionalURL; 172 m_provisionalURL = String(); 173 174 m_title = String(); 175 } 176 177 void PageLoadState::didFinishLoad() 178 { 179 ASSERT(m_state == State::Committed); 180 ASSERT(m_provisionalURL.isEmpty()); 181 182 setState(State::Finished); 183 } 184 185 void PageLoadState::didFailLoad() 186 { 187 ASSERT(m_provisionalURL.isEmpty()); 188 189 setState(State::Finished); 190 } 191 192 void PageLoadState::didSameDocumentNavigation(const String& url) 193 { 194 ASSERT(!m_url.isEmpty()); 195 196 m_url = url; 197 } 198 199 void PageLoadState::setUnreachableURL(const String& unreachableURL) 200 { 201 m_lastUnreachableURL = m_unreachableURL; 202 m_unreachableURL = unreachableURL; 168 return m_committedState.pendingAPIRequestURL; 169 } 170 171 void PageLoadState::setPendingAPIRequestURL(const Transaction::Token& token, const String& pendingAPIRequestURL) 172 { 173 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 174 m_uncommittedState.pendingAPIRequestURL = pendingAPIRequestURL; 175 } 176 177 void PageLoadState::clearPendingAPIRequestURL(const Transaction::Token& token) 178 { 179 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 180 m_uncommittedState.pendingAPIRequestURL = String(); 181 } 182 183 void PageLoadState::didStartProvisionalLoad(const Transaction::Token& token, const String& url, const String& unreachableURL) 184 { 185 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 186 ASSERT(m_uncommittedState.provisionalURL.isEmpty()); 187 188 m_uncommittedState.state = State::Provisional; 189 190 m_uncommittedState.provisionalURL = url; 191 192 setUnreachableURL(token, unreachableURL); 193 } 194 195 void PageLoadState::didReceiveServerRedirectForProvisionalLoad(const Transaction::Token& token, const String& url) 196 { 197 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 198 ASSERT(m_uncommittedState.state == State::Provisional); 199 200 m_uncommittedState.provisionalURL = url; 201 } 202 203 void PageLoadState::didFailProvisionalLoad(const Transaction::Token& token) 204 { 205 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 206 ASSERT(m_uncommittedState.state == State::Provisional); 207 208 m_uncommittedState.state = State::Finished; 209 210 m_uncommittedState.provisionalURL = String(); 211 m_uncommittedState.unreachableURL = m_lastUnreachableURL; 212 } 213 214 void PageLoadState::didCommitLoad(const Transaction::Token& token) 215 { 216 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 217 ASSERT(m_uncommittedState.state == State::Provisional); 218 219 m_uncommittedState.state = State::Committed; 220 221 m_uncommittedState.url = m_uncommittedState.provisionalURL; 222 m_uncommittedState.provisionalURL = String(); 223 224 m_uncommittedState.title = String(); 225 } 226 227 void PageLoadState::didFinishLoad(const Transaction::Token& token) 228 { 229 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 230 ASSERT(m_uncommittedState.state == State::Committed); 231 ASSERT(m_uncommittedState.provisionalURL.isEmpty()); 232 233 m_uncommittedState.state = State::Finished; 234 } 235 236 void PageLoadState::didFailLoad(const Transaction::Token& token) 237 { 238 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 239 ASSERT(m_uncommittedState.provisionalURL.isEmpty()); 240 241 m_uncommittedState.state = State::Finished; 242 } 243 244 void PageLoadState::didSameDocumentNavigation(const Transaction::Token& token, const String& url) 245 { 246 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 247 ASSERT(!m_uncommittedState.url.isEmpty()); 248 249 m_uncommittedState.url = url; 250 } 251 252 void PageLoadState::setUnreachableURL(const Transaction::Token& token, const String& unreachableURL) 253 { 254 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 255 256 m_lastUnreachableURL = m_uncommittedState.unreachableURL; 257 m_uncommittedState.unreachableURL = unreachableURL; 203 258 } 204 259 205 260 const String& PageLoadState::title() const 206 261 { 207 return m_title; 208 } 209 210 void PageLoadState::setTitle(const String& title) 211 { 212 callObserverCallback(&Observer::willChangeTitle); 213 m_title = title; 214 callObserverCallback(&Observer::didChangeTitle); 215 } 216 217 void PageLoadState::didStartProgress() 218 { 219 callObserverCallback(&Observer::willChangeEstimatedProgress); 220 m_estimatedProgress = initialProgressValue; 221 callObserverCallback(&Observer::didChangeEstimatedProgress); 222 } 223 224 void PageLoadState::didChangeProgress(double value) 225 { 226 callObserverCallback(&Observer::willChangeEstimatedProgress); 227 m_estimatedProgress = value; 228 callObserverCallback(&Observer::didChangeEstimatedProgress); 229 } 230 231 void PageLoadState::didFinishProgress() 232 { 233 callObserverCallback(&Observer::willChangeEstimatedProgress); 234 m_estimatedProgress = 1; 235 callObserverCallback(&Observer::didChangeEstimatedProgress); 262 return m_committedState.title; 263 } 264 265 void PageLoadState::setTitle(const Transaction::Token& token, const String& title) 266 { 267 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 268 m_uncommittedState.title = title; 269 } 270 271 void PageLoadState::didStartProgress(const Transaction::Token& token) 272 { 273 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 274 m_uncommittedState.estimatedProgress = initialProgressValue; 275 } 276 277 void PageLoadState::didChangeProgress(const Transaction::Token& token, double value) 278 { 279 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 280 m_uncommittedState.estimatedProgress = value; 281 } 282 283 void PageLoadState::didFinishProgress(const Transaction::Token& token) 284 { 285 ASSERT_UNUSED(token, &token.m_pageLoadState == this); 286 m_uncommittedState.estimatedProgress = 1; 236 287 } 237 288 … … 251 302 } 252 303 253 void PageLoadState::setState(State state)254 {255 if (m_state == state)256 return;257 258 bool isLoadingIsChanging = false;259 260 if (isLoadingState(m_state) != isLoadingState(state))261 isLoadingIsChanging = true;262 263 if (isLoadingIsChanging)264 callObserverCallback(&Observer::willChangeIsLoading);265 266 m_state = state;267 268 if (isLoadingIsChanging)269 callObserverCallback(&Observer::didChangeIsLoading);270 }271 272 304 void PageLoadState::callObserverCallback(void (Observer::*callback)()) 273 305 { -
trunk/Source/WebKit2/UIProcess/PageLoadState.h
r160137 r160405 52 52 virtual void didChangeTitle() = 0; 53 53 54 virtual void willChangeActiveURL() = 0; 55 virtual void didChangeActiveURL() = 0; 56 54 57 virtual void willChangeEstimatedProgress() = 0; 55 58 virtual void didChangeEstimatedProgress() = 0; 59 }; 60 61 class Transaction { 62 WTF_MAKE_NONCOPYABLE(Transaction); 63 public: 64 Transaction(Transaction&& other) 65 : m_pageLoadState(other.m_pageLoadState) 66 { 67 other.m_pageLoadState = nullptr; 68 } 69 70 ~Transaction() 71 { 72 if (m_pageLoadState) 73 m_pageLoadState->endTransaction(); 74 } 75 76 private: 77 friend class PageLoadState; 78 79 explicit Transaction(PageLoadState& pageLoadState) 80 : m_pageLoadState(&pageLoadState) 81 { 82 m_pageLoadState->beginTransaction(); 83 } 84 85 class Token { 86 public: 87 Token(Transaction& transaction) 88 #if !ASSERT_DISABLED 89 : m_pageLoadState(*transaction.m_pageLoadState) 90 #endif 91 { 92 transaction.m_pageLoadState->m_mayHaveUncommittedChanges = true; 93 } 94 95 #if !ASSERT_DISABLED 96 PageLoadState& m_pageLoadState; 97 #endif 98 }; 99 100 PageLoadState* m_pageLoadState; 56 101 }; 57 102 … … 59 104 void removeObserver(Observer&); 60 105 61 void reset(); 106 Transaction transaction() { return Transaction(*this); } 107 void commitChanges(); 108 109 void reset(const Transaction::Token&); 62 110 63 111 bool isLoading() const; 64 112 65 const String& provisionalURL() const { return m_ provisionalURL; }66 const String& url() const { return m_ url; }67 const String& unreachableURL() const { return m_ unreachableURL; }113 const String& provisionalURL() const { return m_committedState.provisionalURL; } 114 const String& url() const { return m_committedState.url; } 115 const String& unreachableURL() const { return m_committedState.unreachableURL; } 68 116 69 117 String activeURL() const; … … 72 120 73 121 const String& pendingAPIRequestURL() const; 74 void setPendingAPIRequestURL(const String&);75 void clearPendingAPIRequestURL( );122 void setPendingAPIRequestURL(const Transaction::Token&, const String&); 123 void clearPendingAPIRequestURL(const Transaction::Token&); 76 124 77 void didStartProvisionalLoad(const String& url, const String& unreachableURL);78 void didReceiveServerRedirectForProvisionalLoad(const String& url);79 void didFailProvisionalLoad( );125 void didStartProvisionalLoad(const Transaction::Token&, const String& url, const String& unreachableURL); 126 void didReceiveServerRedirectForProvisionalLoad(const Transaction::Token&, const String& url); 127 void didFailProvisionalLoad(const Transaction::Token&); 80 128 81 void didCommitLoad( );82 void didFinishLoad( );83 void didFailLoad( );129 void didCommitLoad(const Transaction::Token&); 130 void didFinishLoad(const Transaction::Token&); 131 void didFailLoad(const Transaction::Token&); 84 132 85 void didSameDocumentNavigation(const String& url);133 void didSameDocumentNavigation(const Transaction::Token&, const String& url); 86 134 87 void setUnreachableURL(const String&);135 void setUnreachableURL(const Transaction::Token&, const String&); 88 136 89 137 const String& title() const; 90 void setTitle(const String&);138 void setTitle(const Transaction::Token&, const String&); 91 139 92 void didStartProgress( );93 void didChangeProgress( double);94 void didFinishProgress( );140 void didStartProgress(const Transaction::Token&); 141 void didChangeProgress(const Transaction::Token&, double); 142 void didFinishProgress(const Transaction::Token&); 95 143 96 144 private: 97 145 static bool isLoadingState(State); 98 void setState(State); 146 147 void beginTransaction() { ++m_outstandingTransactionCount; } 148 void endTransaction(); 99 149 100 150 void callObserverCallback(void (Observer::*)()); … … 102 152 Vector<Observer*> m_observers; 103 153 104 State m_state; 154 struct Data { 155 Data() 156 : state(State::Finished) 157 , estimatedProgress(0) 158 { 159 } 105 160 106 String m_pendingAPIRequestURL;161 State state; 107 162 108 String m_provisionalURL; 109 String m_url; 163 String pendingAPIRequestURL; 110 164 111 String m_unreachableURL; 165 String provisionalURL; 166 String url; 167 168 String unreachableURL; 169 170 String title; 171 172 double estimatedProgress; 173 }; 174 175 static String activeURL(const Data&); 176 static double estimatedProgress(const Data&); 177 178 Data m_committedState; 179 Data m_uncommittedState; 180 112 181 String m_lastUnreachableURL; 113 182 114 String m_title; 115 116 double m_estimatedProgress; 183 bool m_mayHaveUncommittedChanges; 184 unsigned m_outstandingTransactionCount; 117 185 }; 118 186 -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r160395 r160405 601 601 void WebPageProxy::loadURL(const String& url, API::Object* userData) 602 602 { 603 m_pageLoadState.setPendingAPIRequestURL(url); 603 auto transaction = m_pageLoadState.transaction(); 604 605 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 604 606 605 607 if (!isValid()) … … 616 618 void WebPageProxy::loadURLRequest(WebURLRequest* urlRequest, API::Object* userData) 617 619 { 618 m_pageLoadState.setPendingAPIRequestURL(urlRequest->resourceRequest().url()); 620 auto transaction = m_pageLoadState.transaction(); 621 622 m_pageLoadState.setPendingAPIRequestURL(transaction, urlRequest->resourceRequest().url()); 619 623 620 624 if (!isValid()) … … 681 685 reattachToWebProcess(); 682 686 683 m_pageLoadState.setUnreachableURL(unreachableURL); 687 auto transaction = m_pageLoadState.transaction(); 688 689 m_pageLoadState.setUnreachableURL(transaction, unreachableURL); 684 690 685 691 if (m_mainFrame) … … 724 730 if (m_backForwardList->currentItem()) { 725 731 String url = m_backForwardList->currentItem()->url(); 726 m_pageLoadState.setPendingAPIRequestURL(url); 732 auto transaction = m_pageLoadState.transaction(); 733 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 727 734 728 735 // We may not have an extension yet if back/forward list was reinstated after a WebProcess crash or a browser relaunch … … 750 757 return; 751 758 752 m_pageLoadState.setPendingAPIRequestURL(forwardItem->url()); 759 auto transaction = m_pageLoadState.transaction(); 760 761 m_pageLoadState.setPendingAPIRequestURL(transaction, forwardItem->url()); 753 762 754 763 if (!isValid()) { … … 775 784 return; 776 785 777 m_pageLoadState.setPendingAPIRequestURL(backItem->url()); 786 auto transaction = m_pageLoadState.transaction(); 787 788 m_pageLoadState.setPendingAPIRequestURL(transaction, backItem->url()); 778 789 779 790 if (!isValid()) { … … 798 809 } 799 810 800 m_pageLoadState.setPendingAPIRequestURL(item->url()); 811 auto transaction = m_pageLoadState.transaction(); 812 813 m_pageLoadState.setPendingAPIRequestURL(transaction, item->url()); 801 814 802 815 m_process->send(Messages::WebPage::GoToBackForwardItem(item->itemID()), m_pageID); … … 1406 1419 return; 1407 1420 1421 auto transaction = m_pageLoadState.transaction(); 1422 1408 1423 if (action == PolicyIgnore) 1409 m_pageLoadState.clearPendingAPIRequestURL( );1424 m_pageLoadState.clearPendingAPIRequestURL(transaction); 1410 1425 1411 1426 uint64_t downloadID = 0; … … 2064 2079 void WebPageProxy::didStartProgress() 2065 2080 { 2066 m_pageLoadState.didStartProgress(); 2067 2081 auto transaction = m_pageLoadState.transaction(); 2082 m_pageLoadState.didStartProgress(transaction); 2083 2084 m_pageLoadState.commitChanges(); 2068 2085 m_loaderClient.didStartProgress(this); 2069 2086 } … … 2071 2088 void WebPageProxy::didChangeProgress(double value) 2072 2089 { 2073 m_pageLoadState.didChangeProgress(value); 2074 2090 auto transaction = m_pageLoadState.transaction(); 2091 m_pageLoadState.didChangeProgress(transaction, value); 2092 2093 m_pageLoadState.commitChanges(); 2075 2094 m_loaderClient.didChangeProgress(this); 2076 2095 } … … 2078 2097 void WebPageProxy::didFinishProgress() 2079 2098 { 2080 m_pageLoadState.didFinishProgress(); 2081 2099 auto transaction = m_pageLoadState.transaction(); 2100 m_pageLoadState.didFinishProgress(transaction); 2101 2102 m_pageLoadState.commitChanges(); 2082 2103 m_loaderClient.didFinishProgress(this); 2083 2104 } … … 2085 2106 void WebPageProxy::didStartProvisionalLoadForFrame(uint64_t frameID, const String& url, const String& unreachableURL, CoreIPC::MessageDecoder& decoder) 2086 2107 { 2087 m_pageLoadState.clearPendingAPIRequestURL(); 2108 auto transaction = m_pageLoadState.transaction(); 2109 2110 m_pageLoadState.clearPendingAPIRequestURL(transaction); 2088 2111 2089 2112 RefPtr<API::Object> userData; … … 2097 2120 2098 2121 if (frame->isMainFrame()) 2099 m_pageLoadState.didStartProvisionalLoad( url, unreachableURL);2122 m_pageLoadState.didStartProvisionalLoad(transaction, url, unreachableURL); 2100 2123 2101 2124 frame->setUnreachableURL(unreachableURL); 2102 2125 frame->didStartProvisionalLoad(url); 2103 2126 2127 m_pageLoadState.commitChanges(); 2104 2128 m_loaderClient.didStartProvisionalLoadForFrame(this, frame, userData.get()); 2105 2129 } … … 2116 2140 MESSAGE_CHECK_URL(url); 2117 2141 2142 auto transaction = m_pageLoadState.transaction(); 2143 2118 2144 if (frame->isMainFrame()) 2119 m_pageLoadState.didReceiveServerRedirectForProvisionalLoad( url);2145 m_pageLoadState.didReceiveServerRedirectForProvisionalLoad(transaction, url); 2120 2146 2121 2147 frame->didReceiveServerRedirectForProvisionalLoad(url); 2122 2148 2149 m_pageLoadState.commitChanges(); 2123 2150 m_loaderClient.didReceiveServerRedirectForProvisionalLoadForFrame(this, frame, userData.get()); 2124 2151 } … … 2134 2161 MESSAGE_CHECK(frame); 2135 2162 2163 auto transaction = m_pageLoadState.transaction(); 2164 2136 2165 if (frame->isMainFrame()) 2137 m_pageLoadState.didFailProvisionalLoad( );2166 m_pageLoadState.didFailProvisionalLoad(transaction); 2138 2167 2139 2168 frame->didFailProvisionalLoad(); 2140 2169 2170 m_pageLoadState.commitChanges(); 2141 2171 m_loaderClient.didFailProvisionalLoadWithErrorForFrame(this, frame, error, userData.get()); 2142 2172 } … … 2165 2195 MESSAGE_CHECK(frame); 2166 2196 2197 auto transaction = m_pageLoadState.transaction(); 2198 2167 2199 if (frame->isMainFrame()) { 2168 m_pageLoadState.didCommitLoad( );2200 m_pageLoadState.didCommitLoad(transaction); 2169 2201 m_pageClient.didCommitLoadForMainFrame(); 2170 2202 } … … 2189 2221 m_pageScaleFactor = 1; 2190 2222 2223 m_pageLoadState.commitChanges(); 2191 2224 m_loaderClient.didCommitLoadForFrame(this, frame, userData.get()); 2192 2225 } … … 2215 2248 MESSAGE_CHECK(frame); 2216 2249 2250 auto transaction = m_pageLoadState.transaction(); 2251 2217 2252 if (frame->isMainFrame()) 2218 m_pageLoadState.didFinishLoad( );2253 m_pageLoadState.didFinishLoad(transaction); 2219 2254 2220 2255 frame->didFinishLoad(); 2221 2256 2257 m_pageLoadState.commitChanges(); 2222 2258 m_loaderClient.didFinishLoadForFrame(this, frame, userData.get()); 2223 2259 } … … 2235 2271 clearLoadDependentCallbacks(); 2236 2272 2273 auto transaction = m_pageLoadState.transaction(); 2274 2237 2275 if (frame->isMainFrame()) 2238 m_pageLoadState.didFailLoad( );2276 m_pageLoadState.didFailLoad(transaction); 2239 2277 2240 2278 frame->didFailLoad(); 2241 2279 2280 m_pageLoadState.commitChanges(); 2242 2281 m_loaderClient.didFailLoadWithErrorForFrame(this, frame, error, userData.get()); 2243 2282 } … … 2254 2293 MESSAGE_CHECK_URL(url); 2255 2294 2295 auto transaction = m_pageLoadState.transaction(); 2296 2256 2297 if (frame->isMainFrame()) 2257 m_pageLoadState.didSameDocumentNavigation( url);2258 2259 m_pageLoadState.clearPendingAPIRequestURL( );2298 m_pageLoadState.didSameDocumentNavigation(transaction, url); 2299 2300 m_pageLoadState.clearPendingAPIRequestURL(transaction); 2260 2301 frame->didSameDocumentNavigation(url); 2261 2302 2303 m_pageLoadState.commitChanges(); 2262 2304 m_loaderClient.didSameDocumentNavigationForFrame(this, frame, static_cast<SameDocumentNavigationType>(opaqueSameDocumentNavigationType), userData.get()); 2263 2305 } … … 2273 2315 MESSAGE_CHECK(frame); 2274 2316 2317 auto transaction = m_pageLoadState.transaction(); 2318 2275 2319 if (frame->isMainFrame()) 2276 m_pageLoadState.setTitle(t itle);2320 m_pageLoadState.setTitle(transaction, title); 2277 2321 2278 2322 frame->didChangeTitle(title); 2279 2323 2324 m_pageLoadState.commitChanges(); 2280 2325 m_loaderClient.didReceiveTitleForFrame(this, title, frame, userData.get()); 2281 2326 } … … 2387 2432 return; 2388 2433 2434 auto transaction = m_pageLoadState.transaction(); 2435 2389 2436 if (request.url() != m_pageLoadState.pendingAPIRequestURL()) 2390 m_pageLoadState.clearPendingAPIRequestURL( );2437 m_pageLoadState.clearPendingAPIRequestURL(transaction); 2391 2438 2392 2439 WebFrameProxy* frame = m_process->webFrame(frameID); … … 3682 3729 resetStateAfterProcessExited(); 3683 3730 3684 // FIXME: Consider calling reset after calling out to the loader client,3685 // having the page load state available could be useful. 3686 m_pageLoadState.reset( );3731 auto transaction = m_pageLoadState.transaction(); 3732 3733 m_pageLoadState.reset(transaction); 3687 3734 3688 3735 m_pageClient.processDidCrash(); 3736 3689 3737 m_loaderClient.processDidCrash(this); 3690 3738 } -
trunk/Source/WebKit2/UIProcess/cf/WebPageProxyCF.cpp
r159903 r160405 152 152 } 153 153 154 auto transaction = m_pageLoadState.transaction(); 155 154 156 if (backForwardListDictionary) { 155 157 if (!m_backForwardList->restoreFromCFDictionaryRepresentation(backForwardListDictionary)) … … 166 168 else { 167 169 if (WebBackForwardListItem* item = m_backForwardList->currentItem()) 168 m_pageLoadState.setPendingAPIRequestURL( item->url());170 m_pageLoadState.setPendingAPIRequestURL(transaction, item->url()); 169 171 170 172 process().send(Messages::WebPage::RestoreSessionAndNavigateToCurrentItem(state), m_pageID);
Note:
See TracChangeset
for help on using the changeset viewer.