Скрипт приложения Google, использующий форму Materialize, возвращает ошибку «предок нарушает следующую директиву политики безопасности контента:« frame-ancestors 'self »» - PullRequest
1 голос
/ 09 мая 2020

Я использую форму Материализации в скрипте приложения Google следующим образом.

Я получаю сообщение об ошибке, если помещаю 'name = "action"' в атрибут кнопки, и это не вызывает серверную сторону функция. Я хотел бы знать, для чего это нужно и почему я получаю сообщение об ошибке.

тест. html

<!DOCTYPE html>
<html>
    <head>
    <base target="_top">
    <!--Import Google Icon Font-->
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    <script>
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);
      
      function readFile(formObject) {
        google.script.run.upload(formObject);
      }
    </script>
  </head>
  <body>
  
  <div class="container">
    <form id="myForm" onsubmit="readFile(this)" enctype="multipart/form-data">
      <input name="myFile" type="file" /><br>
      <div class="row">
           <button class="btn waves-effect waves-light" type="submit" name="action" id="btn">Submit<i class="material-icons right">send</i></button>
        </div> <!-- END OF ROW -->
        
    </form>
  </div>
  </body>
</html>

На стороне сервера:

function doGet() {
  let tmp = HtmlService.createTemplateFromFile('test');
  
  return tmp.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}


function upload(formObj) {
  Logger.log('upload called');
  Logger.log(formObj);
}

Ошибка, которую я получаю в моем журнале консоли Chrome:

Refused to frame 'https://xxxxxxx-script.googleusercontent.com/ ', поскольку предок нарушает следующую директиву политики безопасности содержимого: «frame-ancestors' self '».

и выдается NetworkError HTTP 500.

1 Ответ

0 голосов
/ 11 мая 2020

Соображение

Очевидно, что наличие хотя бы одного входа с атрибутом name, равным «action», вызовет такое поведение:

<!-- The form action attribute will change referencing the input field when passing the form Object to googe.script.run.myFunction() method-->
<!-- From this: -->
<form id="myForm" onsubmit="readFile(this)" enctype="multipart/form-data">
<!-- To this: -->
<form id="myForm" onsubmit="readFile(this)" enctype="multipart/form-data" action="[object HTMLButtonElement]" method="get" target="">

Решение

Поскольку вы не можете пройти любой другой элемент DOM на сервере, кроме объекта form, вам обязательно нужно изменить атрибут имени вашей кнопки, чтобы это работало.

Справка

Бланки HTML Сервис

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...