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..f262c88429cf9772459eaccd0fbbbeb1d9076462 |
--- /dev/null |
+++ b/ios/chrome/browser/web/dom_altering_lock.h |
@@ -0,0 +1,64 @@ |
+// 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" |
+ |
+namespace web { |
+class WebState; |
+} |
+ |
+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::Acquire() and can only proceed if the lock is really |
+// acquired. |
+// After restoring the DOM tree, the class must call DOMAlteringLock::Release(). |
+@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|. |
+- (void)releaseDOMLockWithCompletionHandler:(ProceduralBlock)completionHandler; |
+ |
+@end |
+ |
+class DOMAlteringLock : public web::WebStateUserData<DOMAlteringLock> { |
+ 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. |
+ // The lock is always released, even if it was acquired multiple times. |
+ // 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_ |