{"action":"created","comment":{"url":"https://api.github.com/repos/facebook/stetho/pulls/comments/37485734","id":37485734,"diff_hunk":"@@ -10,19 +10,71 @@\n package com.facebook.stetho.inspector.elements.android;\n \n import android.view.View;\n+import android.view.ViewDebug;\n+import com.facebook.stetho.common.Accumulator;\n+import com.facebook.stetho.common.LogUtil;\n import com.facebook.stetho.common.StringUtil;\n import com.facebook.stetho.common.android.ResourcesUtil;\n-import com.facebook.stetho.inspector.elements.AttributeAccumulator;\n import com.facebook.stetho.inspector.elements.AbstractChainedDescriptor;\n+import com.facebook.stetho.inspector.elements.AttributeAccumulator;\n+import com.facebook.stetho.inspector.elements.StyleInfo;\n \n import javax.annotation.Nullable;\n+\n+import java.lang.annotation.Annotation;\n+import java.lang.reflect.InvocationTargetException;\n+import java.lang.reflect.Method;\n+import java.util.ArrayList;\n+import java.util.Arrays;\n+import java.util.Collections;\n+import java.util.HashSet;\n+import java.util.List;\n import java.util.Map;\n+import java.util.Set;\n \n final class ViewDescriptor extends AbstractChainedDescriptor<View> implements HighlightableDescriptor {\n   private static final String ID_ATTRIBUTE_NAME = \"id\";\n+  private static final Set<Method> viewGetters;\n \n   private final MethodInvoker mMethodInvoker;\n \n+  static {","path":"stetho/src/main/java/com/facebook/stetho/inspector/elements/android/ViewDescriptor.java","position":33,"original_position":33,"commit_id":"fcf35dc8c245603b611fa88bf96420c067d656c0","original_commit_id":"fcf35dc8c245603b611fa88bf96420c067d656c0","user":{"login":"rickbrew","id":10873410,"avatar_url":"https://avatars.githubusercontent.com/u/10873410?v=3","gravatar_id":"","url":"https://api.github.com/users/rickbrew","html_url":"https://github.com/rickbrew","followers_url":"https://api.github.com/users/rickbrew/followers","following_url":"https://api.github.com/users/rickbrew/following{/other_user}","gists_url":"https://api.github.com/users/rickbrew/gists{/gist_id}","starred_url":"https://api.github.com/users/rickbrew/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rickbrew/subscriptions","organizations_url":"https://api.github.com/users/rickbrew/orgs","repos_url":"https://api.github.com/users/rickbrew/repos","events_url":"https://api.github.com/users/rickbrew/events{/privacy}","received_events_url":"https://api.github.com/users/rickbrew/received_events","type":"User","site_admin":false},"body":"I see 2 performance problems with this approach. Since this code is executing in the static initializer for ViewDescriptor, it will always run when the Elements tab is booted up even if the CSS stuff isn't being used. That violates pay-for-play, which is very important for a project like Stetho. The second problem is due to this being stored in static fields, which means it is not eligible for garbage collection once all Stetho clients have disconnected.\r\n\r\nBecause `ViewDescriptor` is essentially a singleton, it is perfectly valid for us to store this type of data in instance fields (btw, non-final/mutable static fields should be prefixed with 's'. final, or rather \"effectively const\" fields, should be ALL_UPPERCASE). And, this data should not be initialized until it's needed ... which looks like it'd be the first call to `onGetStyles()`. A good idea would be to hide this behind a method that handles the deferred initialization, e.g.\r\n\r\n```\r\n/**\r\n  *  NOTE: Only access this via {@link #getViewGetters}.\r\n  */\r\n@GuardedBy(\"this\")\r\nprivate volatile Set<Method> mViewGetters;\r\n\r\nprivate Set<Method> getViewGetters() {\r\n  if (mViewGetters == null) {\r\n    synchronized (this) {\r\n      ... initialize mViewGetters ...\r\n    }\r\n  }\r\n  return mViewGetters;\r\n}\r\n\r\n@Override\r\nprotected void onGetStyles(...) {\r\n  for (Method method : getViewGetters()) { \r\n    ...\r\n  }\r\n}\r\n```","created_at":"2015-08-20T00:41:15Z","updated_at":"2015-08-20T00:41:15Z","html_url":"https://github.com/facebook/stetho/pull/261#discussion_r37485734","pull_request_url":"https://api.github.com/repos/facebook/stetho/pulls/261","_links":{"self":{"href":"https://api.github.com/repos/facebook/stetho/pulls/comments/37485734"},"html":{"href":"https://github.com/facebook/stetho/pull/261#discussion_r37485734"},"pull_request":{"href":"https://api.github.com/repos/facebook/stetho/pulls/261"}}},"pull_request":{"url":"https://api.github.com/repos/facebook/stetho/pulls/261","id":42763136,"html_url":"https://github.com/facebook/stetho/pull/261","diff_url":"https://github.com/facebook/stetho/pull/261.diff","patch_url":"https://github.com/facebook/stetho/pull/261.patch","issue_url":"https://api.github.com/repos/facebook/stetho/issues/261","number":261,"state":"open","locked":false,"title":"Added the ability to inspect an element's style","user":{"login":"ichub","id":2636237,"avatar_url":"https://avatars.githubusercontent.com/u/2636237?v=3","gravatar_id":"","url":"https://api.github.com/users/ichub","html_url":"https://github.com/ichub","followers_url":"https://api.github.com/users/ichub/followers","following_url":"https://api.github.com/users/ichub/following{/other_user}","gists_url":"https://api.github.com/users/ichub/gists{/gist_id}","starred_url":"https://api.github.com/users/ichub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ichub/subscriptions","organizations_url":"https://api.github.com/users/ichub/orgs","repos_url":"https://api.github.com/users/ichub/repos","events_url":"https://api.github.com/users/ichub/events{/privacy}","received_events_url":"https://api.github.com/users/ichub/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-08-18T23:56:23Z","updated_at":"2015-08-20T00:41:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e60ff4fc14de2bf435b834226cd35029995f5795","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/facebook/stetho/pulls/261/commits","review_comments_url":"https://api.github.com/repos/facebook/stetho/pulls/261/comments","review_comment_url":"https://api.github.com/repos/facebook/stetho/pulls/comments{/number}","comments_url":"https://api.github.com/repos/facebook/stetho/issues/261/comments","statuses_url":"https://api.github.com/repos/facebook/stetho/statuses/fcf35dc8c245603b611fa88bf96420c067d656c0","head":{"label":"ichub:computedCSS","ref":"computedCSS","sha":"fcf35dc8c245603b611fa88bf96420c067d656c0","user":{"login":"ichub","id":2636237,"avatar_url":"https://avatars.githubusercontent.com/u/2636237?v=3","gravatar_id":"","url":"https://api.github.com/users/ichub","html_url":"https://github.com/ichub","followers_url":"https://api.github.com/users/ichub/followers","following_url":"https://api.github.com/users/ichub/following{/other_user}","gists_url":"https://api.github.com/users/ichub/gists{/gist_id}","starred_url":"https://api.github.com/users/ichub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ichub/subscriptions","organizations_url":"https://api.github.com/users/ichub/orgs","repos_url":"https://api.github.com/users/ichub/repos","events_url":"https://api.github.com/users/ichub/events{/privacy}","received_events_url":"https://api.github.com/users/ichub/received_events","type":"User","site_admin":false},"repo":{"id":39026882,"name":"stetho","full_name":"ichub/stetho","owner":{"login":"ichub","id":2636237,"avatar_url":"https://avatars.githubusercontent.com/u/2636237?v=3","gravatar_id":"","url":"https://api.github.com/users/ichub","html_url":"https://github.com/ichub","followers_url":"https://api.github.com/users/ichub/followers","following_url":"https://api.github.com/users/ichub/following{/other_user}","gists_url":"https://api.github.com/users/ichub/gists{/gist_id}","starred_url":"https://api.github.com/users/ichub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ichub/subscriptions","organizations_url":"https://api.github.com/users/ichub/orgs","repos_url":"https://api.github.com/users/ichub/repos","events_url":"https://api.github.com/users/ichub/events{/privacy}","received_events_url":"https://api.github.com/users/ichub/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ichub/stetho","description":"Stetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more.","fork":true,"url":"https://api.github.com/repos/ichub/stetho","forks_url":"https://api.github.com/repos/ichub/stetho/forks","keys_url":"https://api.github.com/repos/ichub/stetho/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ichub/stetho/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ichub/stetho/teams","hooks_url":"https://api.github.com/repos/ichub/stetho/hooks","issue_events_url":"https://api.github.com/repos/ichub/stetho/issues/events{/number}","events_url":"https://api.github.com/repos/ichub/stetho/events","assignees_url":"https://api.github.com/repos/ichub/stetho/assignees{/user}","branches_url":"https://api.github.com/repos/ichub/stetho/branches{/branch}","tags_url":"https://api.github.com/repos/ichub/stetho/tags","blobs_url":"https://api.github.com/repos/ichub/stetho/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ichub/stetho/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ichub/stetho/git/refs{/sha}","trees_url":"https://api.github.com/repos/ichub/stetho/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ichub/stetho/statuses/{sha}","languages_url":"https://api.github.com/repos/ichub/stetho/languages","stargazers_url":"https://api.github.com/repos/ichub/stetho/stargazers","contributors_url":"https://api.github.com/repos/ichub/stetho/contributors","subscribers_url":"https://api.github.com/repos/ichub/stetho/subscribers","subscription_url":"https://api.github.com/repos/ichub/stetho/subscription","commits_url":"https://api.github.com/repos/ichub/stetho/commits{/sha}","git_commits_url":"https://api.github.com/repos/ichub/stetho/git/commits{/sha}","comments_url":"https://api.github.com/repos/ichub/stetho/comments{/number}","issue_comment_url":"https://api.github.com/repos/ichub/stetho/issues/comments{/number}","contents_url":"https://api.github.com/repos/ichub/stetho/contents/{+path}","compare_url":"https://api.github.com/repos/ichub/stetho/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ichub/stetho/merges","archive_url":"https://api.github.com/repos/ichub/stetho/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ichub/stetho/downloads","issues_url":"https://api.github.com/repos/ichub/stetho/issues{/number}","pulls_url":"https://api.github.com/repos/ichub/stetho/pulls{/number}","milestones_url":"https://api.github.com/repos/ichub/stetho/milestones{/number}","notifications_url":"https://api.github.com/repos/ichub/stetho/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ichub/stetho/labels{/name}","releases_url":"https://api.github.com/repos/ichub/stetho/releases{/id}","created_at":"2015-07-13T17:28:30Z","updated_at":"2015-07-13T17:28:31Z","pushed_at":"2015-08-18T23:50:49Z","git_url":"git://github.com/ichub/stetho.git","ssh_url":"git@github.com:ichub/stetho.git","clone_url":"https://github.com/ichub/stetho.git","svn_url":"https://github.com/ichub/stetho","homepage":"http://facebook.github.io/stetho/","size":1522,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"facebook:master","ref":"master","sha":"3ffd980a09a8488f3799c5fb239483d2a42d4f38","user":{"login":"facebook","id":69631,"avatar_url":"https://avatars.githubusercontent.com/u/69631?v=3","gravatar_id":"","url":"https://api.github.com/users/facebook","html_url":"https://github.com/facebook","followers_url":"https://api.github.com/users/facebook/followers","following_url":"https://api.github.com/users/facebook/following{/other_user}","gists_url":"https://api.github.com/users/facebook/gists{/gist_id}","starred_url":"https://api.github.com/users/facebook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/facebook/subscriptions","organizations_url":"https://api.github.com/users/facebook/orgs","repos_url":"https://api.github.com/users/facebook/repos","events_url":"https://api.github.com/users/facebook/events{/privacy}","received_events_url":"https://api.github.com/users/facebook/received_events","type":"Organization","site_admin":false},"repo":{"id":29703871,"name":"stetho","full_name":"facebook/stetho","owner":{"login":"facebook","id":69631,"avatar_url":"https://avatars.githubusercontent.com/u/69631?v=3","gravatar_id":"","url":"https://api.github.com/users/facebook","html_url":"https://github.com/facebook","followers_url":"https://api.github.com/users/facebook/followers","following_url":"https://api.github.com/users/facebook/following{/other_user}","gists_url":"https://api.github.com/users/facebook/gists{/gist_id}","starred_url":"https://api.github.com/users/facebook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/facebook/subscriptions","organizations_url":"https://api.github.com/users/facebook/orgs","repos_url":"https://api.github.com/users/facebook/repos","events_url":"https://api.github.com/users/facebook/events{/privacy}","received_events_url":"https://api.github.com/users/facebook/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/facebook/stetho","description":"Stetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more.","fork":false,"url":"https://api.github.com/repos/facebook/stetho","forks_url":"https://api.github.com/repos/facebook/stetho/forks","keys_url":"https://api.github.com/repos/facebook/stetho/keys{/key_id}","collaborators_url":"https://api.github.com/repos/facebook/stetho/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/facebook/stetho/teams","hooks_url":"https://api.github.com/repos/facebook/stetho/hooks","issue_events_url":"https://api.github.com/repos/facebook/stetho/issues/events{/number}","events_url":"https://api.github.com/repos/facebook/stetho/events","assignees_url":"https://api.github.com/repos/facebook/stetho/assignees{/user}","branches_url":"https://api.github.com/repos/facebook/stetho/branches{/branch}","tags_url":"https://api.github.com/repos/facebook/stetho/tags","blobs_url":"https://api.github.com/repos/facebook/stetho/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/facebook/stetho/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/facebook/stetho/git/refs{/sha}","trees_url":"https://api.github.com/repos/facebook/stetho/git/trees{/sha}","statuses_url":"https://api.github.com/repos/facebook/stetho/statuses/{sha}","languages_url":"https://api.github.com/repos/facebook/stetho/languages","stargazers_url":"https://api.github.com/repos/facebook/stetho/stargazers","contributors_url":"https://api.github.com/repos/facebook/stetho/contributors","subscribers_url":"https://api.github.com/repos/facebook/stetho/subscribers","subscription_url":"https://api.github.com/repos/facebook/stetho/subscription","commits_url":"https://api.github.com/repos/facebook/stetho/commits{/sha}","git_commits_url":"https://api.github.com/repos/facebook/stetho/git/commits{/sha}","comments_url":"https://api.github.com/repos/facebook/stetho/comments{/number}","issue_comment_url":"https://api.github.com/repos/facebook/stetho/issues/comments{/number}","contents_url":"https://api.github.com/repos/facebook/stetho/contents/{+path}","compare_url":"https://api.github.com/repos/facebook/stetho/compare/{base}...{head}","merges_url":"https://api.github.com/repos/facebook/stetho/merges","archive_url":"https://api.github.com/repos/facebook/stetho/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/facebook/stetho/downloads","issues_url":"https://api.github.com/repos/facebook/stetho/issues{/number}","pulls_url":"https://api.github.com/repos/facebook/stetho/pulls{/number}","milestones_url":"https://api.github.com/repos/facebook/stetho/milestones{/number}","notifications_url":"https://api.github.com/repos/facebook/stetho/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/facebook/stetho/labels{/name}","releases_url":"https://api.github.com/repos/facebook/stetho/releases{/id}","created_at":"2015-01-22T22:34:10Z","updated_at":"2015-08-19T22:08:32Z","pushed_at":"2015-08-19T22:18:08Z","git_url":"git://github.com/facebook/stetho.git","ssh_url":"git@github.com:facebook/stetho.git","clone_url":"https://github.com/facebook/stetho.git","svn_url":"https://github.com/facebook/stetho","homepage":"http://facebook.github.io/stetho/","size":3482,"stargazers_count":3089,"watchers_count":3089,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":255,"mirror_url":null,"open_issues_count":31,"forks":255,"open_issues":31,"watchers":3089,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/facebook/stetho/pulls/261"},"html":{"href":"https://github.com/facebook/stetho/pull/261"},"issue":{"href":"https://api.github.com/repos/facebook/stetho/issues/261"},"comments":{"href":"https://api.github.com/repos/facebook/stetho/issues/261/comments"},"review_comments":{"href":"https://api.github.com/repos/facebook/stetho/pulls/261/comments"},"review_comment":{"href":"https://api.github.com/repos/facebook/stetho/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/facebook/stetho/pulls/261/commits"},"statuses":{"href":"https://api.github.com/repos/facebook/stetho/statuses/fcf35dc8c245603b611fa88bf96420c067d656c0"}}}}