Using Chrome DevTools to Bring Default Context Menu: Enable Copy Text

The Problem
Sometimes site owners disable right-click context menu for some reason: to disallow copy text, or to protect better user experience such as Google Drive and Dropbox:  remove browser context menu and add customized context menu.

As web developer, or hackers, we use Chrome Devtools often, especially its "Inspect Element" function, so sometimes we want to remove this limitation: to bring back the browser default context menu.

Simple Solution that Works Most Time: document.oncontextmenu = null
or document.designMode = "on"
Site owner usually add javascript like below to disable context menu: <body oncontextmenu="return false;">
Or:
document.oncontextmenu = function() {
    return false;
};
In this case, we can just execute document.oncontextmenu = null in Chrome Devtools to remove the handler.

But sometimes, things are harder. Let's take a look at how to show default context menu in Google Drive as an example.

If this doesn't work you may run the following javascript code in devtools:
window.oncontextmenu=null;;
window.onmousedown=null;
window.onkeydown=null;
window.onclick=null;

document.oncontextmenu=null;
document.onmousedown=null;
document.onkeydown=null;
document.onclick=null;

document.onselectstart=null;
Re-enable Default Context Menu in Google Drive: by Changing Definition of hca function
To restore the default browser context menu in Google Drive, we first open Chrome Devtools(Using Ctrl+Shift+I), in the bottom panel, go to search tab, type "contextmenu".

It will find matches in js file: 2222407164-doclist_modularized_core.js


Clicking one match will bring you to the line, but this js file is minified, and ubale to read. SO click on the pretty button {}, this will format the js file to make it more readable.


Then search "contextmenu" again in the button search tab. Now it will show matches in the formatted js file. 


The following code seems interesting to us. e.Yqa prevent context menu default behaviour.
e.initialize = function(a) {
    b.listen(a, "contextmenu", this.Yqa);
};
e.Yqa = function(a) {
    a.shiftKey || (a.stopPropagation(), a.preventDefault(), pCa(this, a.clientX, a.clientY, a.target))
};
Let's add a breakpoint in the e.Yqa function, right click on Google Drive, now it stops at the Yqa function. This is great.

From the Call Stack view, we can see that e.Yqa function is called by function hca.
function hca(a, b) {
    var c = a.Gn, d = a.Xd || a.src;
    a.Ooa && Ze(a);
    return c.call(d, b)
}
hca is a global function, we can change its definition in the console to change its behavior.


Check the value of parameter a, and b. Found out when we right click in Google Drive, the value of a.type is "contextmenu".

So we can change hca like below: if a.type="contextmenu", do nothing, return directly.
function hca(a, b) {
   if( a.type == "contextmenu" ) return;
    var c = a.Gn, d = a.Xd || a.src;
    a.Ooa && Ze(a);
    return c.call(d, b)
}
So every time, we want to show Chrome's default context menu in Google Drive, run the previous js code in the console to change the definition of hca. Then right click on Google Drive, it will show default context menu.

Happy hacking!!!

Resource
Don’t Disable Right Click!
Post a Comment

Labels

Java (159) Lucene-Solr (112) Interview (61) All (58) J2SE (53) Algorithm (45) Soft Skills (38) Eclipse (33) Code Example (31) Linux (25) JavaScript (23) Spring (22) Windows (22) Web Development (20) Tools (19) Nutch2 (18) Bugs (17) Debug (16) Defects (14) Text Mining (14) J2EE (13) Network (13) Troubleshooting (13) PowerShell (11) Chrome (9) Design (9) How to (9) Learning code (9) Performance (9) Problem Solving (9) UIMA (9) html (9) Http Client (8) Maven (8) Security (8) bat (8) blogger (8) Big Data (7) Continuous Integration (7) Google (7) Guava (7) JSON (7) Shell (7) ANT (6) Coding Skills (6) Database (6) Lesson Learned (6) Programmer Skills (6) Scala (6) Tips (6) css (6) Algorithm Series (5) Cache (5) Dynamic Languages (5) IDE (5) System Design (5) adsense (5) xml (5) AIX (4) Code Quality (4) GAE (4) Git (4) Good Programming Practices (4) Jackson (4) Memory Usage (4) Miscs (4) OpenNLP (4) Project Managment (4) Spark (4) Testing (4) ads (4) regular-expression (4) Android (3) Apache Spark (3) Become a Better You (3) Concurrency (3) Eclipse RCP (3) English (3) Happy Hacking (3) IBM (3) J2SE Knowledge Series (3) JAX-RS (3) Jetty (3) Restful Web Service (3) Script (3) regex (3) seo (3) .Net (2) Android Studio (2) Apache (2) Apache Procrun (2) Architecture (2) Batch (2) Bit Operation (2) Build (2) Building Scalable Web Sites (2) C# (2) C/C++ (2) CSV (2) Career (2) Cassandra (2) Distributed (2) Fiddler (2) Firefox (2) Google Drive (2) Gson (2) How to Interview (2) Html Parser (2) Http (2) Image Tools (2) JQuery (2) Jersey (2) LDAP (2) Life (2) Logging (2) Python (2) Software Issues (2) Storage (2) Text Search (2) xml parser (2) AOP (1) Application Design (1) AspectJ (1) Chrome DevTools (1) Cloud (1) Codility (1) Data Mining (1) Data Structure (1) ExceptionUtils (1) Exif (1) Feature Request (1) FindBugs (1) Greasemonkey (1) HTML5 (1) Httpd (1) I18N (1) IBM Java Thread Dump Analyzer (1) JDK Source Code (1) JDK8 (1) JMX (1) Lazy Developer (1) Mac (1) Machine Learning (1) Mobile (1) My Plan for 2010 (1) Netbeans (1) Notes (1) Operating System (1) Perl (1) Problems (1) Product Architecture (1) Programming Life (1) Quality (1) Redhat (1) Redis (1) Review (1) RxJava (1) Solutions logs (1) Team Management (1) Thread Dump Analyzer (1) Visualization (1) boilerpipe (1) htm (1) ongoing (1) procrun (1) rss (1)

Popular Posts