Chromium Code Reviews| Index: ios/chrome/browser/web/dom_altering_lock.h |
| diff --git a/ios/chrome/browser/web/dom_altering_lock.h b/ios/chrome/browser/web/dom_altering_lock.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..0f7a1b39fbe47d793164848522bdc295b10bac88 |
| --- /dev/null |
| +++ b/ios/chrome/browser/web/dom_altering_lock.h |
| @@ -0,0 +1,60 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef IOS_CHROME_BROWSER_WEB_DOM_ALTERING_LOCK_H_ |
| +#define IOS_CHROME_BROWSER_WEB_DOM_ALTERING_LOCK_H_ |
| + |
| +#include "base/ios/block_types.h" |
| +#import "base/ios/weak_nsobject.h" |
| +#include "ios/web/public/web_state/web_state_user_data.h" |
| + |
| +typedef void (^ProceduralBlockWithBool)(BOOL); |
| + |
| +// This protocol must be implemented by all classes which may alter the DOM |
| +// tree of a web page. Before altering the DOM, the class must call |
| +// |DOMAlteringLock::AcquireDOMAlteringLock| and can only proceed if the |
| +// lock is really acquired. |
| +// After restoring the DOM tree, the class must call |
| +// |DOMAlteringLock::ReleaseDOMAlteringLock|. |
| +@protocol DOMAltering<NSObject> |
| + |
| +// Method called when another class wants to acquire the lock. |
| +// Return YES if the class is ready to restore the DOM tree to its initial state |
| +// and release the lock. A call to |releaseDOMLockWithCompletionHandler:| |
| +// will follow to do the actual cleaning. |
| +// Return NO if the class wants to keep an exclusive access to the DOM tree. |
| +// Other features must account for the fact that they may not be able to acquire |
| +// a lock on the DOM and behave accordingly. |
| +- (BOOL)canReleaseDOMLock; |
| + |
| +// Method called when another class wants to acquire the lock. |
| +// The class must restore the DOM tree, call |
| +// |DOMAlteringLock Release| and then |completionHandler|; |
|
sdefresne
2015/02/17 13:20:55
s/DOMAlteringLock Release/DOMAlteringLock::Release
|
| +- (void)releaseDOMLockWithCompletionHandler:(ProceduralBlock)completionHandler; |
| + |
| +@end |
| + |
| +class DOMAlteringLock : public web::WebStateUserData<DOMAlteringLock> { |
|
sdefresne
2015/02/17 13:20:55
Can you add a comment that you can Acquire multipl
|
| + public: |
| + DOMAlteringLock(web::WebState* web_state); |
| + |
| + // This method must be called before altering the DOM of the page. This will |
| + // ensure that only one class tries to alter the page at a time. |
| + // The completion handler is called with YES if the lock was acquired, or NO |
| + // if it could not. |
| + // This method must be called on the UI thread. |
| + void Acquire(id<DOMAltering> feature, ProceduralBlockWithBool lockAction); |
| + |
| + // Releases the lock on the DOM tree. |
| + // This method must be called on the UI thread. |
| + void Release(id<DOMAltering> feature); |
| + |
| + private: |
| + // DOMAltering object currently having the lock. |
| + base::WeakNSProtocol<id<DOMAltering>> current_dom_altering_feature_; |
| + |
| + ~DOMAlteringLock() override; |
| +}; |
| + |
| +#endif // IOS_CHROME_BROWSER_WEB_DOM_ALTERING_LOCK_H_ |