Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7778)

Unified Diff: chrome/renderer/extensions/content_watcher.h

Issue 11547033: Implement declarativeContent API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync past refactoring and fix build+tests Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/extensions_api_resources.grd ('k') | chrome/renderer/extensions/content_watcher.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/extensions/content_watcher.h
diff --git a/chrome/renderer/extensions/content_watcher.h b/chrome/renderer/extensions/content_watcher.h
new file mode 100644
index 0000000000000000000000000000000000000000..908dad391cf65765f389ef986e92ba609e6c8bdd
--- /dev/null
+++ b/chrome/renderer/extensions/content_watcher.h
@@ -0,0 +1,86 @@
+// Copyright (c) 2012 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 CHROME_RENDERER_EXTENSIONS_CONTENT_WATCHER_H_
+#define CHROME_RENDERER_EXTENSIONS_CONTENT_WATCHER_H_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/string_piece.h"
+#include "v8/include/v8.h"
+
+namespace WebKit {
+class WebFrame;
+}
+
+namespace extensions {
+class Dispatcher;
+class Extension;
+class NativeHandler;
+
+// Watches the content of WebFrames to notify extensions when they match various
+// patterns. This class tracks the set of relevant patterns (set by
+// ExtensionMsg_WatchPages) and the set that match on each WebFrame, and sends a
+// ExtensionHostMsg_OnWatchedPageChange whenever a RenderView's set changes.
+//
+// There's one ContentWatcher per Dispatcher rather than per RenderView because
+// WebFrames can move between RenderViews through adoptNode.
+class ContentWatcher {
+ public:
+ explicit ContentWatcher(Dispatcher* dispatcher);
+ ~ContentWatcher();
+
+ // Returns the callback to call on a frame change.
+ scoped_ptr<NativeHandler> MakeNatives();
+
+ // Handler for ExtensionMsg_WatchPages.
+ void OnWatchPages(const std::vector<std::string>& css_selectors);
+
+ // Registers the MutationObserver to call back into this object whenever the
+ // content of |frame| changes.
+ void DidCreateDocumentElement(WebKit::WebFrame* frame);
+
+ // Scans *frame for the current set of interesting CSS selectors, and if
+ // they've changed sends ExtensionHostMsg_OnWatchedPageChange back to the
+ // RenderViewHost that owns the frame.
+ void ScanAndNotify(WebKit::WebFrame* frame);
+
+ private:
+ void EnsureWatchingMutations(WebKit::WebFrame* frame);
+
+ ModuleSystem* GetModuleSystem(WebKit::WebFrame* frame) const;
+ std::vector<base::StringPiece> FindMatchingSelectors(
+ WebKit::WebFrame* frame) const;
+
+ // Given that we saw a change in the CSS selectors that |changed_frame|
+ // matched, tell the browser about the new set of matching selectors in its
+ // top-level page. We filter this so that if an extension were to be granted
+ // activeTab permission on that top-level page, we only send CSS selectors for
+ // frames that it could run on.
+ void NotifyBrowserOfChange(WebKit::WebFrame* changed_frame) const;
+
+ base::WeakPtrFactory<ContentWatcher> weak_ptr_factory_;
+ Dispatcher* dispatcher_;
+
+ // If any of these selectors match on a page, we need to send an
+ // ExtensionHostMsg_OnWatchedPageChange back to the browser.
+ std::vector<std::string> css_selectors_;
+
+ // Maps live WebFrames to the set of CSS selectors they match. This lets us
+ // traverse a top-level frame's sub-frames without rescanning them all each
+ // time any one changes.
+ //
+ // The StringPieces point into css_selectors_ above, so when it changes, they
+ // all need to be regenerated.
+ std::map<WebKit::WebFrame*,
+ std::vector<base::StringPiece> > matching_selectors_;
+};
+
+} // namespace extensions
+
+#endif // CHROME_RENDERER_EXTENSIONS_CONTENT_WATCHER_H_
« no previous file with comments | « chrome/common/extensions_api_resources.grd ('k') | chrome/renderer/extensions/content_watcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698